From ba1418799629286e316bbc90932cfadf4c267905 Mon Sep 17 00:00:00 2001
From: "Documenter.jl" <documenter@juliadocs.github.io>
Date: Fri, 28 Feb 2025 15:01:41 +0000
Subject: [PATCH] build based on d256d1d

---
 dev/.documenter-siteinfo.json           |   2 +-
 dev/api/index.html                      | 164 ++++++++++++------------
 dev/examples/cherenkov.pdf              | Bin 28588 -> 28588 bytes
 dev/examples/cherenkov_times/index.html |   2 +-
 dev/examples/controlhost/index.html     |   2 +-
 dev/examples/foo.h5                     | Bin 14937 -> 14937 bytes
 dev/examples/hdf5/index.html            |   6 +-
 dev/examples/offline_data/index.html    |   2 +-
 dev/examples/online_data/index.html     |   2 +-
 dev/examples/orientations/b6aaed3c.png  | Bin 129678 -> 0 bytes
 dev/examples/orientations/cc83a880.png  | Bin 0 -> 164758 bytes
 dev/examples/orientations/index.html    |   2 +-
 dev/index.html                          |   2 +-
 dev/manual/auxfiles/index.html          |   2 +-
 dev/manual/calibration/index.html       |   2 +-
 dev/manual/detector/index.html          |   2 +-
 dev/manual/hdf5/index.html              |   2 +-
 dev/manual/rootfiles/index.html         |  29 ++++-
 dev/manual/tools/index.html             |   2 +-
 dev/objects.inv                         | Bin 1962 -> 2054 bytes
 dev/search_index.js                     |   2 +-
 21 files changed, 125 insertions(+), 100 deletions(-)
 delete mode 100644 dev/examples/orientations/b6aaed3c.png
 create mode 100644 dev/examples/orientations/cc83a880.png

diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json
index aeb89ff9..1626edac 100644
--- a/dev/.documenter-siteinfo.json
+++ b/dev/.documenter-siteinfo.json
@@ -1 +1 @@
-{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2025-02-24T15:08:49","documenter_version":"1.8.1"}}
\ No newline at end of file
+{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2025-02-28T15:01:37","documenter_version":"1.8.1"}}
\ No newline at end of file
diff --git a/dev/api/index.html b/dev/api/index.html
index d75278f1..37d2d251 100644
--- a/dev/api/index.html
+++ b/dev/api/index.html
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>API · KM3io.jl</title><meta name="title" content="API · KM3io.jl"/><meta property="og:title" content="API · KM3io.jl"/><meta property="twitter:title" content="API · KM3io.jl"/><meta name="description" content="Documentation for KM3io.jl."/><meta property="og:description" content="Documentation for KM3io.jl."/><meta property="twitter:description" content="Documentation for KM3io.jl."/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.svg" alt="KM3io.jl logo"/></a><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Manual</span><ul><li><a class="tocitem" href="../manual/rootfiles/">ROOT Files</a></li><li><a class="tocitem" href="../manual/detector/">Detector and its Components</a></li><li><a class="tocitem" href="../manual/calibration/">Calibration</a></li><li><a class="tocitem" href="../manual/auxfiles/">Auxiliary Files</a></li><li><a class="tocitem" href="../manual/tools/">Tools</a></li></ul></li><li><span class="tocitem">Examples</span><ul><li><a class="tocitem" href="../examples/online_data/">Online data</a></li><li><a class="tocitem" href="../examples/offline_data/">Offline data</a></li><li><a class="tocitem" href="../examples/cherenkov_times/">Cherenkov times</a></li><li><a class="tocitem" href="../examples/orientations/">Orientations</a></li><li><a class="tocitem" href="../examples/controlhost/">Accessing Live Data</a></li><li><a class="tocitem" href="../examples/hdf5/">HDF5</a></li></ul></li><li class="is-active"><a class="tocitem" href>API</a><ul class="internal"><li><a class="tocitem" href="#Basic-Data-Structures"><span>Basic Data Structures</span></a></li><li><a class="tocitem" href="#Offline-Format"><span>Offline Format</span></a></li><li><a class="tocitem" href="#Online-Format"><span>Online Format</span></a></li><li><a class="tocitem" href="#HDF5"><span>HDF5</span></a></li><li><a class="tocitem" href="#Hardware"><span>Hardware</span></a></li><li><a class="tocitem" href="#Optical-Data"><span>Optical Data</span></a></li><li><a class="tocitem" href="#Acoustics"><span>Acoustics</span></a></li><li><a class="tocitem" href="#Calibration"><span>Calibration</span></a></li><li><a class="tocitem" href="#Physics"><span>Physics</span></a></li><li><a class="tocitem" href="#Trigger"><span>Trigger</span></a></li><li><a class="tocitem" href="#ControlHost"><span>ControlHost</span></a></li><li><a class="tocitem" href="#Tools"><span>Tools</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>API</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>API</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl/blob/main/docs/src/api.md#L" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="API"><a class="docs-heading-anchor" href="#API">API</a><a id="API-1"></a><a class="docs-heading-anchor-permalink" href="#API" title="Permalink"></a></h1><ul><li><a href="#KM3io.AcousticSignal"><code>KM3io.AcousticSignal</code></a></li><li><a href="#KM3io.AcousticsTriggerParameter"><code>KM3io.AcousticsTriggerParameter</code></a></li><li><a href="#KM3io.CHClient"><code>KM3io.CHClient</code></a></li><li><a href="#KM3io.CalibratedHit"><code>KM3io.CalibratedHit</code></a></li><li><a href="#KM3io.CalibratedMCHit"><code>KM3io.CalibratedMCHit</code></a></li><li><a href="#KM3io.CalibratedSnapshotHit"><code>KM3io.CalibratedSnapshotHit</code></a></li><li><a href="#KM3io.CalibratedTriggeredHit"><code>KM3io.CalibratedTriggeredHit</code></a></li><li><a href="#KM3io.CherenkovPhoton"><code>KM3io.CherenkovPhoton</code></a></li><li><a href="#KM3io.Compass"><code>KM3io.Compass</code></a></li><li><a href="#KM3io.DAQEvent"><code>KM3io.DAQEvent</code></a></li><li><a href="#KM3io.Detector"><code>KM3io.Detector</code></a></li><li><a href="#KM3io.DetectorModule"><code>KM3io.DetectorModule</code></a></li><li><a href="#KM3io.Direction"><code>KM3io.Direction</code></a></li><li><a href="#KM3io.EventHeader"><code>KM3io.EventHeader</code></a></li><li><a href="#KM3io.Evt"><code>KM3io.Evt</code></a></li><li><a href="#KM3io.FitInformation"><code>KM3io.FitInformation</code></a></li><li><a href="#KM3io.H5CompoundDataset"><code>KM3io.H5CompoundDataset</code></a></li><li><a href="#KM3io.H5File"><code>KM3io.H5File</code></a></li><li><a href="#KM3io.Hydrophone"><code>KM3io.Hydrophone</code></a></li><li><a href="#KM3io.K40Rates"><code>KM3io.K40Rates</code></a></li><li><a href="#KM3io.Location"><code>KM3io.Location</code></a></li><li><a href="#KM3io.MCTrk"><code>KM3io.MCTrk</code></a></li><li><a href="#KM3io.Orientations"><code>KM3io.Orientations</code></a></li><li><a href="#KM3io.PMT"><code>KM3io.PMT</code></a></li><li><a href="#KM3io.PMTData"><code>KM3io.PMTData</code></a></li><li><a href="#KM3io.PMTFile"><code>KM3io.PMTFile</code></a></li><li><a href="#KM3io.Position"><code>KM3io.Position</code></a></li><li><a href="#KM3io.Quaternion"><code>KM3io.Quaternion</code></a></li><li><a href="#KM3io.RecStageRange"><code>KM3io.RecStageRange</code></a></li><li><a href="#KM3io.SnapshotHit"><code>KM3io.SnapshotHit</code></a></li><li><a href="#KM3io.StringMechanics"><code>KM3io.StringMechanics</code></a></li><li><a href="#KM3io.StringMechanicsParameters"><code>KM3io.StringMechanicsParameters</code></a></li><li><a href="#KM3io.SummaryFrame"><code>KM3io.SummaryFrame</code></a></li><li><a href="#KM3io.Summaryslice"><code>KM3io.Summaryslice</code></a></li><li><a href="#KM3io.SummarysliceHeader"><code>KM3io.SummarysliceHeader</code></a></li><li><a href="#KM3io.SummarysliceIntervalIterator"><code>KM3io.SummarysliceIntervalIterator</code></a></li><li><a href="#KM3io.TriggeredHit"><code>KM3io.TriggeredHit</code></a></li><li><a href="#KM3io.Tripod"><code>KM3io.Tripod</code></a></li><li><a href="#KM3io.Trk"><code>KM3io.Trk</code></a></li><li><a href="#KM3io.UTCExtended"><code>KM3io.UTCExtended</code></a></li><li><a href="#KM3io.UTCTime"><code>KM3io.UTCTime</code></a></li><li><a href="#KM3io.Waveform"><code>KM3io.Waveform</code></a></li><li><a href="#KM3io.XCalibratedHit"><code>KM3io.XCalibratedHit</code></a></li><li><a href="#Base.angle"><code>Base.angle</code></a></li><li><a href="#Base.flush"><code>Base.flush</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{StringMechanics}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{Waveform}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{Tripod}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{Hydrophone}}"><code>Base.read</code></a></li><li><a href="#Base.write-Tuple{IO, Detector}"><code>Base.write</code></a></li><li><a href="#Base.write-Tuple{AbstractString, Detector}"><code>Base.write</code></a></li><li><a href="#Base.write-Tuple{AbstractString, Vector{Tripod}}"><code>Base.write</code></a></li><li><a href="#HDF5.create_dataset"><code>HDF5.create_dataset</code></a></li><li><a href="#KM3io.addmeta"><code>KM3io.addmeta</code></a></li><li><a href="#KM3io.azimuth"><code>KM3io.azimuth</code></a></li><li><a href="#KM3io.bestaashower"><code>KM3io.bestaashower</code></a></li><li><a href="#KM3io.bestjppmuon"><code>KM3io.bestjppmuon</code></a></li><li><a href="#KM3io.bestjppshower"><code>KM3io.bestjppshower</code></a></li><li><a href="#KM3io.besttrack"><code>KM3io.besttrack</code></a></li><li><a href="#KM3io.calibrate"><code>KM3io.calibrate</code></a></li><li><a href="#KM3io.calibratetime"><code>KM3io.calibratetime</code></a></li><li><a href="#KM3io.categorize"><code>KM3io.categorize</code></a></li><li><a href="#KM3io.center"><code>KM3io.center</code></a></li><li><a href="#KM3io.cherenkov"><code>KM3io.cherenkov</code></a></li><li><a href="#KM3io.combine"><code>KM3io.combine</code></a></li><li><a href="#KM3io.count_active_channels"><code>KM3io.count_active_channels</code></a></li><li><a href="#KM3io.count_fifostatus"><code>KM3io.count_fifostatus</code></a></li><li><a href="#KM3io.count_hrvstatus"><code>KM3io.count_hrvstatus</code></a></li><li><a href="#KM3io.distance"><code>KM3io.distance</code></a></li><li><a href="#KM3io.fifostatus"><code>KM3io.fifostatus</code></a></li><li><a href="#KM3io.floordist"><code>KM3io.floordist</code></a></li><li><a href="#KM3io.getevent"><code>KM3io.getevent</code></a></li><li><a href="#KM3io.getmodule"><code>KM3io.getmodule</code></a></li><li><a href="#KM3io.getpmt"><code>KM3io.getpmt</code></a></li><li><a href="#KM3io.hashistory"><code>KM3io.hashistory</code></a></li><li><a href="#KM3io.haslocation"><code>KM3io.haslocation</code></a></li><li><a href="#KM3io.hasstring"><code>KM3io.hasstring</code></a></li><li><a href="#KM3io.hasudptrailer"><code>KM3io.hasudptrailer</code></a></li><li><a href="#KM3io.hrvstatus"><code>KM3io.hrvstatus</code></a></li><li><a href="#KM3io.hydrophoneenabled"><code>KM3io.hydrophoneenabled</code></a></li><li><a href="#KM3io.is3dmuon"><code>KM3io.is3dmuon</code></a></li><li><a href="#KM3io.is3dshower"><code>KM3io.is3dshower</code></a></li><li><a href="#KM3io.isbasemodule"><code>KM3io.isbasemodule</code></a></li><li><a href="#KM3io.ismxshower"><code>KM3io.ismxshower</code></a></li><li><a href="#KM3io.isnb"><code>KM3io.isnb</code></a></li><li><a href="#KM3io.isopticalmodule"><code>KM3io.isopticalmodule</code></a></li><li><a href="#KM3io.maximal_udp_sequence_number"><code>KM3io.maximal_udp_sequence_number</code></a></li><li><a href="#KM3io.modules"><code>KM3io.modules</code></a></li><li><a href="#KM3io.most_frequent"><code>KM3io.most_frequent</code></a></li><li><a href="#KM3io.nthbitset"><code>KM3io.nthbitset</code></a></li><li><a href="#KM3io.number_of_udp_packets_received"><code>KM3io.number_of_udp_packets_received</code></a></li><li><a href="#KM3io.phi"><code>KM3io.phi</code></a></li><li><a href="#KM3io.piezoenabled"><code>KM3io.piezoenabled</code></a></li><li><a href="#KM3io.pmtrate"><code>KM3io.pmtrate</code></a></li><li><a href="#KM3io.pmtrates"><code>KM3io.pmtrates</code></a></li><li><a href="#KM3io.slerp"><code>KM3io.slerp</code></a></li><li><a href="#KM3io.slew"><code>KM3io.slew</code></a></li><li><a href="#KM3io.status"><code>KM3io.status</code></a></li><li><a href="#KM3io.tdcstatus"><code>KM3io.tdcstatus</code></a></li><li><a href="#KM3io.theta"><code>KM3io.theta</code></a></li><li><a href="#KM3io.triggered"><code>KM3io.triggered</code></a></li><li><a href="#KM3io.wrstatus"><code>KM3io.wrstatus</code></a></li><li><a href="#KM3io.zenith"><code>KM3io.zenith</code></a></li></ul><h2 id="Basic-Data-Structures"><a class="docs-heading-anchor" href="#Basic-Data-Structures">Basic Data Structures</a><a id="Basic-Data-Structures-1"></a><a class="docs-heading-anchor-permalink" href="#Basic-Data-Structures" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Position" href="#KM3io.Position"><code>KM3io.Position</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Position{T} &lt;: StaticArraysCore.FieldVector{3, T}</code></pre><p>A vector to represent a position in 3D.</p><p><strong>Fields</strong></p><ul><li><p><code>x::Any</code></p></li><li><p><code>y::Any</code></p></li><li><p><code>z::Any</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL7">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Direction" href="#KM3io.Direction"><code>KM3io.Direction</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Direction{T&lt;:AbstractFloat} &lt;: StaticArraysCore.FieldVector{3, T&lt;:AbstractFloat}</code></pre><p>A vector to represent a direction in 3D.</p><p><strong>Fields</strong></p><ul><li><p><code>x::AbstractFloat</code></p></li><li><p><code>y::AbstractFloat</code></p></li><li><p><code>z::AbstractFloat</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL16">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Location" href="#KM3io.Location"><code>KM3io.Location</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Location</code></pre><p>A module&#39;s location in the detector where string represents the detection unit identifier and floor counts from 0 from the bottom to top. Base modules are sitting on floor 0 and optical modules on floor 1 and higher.</p><p><strong>Fields</strong></p><ul><li><p><code>string::Int32</code></p></li><li><p><code>floor::Int8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL27">source</a></section></article><h2 id="Offline-Format"><a class="docs-heading-anchor" href="#Offline-Format">Offline Format</a><a id="Offline-Format-1"></a><a class="docs-heading-anchor-permalink" href="#Offline-Format" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Evt" href="#KM3io.Evt"><code>KM3io.Evt</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Evt</code></pre><p>An offline event.</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int64</code></p></li><li><p><code>det_id::Int64</code></p></li><li><p><code>mc_id::Int64</code></p></li><li><p><code>run_id::Int64</code></p></li><li><p><code>mc_run_id::Int64</code></p></li><li><p><code>frame_index::Int64</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>trigger_counter::UInt64</code></p></li><li><p><code>overlays::UInt64</code></p></li><li><p><code>t::UTCTime</code></p></li><li><p><code>hits::Vector{CalibratedHit}</code></p></li><li><p><code>trks::Vector{Trk}</code></p></li><li><p><code>w::Vector{Float64}</code></p></li><li><p><code>w2list::Vector{Float64}</code></p></li><li><p><code>w3list::Vector{Float64}</code></p></li><li><p><code>mc_event_time::UTCTime</code></p></li><li><p><code>mc_t::Float64</code></p></li><li><p><code>mc_hits::Vector{CalibratedMCHit}</code></p></li><li><p><code>mc_trks::Vector{MCTrk}</code></p></li><li><p><code>index::Int64</code></p></li><li><p><code>flags::Int64</code></p></li><li><p><code>usr::Dict{String, Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/offline.jl#LL99">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedHit" href="#KM3io.CalibratedHit"><code>KM3io.CalibratedHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedHit &lt;: AbstractCalibratedHit</code></pre><p>A calibrated hit of the offline dataformat. Caveat: the <code>position</code>, <code>direction</code> and <code>t</code> fields might still be <code>0</code> due to the design philosophy of the offline format (one class for all).</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>channel_id::UInt32</code></p></li><li><p><code>tdc::UInt32</code></p></li><li><p><code>tot::UInt32</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/offline.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedMCHit" href="#KM3io.CalibratedMCHit"><code>KM3io.CalibratedMCHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedMCHit &lt;: KM3io.AbstractCalibratedMCHit</code></pre><p>A calibrated MC hit of the offline dataformat. Caveat: the <code>position</code> and <code>direction</code> fields might still be <code>0</code> due to the design philosophy of the offline format (one class for all).</p><p><strong>Fields</strong></p><ul><li><p><code>pmt_id::Int32</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>a::Float64</code></p></li><li><p><code>type::Int32</code></p></li><li><p><code>origin::Int32</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/offline.jl#LL21">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.XCalibratedHit" href="#KM3io.XCalibratedHit"><code>KM3io.XCalibratedHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct XCalibratedHit &lt;: AbstractCalibratedHit</code></pre><p>A fully dressed hit with all calibration information which can be obtained. This structure is similar to the Hit structure in aanet and should be used wisely. Most of the time it&#39;s much more performant to use dedicated (simplified) structures.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt32</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>tot::UInt8</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t0::Float64</code></p></li><li><p><code>string::UInt8</code></p></li><li><p><code>floor::UInt8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL106">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Trk" href="#KM3io.Trk"><code>KM3io.Trk</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Trk</code></pre><p>Represents a reconstructed &quot;track&quot;, which can be e.g. a muon track but also a shower.</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>E::Float64</code></p></li><li><p><code>len::Float64</code></p></li><li><p><code>lik::Float64</code></p></li><li><p><code>rec_type::Int32</code></p></li><li><p><code>rec_stages::Vector{Int32}</code></p></li><li><p><code>fitinf::FitInformation</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/offline.jl#LL67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.MCTrk" href="#KM3io.MCTrk"><code>KM3io.MCTrk</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct MCTrk</code></pre><p>A simulated (Monte Carlo, hence &quot;MC&quot;) track (or shower).</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>E::Float64</code></p></li><li><p><code>len::Float64</code></p></li><li><p><code>type::Int32</code></p></li><li><p><code>status::Int32</code></p></li><li><p><code>mother_id::Int32</code></p></li><li><p><code>counter::Int32</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/offline.jl#LL83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.FitInformation" href="#KM3io.FitInformation"><code>KM3io.FitInformation</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct FitInformation</code></pre><p>A container object to store fit information which uses 0-based indexing. It implements the array interface. The entries is this vector are float values and their position encodes the meaning of their meaning which is defined in the <a href="https://git.km3net.de/common/km3net-dataformat">KM3NeT DataFormat</a></p><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>The elements of this object should always be accessed using constants defined in <code>KM3io.FITINFORMATION</code>. The use of magic numbers should be avoided to ensure that future changes in the <a href="https://git.km3net.de/common/km3net-dataformat">KM3NeT DataFormat</a> do not break existing code.</p></div></div><p><strong>Fields</strong></p><ul><li><code>values::Vector{Float64}</code></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/offline.jl#LL40">source</a></section></article><h2 id="Online-Format"><a class="docs-heading-anchor" href="#Online-Format">Online Format</a><a id="Online-Format-1"></a><a class="docs-heading-anchor-permalink" href="#Online-Format" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.DAQEvent" href="#KM3io.DAQEvent"><code>KM3io.DAQEvent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct DAQEvent</code></pre><p>A (triggered) event holding snapshot hits and triggered hits. The triggered hits are a subset of the snapshot hits.</p><p><strong>Fields</strong></p><ul><li><p><code>header::EventHeader</code></p></li><li><p><code>snapshot_hits::Vector{SnapshotHit}</code></p></li><li><p><code>triggered_hits::Vector{TriggeredHit}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL203">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.EventHeader" href="#KM3io.EventHeader"><code>KM3io.EventHeader</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct EventHeader</code></pre><p>The header of an event.</p><p><strong>Fields</strong></p><ul><li><p><code>detector_id::Int32</code></p></li><li><p><code>run::Int32</code></p></li><li><p><code>frame_index::Int32</code></p></li><li><p><code>t::UTCExtended</code></p></li><li><p><code>trigger_counter::UInt64</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>overlays::UInt32</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL188">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SnapshotHit" href="#KM3io.SnapshotHit"><code>KM3io.SnapshotHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SnapshotHit &lt;: KM3io.AbstractDAQHit</code></pre><p>A snapshot hit.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Int32</code></p></li><li><p><code>tot::UInt8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL55">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.TriggeredHit" href="#KM3io.TriggeredHit"><code>KM3io.TriggeredHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct TriggeredHit &lt;: KM3io.AbstractDAQHit</code></pre><p>A hit which was triggered.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Int32</code></p></li><li><p><code>tot::UInt8</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL79">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedSnapshotHit" href="#KM3io.CalibratedSnapshotHit"><code>KM3io.CalibratedSnapshotHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedSnapshotHit &lt;: AbstractCalibratedHit</code></pre><p>A calibrated snapshot hit.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>tot::UInt8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedTriggeredHit" href="#KM3io.CalibratedTriggeredHit"><code>KM3io.CalibratedTriggeredHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedTriggeredHit &lt;: AbstractCalibratedHit</code></pre><p>A calibrated triggered hit.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>tot::UInt8</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL92">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.UTCTime" href="#KM3io.UTCTime"><code>KM3io.UTCTime</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct UTCTime</code></pre><p>A basic time structure with seconds and nanoseconds. The seconds are counting from the start of the epoch, just like the UNIX time.</p><p><strong>Fields</strong></p><ul><li><p><code>s::UInt64</code></p></li><li><p><code>ns::UInt64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL127">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.UTCExtended" href="#KM3io.UTCExtended"><code>KM3io.UTCExtended</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct UTCExtended</code></pre><p>An extended time structure which contains the White Rabbit time synchronisation status. <code>wr_status == 0</code> means that the synchronisation is OK.</p><p><strong>Fields</strong></p><ul><li><p><code>s::UInt32</code></p></li><li><p><code>ns::UInt32</code></p></li><li><p><code>wr_status::Int64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Summaryslice" href="#KM3io.Summaryslice"><code>KM3io.Summaryslice</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Summaryslice</code></pre><p>A summaryslice is a condensed timeslice with the header information of the corresponding timeslice and a summary frame for each optical module. The hit information of the original timeslice is reduced so that for each PMT a single byte is used to encode the hit rate.</p><p><strong>Fields</strong></p><ul><li><p><code>header::SummarysliceHeader</code></p></li><li><p><code>frames::Vector{SummaryFrame}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/online.jl#LL104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SummarysliceHeader" href="#KM3io.SummarysliceHeader"><code>KM3io.SummarysliceHeader</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SummarysliceHeader</code></pre><p>The header of a summaryslice.</p><p><strong>Fields</strong></p><ul><li><p><code>detector_id::Int32</code></p></li><li><p><code>run::Int32</code></p></li><li><p><code>frame_index::Int32</code></p></li><li><p><code>t::UTCExtended</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SummaryFrame" href="#KM3io.SummaryFrame"><code>KM3io.SummaryFrame</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SummaryFrame</code></pre><p>A <code>SummaryFrame</code> contains reduced timeslice data from an optical module.</p><p>The PMT <code>rates</code> are encoded as single bytes and can be converted to real hit rates using the <code>rates(s::SummaryFrame)</code> function.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>daq::UInt32</code></p></li><li><p><code>status::UInt32</code></p></li><li><p><code>fifo::UInt32</code></p></li><li><p><code>status3::UInt32</code></p></li><li><p><code>status4::UInt32</code></p></li><li><p><code>rates::StaticArraysCore.SVector{31, UInt8}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL158">source</a></section></article><h2 id="HDF5"><a class="docs-heading-anchor" href="#HDF5">HDF5</a><a id="HDF5-1"></a><a class="docs-heading-anchor-permalink" href="#HDF5" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.H5File" href="#KM3io.H5File"><code>KM3io.H5File</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct H5File</code></pre><p>A wrapper for an HDF5 file used in KM3NeT.</p><p><strong>Fields</strong></p><ul><li><p><code>_h5f::HDF5.File</code></p></li><li><p><code>_datasets::Dict{String, H5CompoundDataset}</code></p></li><li><p><code>_lock::ReentrantLock</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hdf5/hdf5.jl#LL39">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.H5CompoundDataset" href="#KM3io.H5CompoundDataset"><code>KM3io.H5CompoundDataset</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct H5CompoundDataset{T}</code></pre><p>A flat HDF5 compound dataset which is essentially a vector of structs. It has a cache which is filled when elements are pushed to it. The cache is automatically written to the target HDF5 path when full.</p><p><strong>Fields</strong></p><ul><li><p><code>dset::HDF5.Dataset</code></p></li><li><p><code>cache::KM3io.H5CompoundDatasetCache</code></p></li><li><p><code>_lock::ReentrantLock</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hdf5/hdf5.jl#LL6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.addmeta" href="#KM3io.addmeta"><code>KM3io.addmeta</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">addmeta(
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>API · KM3io.jl</title><meta name="title" content="API · KM3io.jl"/><meta property="og:title" content="API · KM3io.jl"/><meta property="twitter:title" content="API · KM3io.jl"/><meta name="description" content="Documentation for KM3io.jl."/><meta property="og:description" content="Documentation for KM3io.jl."/><meta property="twitter:description" content="Documentation for KM3io.jl."/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img src="../assets/logo.svg" alt="KM3io.jl logo"/></a><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><span class="tocitem">Manual</span><ul><li><a class="tocitem" href="../manual/rootfiles/">ROOT Files</a></li><li><a class="tocitem" href="../manual/detector/">Detector and its Components</a></li><li><a class="tocitem" href="../manual/calibration/">Calibration</a></li><li><a class="tocitem" href="../manual/auxfiles/">Auxiliary Files</a></li><li><a class="tocitem" href="../manual/tools/">Tools</a></li></ul></li><li><span class="tocitem">Examples</span><ul><li><a class="tocitem" href="../examples/online_data/">Online data</a></li><li><a class="tocitem" href="../examples/offline_data/">Offline data</a></li><li><a class="tocitem" href="../examples/cherenkov_times/">Cherenkov times</a></li><li><a class="tocitem" href="../examples/orientations/">Orientations</a></li><li><a class="tocitem" href="../examples/controlhost/">Accessing Live Data</a></li><li><a class="tocitem" href="../examples/hdf5/">HDF5</a></li></ul></li><li class="is-active"><a class="tocitem" href>API</a><ul class="internal"><li><a class="tocitem" href="#Basic-Data-Structures"><span>Basic Data Structures</span></a></li><li><a class="tocitem" href="#Offline-Format"><span>Offline Format</span></a></li><li><a class="tocitem" href="#Online-Format"><span>Online Format</span></a></li><li><a class="tocitem" href="#Oscillations-Open-Data"><span>Oscillations Open Data</span></a></li><li><a class="tocitem" href="#HDF5"><span>HDF5</span></a></li><li><a class="tocitem" href="#Hardware"><span>Hardware</span></a></li><li><a class="tocitem" href="#Optical-Data"><span>Optical Data</span></a></li><li><a class="tocitem" href="#Acoustics"><span>Acoustics</span></a></li><li><a class="tocitem" href="#Calibration"><span>Calibration</span></a></li><li><a class="tocitem" href="#Physics"><span>Physics</span></a></li><li><a class="tocitem" href="#Trigger"><span>Trigger</span></a></li><li><a class="tocitem" href="#ControlHost"><span>ControlHost</span></a></li><li><a class="tocitem" href="#Tools"><span>Tools</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>API</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>API</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl/blob/main/docs/src/api.md#L" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="API"><a class="docs-heading-anchor" href="#API">API</a><a id="API-1"></a><a class="docs-heading-anchor-permalink" href="#API" title="Permalink"></a></h1><ul><li><a href="#KM3io.AcousticSignal"><code>KM3io.AcousticSignal</code></a></li><li><a href="#KM3io.AcousticsTriggerParameter"><code>KM3io.AcousticsTriggerParameter</code></a></li><li><a href="#KM3io.CHClient"><code>KM3io.CHClient</code></a></li><li><a href="#KM3io.CalibratedHit"><code>KM3io.CalibratedHit</code></a></li><li><a href="#KM3io.CalibratedMCHit"><code>KM3io.CalibratedMCHit</code></a></li><li><a href="#KM3io.CalibratedSnapshotHit"><code>KM3io.CalibratedSnapshotHit</code></a></li><li><a href="#KM3io.CalibratedTriggeredHit"><code>KM3io.CalibratedTriggeredHit</code></a></li><li><a href="#KM3io.CherenkovPhoton"><code>KM3io.CherenkovPhoton</code></a></li><li><a href="#KM3io.Compass"><code>KM3io.Compass</code></a></li><li><a href="#KM3io.DAQEvent"><code>KM3io.DAQEvent</code></a></li><li><a href="#KM3io.Detector"><code>KM3io.Detector</code></a></li><li><a href="#KM3io.DetectorModule"><code>KM3io.DetectorModule</code></a></li><li><a href="#KM3io.Direction"><code>KM3io.Direction</code></a></li><li><a href="#KM3io.EventHeader"><code>KM3io.EventHeader</code></a></li><li><a href="#KM3io.Evt"><code>KM3io.Evt</code></a></li><li><a href="#KM3io.FitInformation"><code>KM3io.FitInformation</code></a></li><li><a href="#KM3io.H5CompoundDataset"><code>KM3io.H5CompoundDataset</code></a></li><li><a href="#KM3io.H5File"><code>KM3io.H5File</code></a></li><li><a href="#KM3io.Hydrophone"><code>KM3io.Hydrophone</code></a></li><li><a href="#KM3io.K40Rates"><code>KM3io.K40Rates</code></a></li><li><a href="#KM3io.Location"><code>KM3io.Location</code></a></li><li><a href="#KM3io.MCTrk"><code>KM3io.MCTrk</code></a></li><li><a href="#KM3io.OSCFile"><code>KM3io.OSCFile</code></a></li><li><a href="#KM3io.Orientations"><code>KM3io.Orientations</code></a></li><li><a href="#KM3io.OscOpenDataTree"><code>KM3io.OscOpenDataTree</code></a></li><li><a href="#KM3io.OscillationsData"><code>KM3io.OscillationsData</code></a></li><li><a href="#KM3io.PMT"><code>KM3io.PMT</code></a></li><li><a href="#KM3io.PMTData"><code>KM3io.PMTData</code></a></li><li><a href="#KM3io.PMTFile"><code>KM3io.PMTFile</code></a></li><li><a href="#KM3io.Position"><code>KM3io.Position</code></a></li><li><a href="#KM3io.Quaternion"><code>KM3io.Quaternion</code></a></li><li><a href="#KM3io.RecStageRange"><code>KM3io.RecStageRange</code></a></li><li><a href="#KM3io.ResponseMatrixBin"><code>KM3io.ResponseMatrixBin</code></a></li><li><a href="#KM3io.ResponseMatrixBinData"><code>KM3io.ResponseMatrixBinData</code></a></li><li><a href="#KM3io.ResponseMatrixBinMuons"><code>KM3io.ResponseMatrixBinMuons</code></a></li><li><a href="#KM3io.ResponseMatrixBinNeutrinos"><code>KM3io.ResponseMatrixBinNeutrinos</code></a></li><li><a href="#KM3io.SnapshotHit"><code>KM3io.SnapshotHit</code></a></li><li><a href="#KM3io.StringMechanics"><code>KM3io.StringMechanics</code></a></li><li><a href="#KM3io.StringMechanicsParameters"><code>KM3io.StringMechanicsParameters</code></a></li><li><a href="#KM3io.SummaryFrame"><code>KM3io.SummaryFrame</code></a></li><li><a href="#KM3io.Summaryslice"><code>KM3io.Summaryslice</code></a></li><li><a href="#KM3io.SummarysliceHeader"><code>KM3io.SummarysliceHeader</code></a></li><li><a href="#KM3io.SummarysliceIntervalIterator"><code>KM3io.SummarysliceIntervalIterator</code></a></li><li><a href="#KM3io.TriggeredHit"><code>KM3io.TriggeredHit</code></a></li><li><a href="#KM3io.Tripod"><code>KM3io.Tripod</code></a></li><li><a href="#KM3io.Trk"><code>KM3io.Trk</code></a></li><li><a href="#KM3io.UTCExtended"><code>KM3io.UTCExtended</code></a></li><li><a href="#KM3io.UTCTime"><code>KM3io.UTCTime</code></a></li><li><a href="#KM3io.Waveform"><code>KM3io.Waveform</code></a></li><li><a href="#KM3io.XCalibratedHit"><code>KM3io.XCalibratedHit</code></a></li><li><a href="#Base.angle"><code>Base.angle</code></a></li><li><a href="#Base.flush"><code>Base.flush</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{StringMechanics}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{Tripod}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{Waveform}}"><code>Base.read</code></a></li><li><a href="#Base.read-Tuple{AbstractString, Type{Hydrophone}}"><code>Base.read</code></a></li><li><a href="#Base.write-Tuple{IO, Detector}"><code>Base.write</code></a></li><li><a href="#Base.write-Tuple{AbstractString, Detector}"><code>Base.write</code></a></li><li><a href="#Base.write-Tuple{AbstractString, Vector{Tripod}}"><code>Base.write</code></a></li><li><a href="#HDF5.create_dataset"><code>HDF5.create_dataset</code></a></li><li><a href="#KM3io.addmeta"><code>KM3io.addmeta</code></a></li><li><a href="#KM3io.azimuth"><code>KM3io.azimuth</code></a></li><li><a href="#KM3io.bestaashower"><code>KM3io.bestaashower</code></a></li><li><a href="#KM3io.bestjppmuon"><code>KM3io.bestjppmuon</code></a></li><li><a href="#KM3io.bestjppshower"><code>KM3io.bestjppshower</code></a></li><li><a href="#KM3io.besttrack"><code>KM3io.besttrack</code></a></li><li><a href="#KM3io.calibrate"><code>KM3io.calibrate</code></a></li><li><a href="#KM3io.calibratetime"><code>KM3io.calibratetime</code></a></li><li><a href="#KM3io.categorize"><code>KM3io.categorize</code></a></li><li><a href="#KM3io.center"><code>KM3io.center</code></a></li><li><a href="#KM3io.cherenkov"><code>KM3io.cherenkov</code></a></li><li><a href="#KM3io.combine"><code>KM3io.combine</code></a></li><li><a href="#KM3io.count_active_channels"><code>KM3io.count_active_channels</code></a></li><li><a href="#KM3io.count_fifostatus"><code>KM3io.count_fifostatus</code></a></li><li><a href="#KM3io.count_hrvstatus"><code>KM3io.count_hrvstatus</code></a></li><li><a href="#KM3io.distance"><code>KM3io.distance</code></a></li><li><a href="#KM3io.fifostatus"><code>KM3io.fifostatus</code></a></li><li><a href="#KM3io.floordist"><code>KM3io.floordist</code></a></li><li><a href="#KM3io.getevent"><code>KM3io.getevent</code></a></li><li><a href="#KM3io.getmodule"><code>KM3io.getmodule</code></a></li><li><a href="#KM3io.getpmt"><code>KM3io.getpmt</code></a></li><li><a href="#KM3io.hashistory"><code>KM3io.hashistory</code></a></li><li><a href="#KM3io.haslocation"><code>KM3io.haslocation</code></a></li><li><a href="#KM3io.hasstring"><code>KM3io.hasstring</code></a></li><li><a href="#KM3io.hasudptrailer"><code>KM3io.hasudptrailer</code></a></li><li><a href="#KM3io.hrvstatus"><code>KM3io.hrvstatus</code></a></li><li><a href="#KM3io.hydrophoneenabled"><code>KM3io.hydrophoneenabled</code></a></li><li><a href="#KM3io.is3dmuon"><code>KM3io.is3dmuon</code></a></li><li><a href="#KM3io.is3dshower"><code>KM3io.is3dshower</code></a></li><li><a href="#KM3io.isbasemodule"><code>KM3io.isbasemodule</code></a></li><li><a href="#KM3io.ismxshower"><code>KM3io.ismxshower</code></a></li><li><a href="#KM3io.isnb"><code>KM3io.isnb</code></a></li><li><a href="#KM3io.isopticalmodule"><code>KM3io.isopticalmodule</code></a></li><li><a href="#KM3io.maximal_udp_sequence_number"><code>KM3io.maximal_udp_sequence_number</code></a></li><li><a href="#KM3io.modules"><code>KM3io.modules</code></a></li><li><a href="#KM3io.most_frequent"><code>KM3io.most_frequent</code></a></li><li><a href="#KM3io.nthbitset"><code>KM3io.nthbitset</code></a></li><li><a href="#KM3io.number_of_udp_packets_received"><code>KM3io.number_of_udp_packets_received</code></a></li><li><a href="#KM3io.phi"><code>KM3io.phi</code></a></li><li><a href="#KM3io.piezoenabled"><code>KM3io.piezoenabled</code></a></li><li><a href="#KM3io.pmtrate"><code>KM3io.pmtrate</code></a></li><li><a href="#KM3io.pmtrates"><code>KM3io.pmtrates</code></a></li><li><a href="#KM3io.slerp"><code>KM3io.slerp</code></a></li><li><a href="#KM3io.slew"><code>KM3io.slew</code></a></li><li><a href="#KM3io.status"><code>KM3io.status</code></a></li><li><a href="#KM3io.tdcstatus"><code>KM3io.tdcstatus</code></a></li><li><a href="#KM3io.theta"><code>KM3io.theta</code></a></li><li><a href="#KM3io.triggered"><code>KM3io.triggered</code></a></li><li><a href="#KM3io.wrstatus"><code>KM3io.wrstatus</code></a></li><li><a href="#KM3io.zenith"><code>KM3io.zenith</code></a></li></ul><h2 id="Basic-Data-Structures"><a class="docs-heading-anchor" href="#Basic-Data-Structures">Basic Data Structures</a><a id="Basic-Data-Structures-1"></a><a class="docs-heading-anchor-permalink" href="#Basic-Data-Structures" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Position" href="#KM3io.Position"><code>KM3io.Position</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Position{T} &lt;: StaticArraysCore.FieldVector{3, T}</code></pre><p>A vector to represent a position in 3D.</p><p><strong>Fields</strong></p><ul><li><p><code>x::Any</code></p></li><li><p><code>y::Any</code></p></li><li><p><code>z::Any</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL7">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Direction" href="#KM3io.Direction"><code>KM3io.Direction</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Direction{T&lt;:AbstractFloat} &lt;: StaticArraysCore.FieldVector{3, T&lt;:AbstractFloat}</code></pre><p>A vector to represent a direction in 3D.</p><p><strong>Fields</strong></p><ul><li><p><code>x::AbstractFloat</code></p></li><li><p><code>y::AbstractFloat</code></p></li><li><p><code>z::AbstractFloat</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL16">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Location" href="#KM3io.Location"><code>KM3io.Location</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Location</code></pre><p>A module&#39;s location in the detector where string represents the detection unit identifier and floor counts from 0 from the bottom to top. Base modules are sitting on floor 0 and optical modules on floor 1 and higher.</p><p><strong>Fields</strong></p><ul><li><p><code>string::Int32</code></p></li><li><p><code>floor::Int8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL27">source</a></section></article><h2 id="Offline-Format"><a class="docs-heading-anchor" href="#Offline-Format">Offline Format</a><a id="Offline-Format-1"></a><a class="docs-heading-anchor-permalink" href="#Offline-Format" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Evt" href="#KM3io.Evt"><code>KM3io.Evt</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Evt</code></pre><p>An offline event.</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int64</code></p></li><li><p><code>det_id::Int64</code></p></li><li><p><code>mc_id::Int64</code></p></li><li><p><code>run_id::Int64</code></p></li><li><p><code>mc_run_id::Int64</code></p></li><li><p><code>frame_index::Int64</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>trigger_counter::UInt64</code></p></li><li><p><code>overlays::UInt64</code></p></li><li><p><code>t::UTCTime</code></p></li><li><p><code>hits::Vector{CalibratedHit}</code></p></li><li><p><code>trks::Vector{Trk}</code></p></li><li><p><code>w::Vector{Float64}</code></p></li><li><p><code>w2list::Vector{Float64}</code></p></li><li><p><code>w3list::Vector{Float64}</code></p></li><li><p><code>mc_event_time::UTCTime</code></p></li><li><p><code>mc_t::Float64</code></p></li><li><p><code>mc_hits::Vector{CalibratedMCHit}</code></p></li><li><p><code>mc_trks::Vector{MCTrk}</code></p></li><li><p><code>index::Int64</code></p></li><li><p><code>flags::Int64</code></p></li><li><p><code>usr::Dict{String, Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/offline.jl#LL99">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedHit" href="#KM3io.CalibratedHit"><code>KM3io.CalibratedHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedHit &lt;: AbstractCalibratedHit</code></pre><p>A calibrated hit of the offline dataformat. Caveat: the <code>position</code>, <code>direction</code> and <code>t</code> fields might still be <code>0</code> due to the design philosophy of the offline format (one class for all).</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>channel_id::UInt32</code></p></li><li><p><code>tdc::UInt32</code></p></li><li><p><code>tot::UInt32</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/offline.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedMCHit" href="#KM3io.CalibratedMCHit"><code>KM3io.CalibratedMCHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedMCHit &lt;: KM3io.AbstractCalibratedMCHit</code></pre><p>A calibrated MC hit of the offline dataformat. Caveat: the <code>position</code> and <code>direction</code> fields might still be <code>0</code> due to the design philosophy of the offline format (one class for all).</p><p><strong>Fields</strong></p><ul><li><p><code>pmt_id::Int32</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>a::Float64</code></p></li><li><p><code>type::Int32</code></p></li><li><p><code>origin::Int32</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/offline.jl#LL21">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.XCalibratedHit" href="#KM3io.XCalibratedHit"><code>KM3io.XCalibratedHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct XCalibratedHit &lt;: AbstractCalibratedHit</code></pre><p>A fully dressed hit with all calibration information which can be obtained. This structure is similar to the Hit structure in aanet and should be used wisely. Most of the time it&#39;s much more performant to use dedicated (simplified) structures.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt32</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>tot::UInt8</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t0::Float64</code></p></li><li><p><code>string::UInt8</code></p></li><li><p><code>floor::UInt8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL106">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Trk" href="#KM3io.Trk"><code>KM3io.Trk</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Trk</code></pre><p>Represents a reconstructed &quot;track&quot;, which can be e.g. a muon track but also a shower.</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>E::Float64</code></p></li><li><p><code>len::Float64</code></p></li><li><p><code>lik::Float64</code></p></li><li><p><code>rec_type::Int32</code></p></li><li><p><code>rec_stages::Vector{Int32}</code></p></li><li><p><code>fitinf::FitInformation</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/offline.jl#LL67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.MCTrk" href="#KM3io.MCTrk"><code>KM3io.MCTrk</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct MCTrk</code></pre><p>A simulated (Monte Carlo, hence &quot;MC&quot;) track (or shower).</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int64</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>E::Float64</code></p></li><li><p><code>len::Float64</code></p></li><li><p><code>type::Int32</code></p></li><li><p><code>status::Int32</code></p></li><li><p><code>mother_id::Int32</code></p></li><li><p><code>counter::Int32</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/offline.jl#LL83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.FitInformation" href="#KM3io.FitInformation"><code>KM3io.FitInformation</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct FitInformation</code></pre><p>A container object to store fit information which uses 0-based indexing. It implements the array interface. The entries is this vector are float values and their position encodes the meaning of their meaning which is defined in the <a href="https://git.km3net.de/common/km3net-dataformat">KM3NeT DataFormat</a></p><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>The elements of this object should always be accessed using constants defined in <code>KM3io.FITINFORMATION</code>. The use of magic numbers should be avoided to ensure that future changes in the <a href="https://git.km3net.de/common/km3net-dataformat">KM3NeT DataFormat</a> do not break existing code.</p></div></div><p><strong>Fields</strong></p><ul><li><code>values::Vector{Float64}</code></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/offline.jl#LL40">source</a></section></article><h2 id="Online-Format"><a class="docs-heading-anchor" href="#Online-Format">Online Format</a><a id="Online-Format-1"></a><a class="docs-heading-anchor-permalink" href="#Online-Format" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.DAQEvent" href="#KM3io.DAQEvent"><code>KM3io.DAQEvent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct DAQEvent</code></pre><p>A (triggered) event holding snapshot hits and triggered hits. The triggered hits are a subset of the snapshot hits.</p><p><strong>Fields</strong></p><ul><li><p><code>header::EventHeader</code></p></li><li><p><code>snapshot_hits::Vector{SnapshotHit}</code></p></li><li><p><code>triggered_hits::Vector{TriggeredHit}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL203">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.EventHeader" href="#KM3io.EventHeader"><code>KM3io.EventHeader</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct EventHeader</code></pre><p>The header of an event.</p><p><strong>Fields</strong></p><ul><li><p><code>detector_id::Int32</code></p></li><li><p><code>run::Int32</code></p></li><li><p><code>frame_index::Int32</code></p></li><li><p><code>t::UTCExtended</code></p></li><li><p><code>trigger_counter::UInt64</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li><li><p><code>overlays::UInt32</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL188">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SnapshotHit" href="#KM3io.SnapshotHit"><code>KM3io.SnapshotHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SnapshotHit &lt;: KM3io.AbstractDAQHit</code></pre><p>A snapshot hit.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Int32</code></p></li><li><p><code>tot::UInt8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL55">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.TriggeredHit" href="#KM3io.TriggeredHit"><code>KM3io.TriggeredHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct TriggeredHit &lt;: KM3io.AbstractDAQHit</code></pre><p>A hit which was triggered.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Int32</code></p></li><li><p><code>tot::UInt8</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL79">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedSnapshotHit" href="#KM3io.CalibratedSnapshotHit"><code>KM3io.CalibratedSnapshotHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedSnapshotHit &lt;: AbstractCalibratedHit</code></pre><p>A calibrated snapshot hit.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>tot::UInt8</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CalibratedTriggeredHit" href="#KM3io.CalibratedTriggeredHit"><code>KM3io.CalibratedTriggeredHit</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CalibratedTriggeredHit &lt;: AbstractCalibratedHit</code></pre><p>A calibrated triggered hit.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::UInt32</code></p></li><li><p><code>channel_id::UInt8</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>tot::UInt8</code></p></li><li><p><code>trigger_mask::UInt64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL92">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.UTCTime" href="#KM3io.UTCTime"><code>KM3io.UTCTime</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct UTCTime</code></pre><p>A basic time structure with seconds and nanoseconds. The seconds are counting from the start of the epoch, just like the UNIX time.</p><p><strong>Fields</strong></p><ul><li><p><code>s::UInt64</code></p></li><li><p><code>ns::UInt64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL127">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.UTCExtended" href="#KM3io.UTCExtended"><code>KM3io.UTCExtended</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct UTCExtended</code></pre><p>An extended time structure which contains the White Rabbit time synchronisation status. <code>wr_status == 0</code> means that the synchronisation is OK.</p><p><strong>Fields</strong></p><ul><li><p><code>s::UInt32</code></p></li><li><p><code>ns::UInt32</code></p></li><li><p><code>wr_status::Int64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Summaryslice" href="#KM3io.Summaryslice"><code>KM3io.Summaryslice</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Summaryslice</code></pre><p>A summaryslice is a condensed timeslice with the header information of the corresponding timeslice and a summary frame for each optical module. The hit information of the original timeslice is reduced so that for each PMT a single byte is used to encode the hit rate.</p><p><strong>Fields</strong></p><ul><li><p><code>header::SummarysliceHeader</code></p></li><li><p><code>frames::Vector{SummaryFrame}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/online.jl#LL104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SummarysliceHeader" href="#KM3io.SummarysliceHeader"><code>KM3io.SummarysliceHeader</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SummarysliceHeader</code></pre><p>The header of a summaryslice.</p><p><strong>Fields</strong></p><ul><li><p><code>detector_id::Int32</code></p></li><li><p><code>run::Int32</code></p></li><li><p><code>frame_index::Int32</code></p></li><li><p><code>t::UTCExtended</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SummaryFrame" href="#KM3io.SummaryFrame"><code>KM3io.SummaryFrame</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SummaryFrame</code></pre><p>A <code>SummaryFrame</code> contains reduced timeslice data from an optical module.</p><p>The PMT <code>rates</code> are encoded as single bytes and can be converted to real hit rates using the <code>rates(s::SummaryFrame)</code> function.</p><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>daq::UInt32</code></p></li><li><p><code>status::UInt32</code></p></li><li><p><code>fifo::UInt32</code></p></li><li><p><code>status3::UInt32</code></p></li><li><p><code>status4::UInt32</code></p></li><li><p><code>rates::StaticArraysCore.SVector{31, UInt8}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL158">source</a></section></article><h2 id="Oscillations-Open-Data"><a class="docs-heading-anchor" href="#Oscillations-Open-Data">Oscillations Open Data</a><a id="Oscillations-Open-Data-1"></a><a class="docs-heading-anchor-permalink" href="#Oscillations-Open-Data" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.OscillationsData" href="#KM3io.OscillationsData"><code>KM3io.OscillationsData</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">abstract type OscillationsData</code></pre><p><code>OscillationsData</code> is an abstract type representing the data in an oscillation open data file.</p><p><strong>Fields</strong></p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.OSCFile" href="#KM3io.OSCFile"><code>KM3io.OSCFile</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct OSCFile</code></pre><p><code>OSCFile</code> is a structure representing an oscillation open data file. Depending on the trees inside the root file it will have different fields (neutrino, muons, data).</p><p><strong>Fields</strong></p><ul><li><p><code>_fobj::Union{UnROOT.ROOTFile, Dict}</code></p></li><li><p><code>rawroot::Union{Nothing, UnROOT.ROOTFile}</code></p></li><li><p><code>osc_opendata_nu::Union{Nothing, OscillationsData}</code></p></li><li><p><code>osc_opendata_data::Union{Nothing, OscillationsData}</code></p></li><li><p><code>osc_opendata_muons::Union{Nothing, OscillationsData}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL7">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.ResponseMatrixBin" href="#KM3io.ResponseMatrixBin"><code>KM3io.ResponseMatrixBin</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">abstract type ResponseMatrixBin</code></pre><p>A <code>ResponseMatrixBin</code> is an abstract type representing a bin in a response matrix.</p><p><strong>Fields</strong></p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL51">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.ResponseMatrixBinNeutrinos" href="#KM3io.ResponseMatrixBinNeutrinos"><code>KM3io.ResponseMatrixBinNeutrinos</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct ResponseMatrixBinNeutrinos &lt;: ResponseMatrixBin</code></pre><p>A concrete type representing a response matrix bin for neutrino events.</p><p><strong>Fields</strong></p><ul><li><p><code>E_reco_bin::Int64</code></p></li><li><p><code>Ct_reco_bin::Int64</code></p></li><li><p><code>E_true_bin::Int64</code></p></li><li><p><code>Ct_true_bin::Int64</code></p></li><li><p><code>Flav::Int16</code></p></li><li><p><code>IsCC::Int16</code></p></li><li><p><code>AnaClass::Int16</code></p></li><li><p><code>W::Float64</code></p></li><li><p><code>Werr::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL58">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.ResponseMatrixBinMuons" href="#KM3io.ResponseMatrixBinMuons"><code>KM3io.ResponseMatrixBinMuons</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct ResponseMatrixBinMuons &lt;: ResponseMatrixBin</code></pre><p>A concrete type representing a response matrix bin for muon events. There is no true quantities for muon events.</p><p><strong>Fields</strong></p><ul><li><p><code>E_reco_bin::Int64</code></p></li><li><p><code>Ct_reco_bin::Int64</code></p></li><li><p><code>AnaClass::Int16</code></p></li><li><p><code>W::Float64</code></p></li><li><p><code>Werr::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.ResponseMatrixBinData" href="#KM3io.ResponseMatrixBinData"><code>KM3io.ResponseMatrixBinData</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct ResponseMatrixBinData &lt;: ResponseMatrixBin</code></pre><p>A concrete type representing a response matrix bin for data events. There is no true quantities for data events.</p><p><strong>Fields</strong></p><ul><li><p><code>E_reco_bin::Int64</code></p></li><li><p><code>Ct_reco_bin::Int64</code></p></li><li><p><code>AnaClass::Int16</code></p></li><li><p><code>W::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL88">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.OscOpenDataTree" href="#KM3io.OscOpenDataTree"><code>KM3io.OscOpenDataTree</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct OscOpenDataTree{T} &lt;: OscillationsData</code></pre><p><code>OscOpenDataTree</code> is a structure representing an oscillation open data tree, it will be represented as response functions.</p><p><strong>Fields</strong></p><ul><li><p><code>_fobj::UnROOT.ROOTFile</code></p></li><li><p><code>_bin_lookup_map::Dict{Tuple{Int64, Int64, Int64}, Int64}</code></p></li><li><p><code>_t::Any</code></p></li><li><p><code>tpath::String</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/oscillations.jl#LL129">source</a></section></article><h2 id="HDF5"><a class="docs-heading-anchor" href="#HDF5">HDF5</a><a id="HDF5-1"></a><a class="docs-heading-anchor-permalink" href="#HDF5" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.H5File" href="#KM3io.H5File"><code>KM3io.H5File</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct H5File</code></pre><p>A wrapper for an HDF5 file used in KM3NeT.</p><p><strong>Fields</strong></p><ul><li><p><code>_h5f::HDF5.File</code></p></li><li><p><code>_datasets::Dict{String, H5CompoundDataset}</code></p></li><li><p><code>_lock::ReentrantLock</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hdf5/hdf5.jl#LL39">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.H5CompoundDataset" href="#KM3io.H5CompoundDataset"><code>KM3io.H5CompoundDataset</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct H5CompoundDataset{T}</code></pre><p>A flat HDF5 compound dataset which is essentially a vector of structs. It has a cache which is filled when elements are pushed to it. The cache is automatically written to the target HDF5 path when full.</p><p><strong>Fields</strong></p><ul><li><p><code>dset::HDF5.Dataset</code></p></li><li><p><code>cache::KM3io.H5CompoundDatasetCache</code></p></li><li><p><code>_lock::ReentrantLock</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hdf5/hdf5.jl#LL6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.addmeta" href="#KM3io.addmeta"><code>KM3io.addmeta</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">addmeta(
     dset::Union{HDF5.Dataset, HDF5.Datatype, HDF5.File, HDF5.Group},
     object
 )
-</code></pre><p>Attaches key-value-pair meta entries to an HDF5 instance for each field of the given object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hdf5/hdf5.jl#LL106">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="HDF5.create_dataset" href="#HDF5.create_dataset"><code>HDF5.create_dataset</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">create_dataset(
+</code></pre><p>Attaches key-value-pair meta entries to an HDF5 instance for each field of the given object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hdf5/hdf5.jl#LL106">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="HDF5.create_dataset" href="#HDF5.create_dataset"><code>HDF5.create_dataset</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">create_dataset(
     f::H5File,
     path::AbstractString,
     ::Type{T};
@@ -12,88 +12,88 @@
     filters,
     kwargs...
 ) -&gt; H5CompoundDataset
-</code></pre><p>Creates a one-dimensional compound dataset <a href="#KM3io.H5CompoundDataset"><code>H5CompoundDataset</code></a> of a given type which can be extended one-by-one. The cache is used to accumulate data and reduce the number of dataset extensions. Each time the cache is full, the HDF5 dataset will be extended, the buffer written and cleared.</p><p>To force the writing, use <a href="#Base.flush"><code>flush</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hdf5/hdf5.jl#LL79">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.flush" href="#Base.flush"><code>Base.flush</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flush(d::H5CompoundDataset; nolock) -&gt; H5CompoundDataset
-</code></pre><p>Forces the cache to be written to the HDF5 file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hdf5/hdf5.jl#LL22">source</a></section></article><h2 id="Hardware"><a class="docs-heading-anchor" href="#Hardware">Hardware</a><a id="Hardware-1"></a><a class="docs-heading-anchor-permalink" href="#Hardware" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.PMT" href="#KM3io.PMT"><code>KM3io.PMT</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct PMT</code></pre><p>The photomultiplier tube of an optical module. The <code>id</code> stands for the DAQ channel ID.</p><p>A non-zero status means the PMT is &quot;not OK&quot;. Individual bits can be read out to identify the problem (see definitions/pmt_status.jl for the bit positions and check them using the <code>nthbitset()</code> function).</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int32</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t₀::Float64</code></p></li><li><p><code>status::Union{Missing, Int32}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.DetectorModule" href="#KM3io.DetectorModule"><code>KM3io.DetectorModule</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct DetectorModule</code></pre><p>Either a base module or an optical module. A non-zero status means the module is &quot;not OK&quot;. Individual bits can be read out to identify the problem (see definitions/module_status.jl for the bit positions and check them using the <code>nthbitset()</code> function).</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int32</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>location::Location</code></p></li><li><p><code>n_pmts::Int8</code></p></li><li><p><code>pmts::Vector{PMT}</code></p></li><li><p><code>q::Union{Missing, Quaternion{Float64}}</code></p></li><li><p><code>status::Int32</code></p></li><li><p><code>t₀::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL41">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Detector" href="#KM3io.Detector"><code>KM3io.Detector</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Detector</code></pre><p>A KM3NeT detector.</p><p><strong>Fields</strong></p><ul><li><p><code>version::Int8</code></p></li><li><p><code>id::Int32</code></p></li><li><p><code>validity::Union{Missing, KM3io.DateRange}</code></p></li><li><p><code>pos::Union{Missing, UTMPosition{Float64}}</code></p></li><li><p><code>utm_ref_grid::Union{Missing, String}</code></p></li><li><p><code>n_modules::Int32</code></p></li><li><p><code>modules::Dict{Int32, DetectorModule}</code></p></li><li><p><code>locations::Dict{Tuple{Int64, Int64}, DetectorModule}</code></p></li><li><p><code>strings::Vector{Int64}</code></p></li><li><p><code>comments::Vector{String}</code></p></li><li><p><code>_pmt_id_module_map::Dict{Int64, DetectorModule}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL268">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.PMTFile" href="#KM3io.PMTFile"><code>KM3io.PMTFile</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct PMTFile</code></pre><p>A container type to hold PMT data which are stored in &quot;PMT files&quot;, created by K40 calibrations. This type can be passe to <code>Base.read</code> to load the contents of such a file.</p><p><strong>Example</strong></p><pre><code class="nohighlight hljs">julia&gt; f = read(&quot;path/to/pmt.txt&quot;, PMTFile)
-PMTFile containing parameters of 7254 PMTs</code></pre><p><strong>Fields</strong></p><ul><li><p><code>QE::Float64</code></p></li><li><p><code>mu::Float64</code></p></li><li><p><code>comments::Vector{String}</code></p></li><li><p><code>parameters::KM3io.PMTParameters</code></p></li><li><p><code>pmt_data::Dict{Tuple{Int64, Int64}, PMTData}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL802">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.PMTData" href="#KM3io.PMTData"><code>KM3io.PMTData</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct PMTData</code></pre><p>PMT parameters as stored in <a href="#KM3io.PMTFile"><code>PMTFile</code></a>s.</p><p><strong>Fields</strong></p><ul><li><p><code>QE::Float64</code></p></li><li><p><code>gain::Float64</code></p></li><li><p><code>gainSpread::Float64</code></p></li><li><p><code>riseTime_ns::Float64</code></p></li><li><p><code>TTS_ns::Float64</code></p></li><li><p><code>threshold::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL788">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.modules" href="#KM3io.modules"><code>KM3io.modules</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">modules(d::Detector) -&gt; Vector{DetectorModule}
-</code></pre><p>Return a vector of all modules of a given detector.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL286">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.getmodule" href="#KM3io.getmodule"><code>KM3io.getmodule</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">getmodule(d::Detector, module_id::Integer) -&gt; DetectorModule
-</code></pre><p>Return the detector module for a given module ID.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL310">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(
+</code></pre><p>Creates a one-dimensional compound dataset <a href="#KM3io.H5CompoundDataset"><code>H5CompoundDataset</code></a> of a given type which can be extended one-by-one. The cache is used to accumulate data and reduce the number of dataset extensions. Each time the cache is full, the HDF5 dataset will be extended, the buffer written and cleared.</p><p>To force the writing, use <a href="#Base.flush"><code>flush</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hdf5/hdf5.jl#LL79">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.flush" href="#Base.flush"><code>Base.flush</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flush(d::H5CompoundDataset; nolock) -&gt; H5CompoundDataset
+</code></pre><p>Forces the cache to be written to the HDF5 file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hdf5/hdf5.jl#LL22">source</a></section></article><h2 id="Hardware"><a class="docs-heading-anchor" href="#Hardware">Hardware</a><a id="Hardware-1"></a><a class="docs-heading-anchor-permalink" href="#Hardware" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.PMT" href="#KM3io.PMT"><code>KM3io.PMT</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct PMT</code></pre><p>The photomultiplier tube of an optical module. The <code>id</code> stands for the DAQ channel ID.</p><p>A non-zero status means the PMT is &quot;not OK&quot;. Individual bits can be read out to identify the problem (see definitions/pmt_status.jl for the bit positions and check them using the <code>nthbitset()</code> function).</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int32</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li><li><p><code>t₀::Float64</code></p></li><li><p><code>status::Union{Missing, Int32}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.DetectorModule" href="#KM3io.DetectorModule"><code>KM3io.DetectorModule</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct DetectorModule</code></pre><p>Either a base module or an optical module. A non-zero status means the module is &quot;not OK&quot;. Individual bits can be read out to identify the problem (see definitions/module_status.jl for the bit positions and check them using the <code>nthbitset()</code> function).</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int32</code></p></li><li><p><code>pos::Position{Float64}</code></p></li><li><p><code>location::Location</code></p></li><li><p><code>n_pmts::Int8</code></p></li><li><p><code>pmts::Vector{PMT}</code></p></li><li><p><code>q::Union{Missing, Quaternion{Float64}}</code></p></li><li><p><code>status::Int32</code></p></li><li><p><code>t₀::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL41">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Detector" href="#KM3io.Detector"><code>KM3io.Detector</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Detector</code></pre><p>A KM3NeT detector.</p><p><strong>Fields</strong></p><ul><li><p><code>version::Int8</code></p></li><li><p><code>id::Int32</code></p></li><li><p><code>validity::Union{Missing, KM3io.DateRange}</code></p></li><li><p><code>pos::Union{Missing, UTMPosition{Float64}}</code></p></li><li><p><code>utm_ref_grid::Union{Missing, String}</code></p></li><li><p><code>n_modules::Int32</code></p></li><li><p><code>modules::Dict{Int32, DetectorModule}</code></p></li><li><p><code>locations::Dict{Tuple{Int64, Int64}, DetectorModule}</code></p></li><li><p><code>strings::Vector{Int64}</code></p></li><li><p><code>comments::Vector{String}</code></p></li><li><p><code>_pmt_id_module_map::Dict{Int64, DetectorModule}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL268">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.PMTFile" href="#KM3io.PMTFile"><code>KM3io.PMTFile</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct PMTFile</code></pre><p>A container type to hold PMT data which are stored in &quot;PMT files&quot;, created by K40 calibrations. This type can be passe to <code>Base.read</code> to load the contents of such a file.</p><p><strong>Example</strong></p><pre><code class="nohighlight hljs">julia&gt; f = read(&quot;path/to/pmt.txt&quot;, PMTFile)
+PMTFile containing parameters of 7254 PMTs</code></pre><p><strong>Fields</strong></p><ul><li><p><code>QE::Float64</code></p></li><li><p><code>mu::Float64</code></p></li><li><p><code>comments::Vector{String}</code></p></li><li><p><code>parameters::KM3io.PMTParameters</code></p></li><li><p><code>pmt_data::Dict{Tuple{Int64, Int64}, PMTData}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL802">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.PMTData" href="#KM3io.PMTData"><code>KM3io.PMTData</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct PMTData</code></pre><p>PMT parameters as stored in <a href="#KM3io.PMTFile"><code>PMTFile</code></a>s.</p><p><strong>Fields</strong></p><ul><li><p><code>QE::Float64</code></p></li><li><p><code>gain::Float64</code></p></li><li><p><code>gainSpread::Float64</code></p></li><li><p><code>riseTime_ns::Float64</code></p></li><li><p><code>TTS_ns::Float64</code></p></li><li><p><code>threshold::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL788">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.modules" href="#KM3io.modules"><code>KM3io.modules</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">modules(d::Detector) -&gt; Vector{DetectorModule}
+</code></pre><p>Return a vector of all modules of a given detector.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL286">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.getmodule" href="#KM3io.getmodule"><code>KM3io.getmodule</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">getmodule(d::Detector, module_id::Integer) -&gt; DetectorModule
+</code></pre><p>Return the detector module for a given module ID.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL310">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(
     d::Detector,
     string::Integer,
     floor::Integer
 ) -&gt; DetectorModule
-</code></pre><p>Return the detector module for a given string and floor.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL314">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(
+</code></pre><p>Return the detector module for a given string and floor.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL314">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(
     d::Detector,
     loc::Tuple{T&lt;:Integer, T&lt;:Integer}
 ) -&gt; DetectorModule
-</code></pre><p>Return the detector module for a given string and floor (as <code>Tuple</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL318">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(d::Detector, loc::Location) -&gt; DetectorModule
-</code></pre><p>Return the detector module for a given location.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL322">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(d::Detector, hit::KM3io.AbstractDAQHit) -&gt; Any
-</code></pre><p>Return the detector module for a given DAQ hit.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL330">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(
+</code></pre><p>Return the detector module for a given string and floor (as <code>Tuple</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL318">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(d::Detector, loc::Location) -&gt; DetectorModule
+</code></pre><p>Return the detector module for a given location.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL322">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(d::Detector, hit::KM3io.AbstractDAQHit) -&gt; Any
+</code></pre><p>Return the detector module for a given DAQ hit.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL330">source</a></section><section><div><pre><code class="language-julia hljs">getmodule(
     d::Detector,
     hit::KM3io.AbstractMCHit
 ) -&gt; DetectorModule
-</code></pre><p>Return the detector module for a given MC hit.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL334">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.getpmt" href="#KM3io.getpmt"><code>KM3io.getpmt</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">getpmt(d::DetectorModule, channel_id::Integer) -&gt; Any
-</code></pre><p>Get the PMT for a given DAQ channel ID (TDC)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL89">source</a></section><section><div><pre><code class="language-julia hljs">getpmt(d::Detector, hit::KM3io.AbstractDAQHit) -&gt; Any
-</code></pre><p>Return the <code>PMT</code> for a given hit.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL326">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.haslocation" href="#KM3io.haslocation"><code>KM3io.haslocation</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">haslocation(d::Detector, loc::Location) -&gt; Bool
-</code></pre><p>Returns true if there is a module at the given location.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL359">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hasstring" href="#KM3io.hasstring"><code>KM3io.hasstring</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hasstring(d::Detector, s::Integer) -&gt; Union{Missing, Bool}
-</code></pre><p>Returns true if there is a string with a given number.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL366">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.isbasemodule" href="#KM3io.isbasemodule"><code>KM3io.isbasemodule</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">isbasemodule(d::DetectorModule) -&gt; Bool
-</code></pre><p>Returns true if the module is a basemodule.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.isopticalmodule" href="#KM3io.isopticalmodule"><code>KM3io.isopticalmodule</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">isopticalmodule(d::DetectorModule) -&gt; Bool
-</code></pre><p>Returns true if the module is an optical module.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.write-Tuple{AbstractString, Detector}" href="#Base.write-Tuple{AbstractString, Detector}"><code>Base.write</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write(filename::AbstractString, d::Detector; version)
-</code></pre><p>Writes the detector definition to a file, according to the DETX format specification. The <code>version</code> parameter can be a version number or <code>:same</code>, which is the default value and writes the same version as the provided detector has.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL623">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.write-Tuple{IO, Detector}" href="#Base.write-Tuple{IO, Detector}"><code>Base.write</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write(io::IO, d::Detector; version)
-</code></pre><pre><code class="nohighlight hljs">function write(io::IO, d::Detector; version=:same)</code></pre><p>Writes the detector to a DETX formatted file. The target version can be specified via the <code>version</code> keyword. Note that if converting to higher versions, missing parameters will be filled with reasonable default values. In case of downgrading, information will be lost.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL640">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Hydrophone" href="#KM3io.Hydrophone"><code>KM3io.Hydrophone</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Hydrophone</code></pre><p>A hydrophone, typically installed in the base module of a KM3NeT detector&#39;s string.</p><p><strong>Fields</strong></p><ul><li><p><code>location::Location</code></p></li><li><p><code>pos::Position{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{Hydrophone}}" href="#Base.read-Tuple{AbstractString, Type{Hydrophone}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
+</code></pre><p>Return the detector module for a given MC hit.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL334">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.getpmt" href="#KM3io.getpmt"><code>KM3io.getpmt</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">getpmt(d::DetectorModule, channel_id::Integer) -&gt; Any
+</code></pre><p>Get the PMT for a given DAQ channel ID (TDC)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL89">source</a></section><section><div><pre><code class="language-julia hljs">getpmt(d::Detector, hit::KM3io.AbstractDAQHit) -&gt; Any
+</code></pre><p>Return the <code>PMT</code> for a given hit.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL326">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.haslocation" href="#KM3io.haslocation"><code>KM3io.haslocation</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">haslocation(d::Detector, loc::Location) -&gt; Bool
+</code></pre><p>Returns true if there is a module at the given location.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL359">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hasstring" href="#KM3io.hasstring"><code>KM3io.hasstring</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hasstring(d::Detector, s::Integer) -&gt; Union{Missing, Bool}
+</code></pre><p>Returns true if there is a string with a given number.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL366">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.isbasemodule" href="#KM3io.isbasemodule"><code>KM3io.isbasemodule</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">isbasemodule(d::DetectorModule) -&gt; Bool
+</code></pre><p>Returns true if the module is a basemodule.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.isopticalmodule" href="#KM3io.isopticalmodule"><code>KM3io.isopticalmodule</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">isopticalmodule(d::DetectorModule) -&gt; Bool
+</code></pre><p>Returns true if the module is an optical module.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.write-Tuple{AbstractString, Detector}" href="#Base.write-Tuple{AbstractString, Detector}"><code>Base.write</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write(filename::AbstractString, d::Detector; version)
+</code></pre><p>Writes the detector definition to a file, according to the DETX format specification. The <code>version</code> parameter can be a version number or <code>:same</code>, which is the default value and writes the same version as the provided detector has.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL623">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.write-Tuple{IO, Detector}" href="#Base.write-Tuple{IO, Detector}"><code>Base.write</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write(io::IO, d::Detector; version)
+</code></pre><pre><code class="nohighlight hljs">function write(io::IO, d::Detector; version=:same)</code></pre><p>Writes the detector to a DETX formatted file. The target version can be specified via the <code>version</code> keyword. Note that if converting to higher versions, missing parameters will be filled with reasonable default values. In case of downgrading, information will be lost.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL640">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Hydrophone" href="#KM3io.Hydrophone"><code>KM3io.Hydrophone</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Hydrophone</code></pre><p>A hydrophone, typically installed in the base module of a KM3NeT detector&#39;s string.</p><p><strong>Fields</strong></p><ul><li><p><code>location::Location</code></p></li><li><p><code>pos::Position{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{Hydrophone}}" href="#Base.read-Tuple{AbstractString, Type{Hydrophone}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
     filename::AbstractString,
     T::Type{Hydrophone}
 ) -&gt; Vector{Hydrophone}
-</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{Hydrophone})</code></pre><p>Reads a vector of <code>Hydrophone</code>s from an ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL151">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Tripod" href="#KM3io.Tripod"><code>KM3io.Tripod</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Tripod</code></pre><p>A tripod installed on the seabed which sends acoustic signals to modules.</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int8</code></p></li><li><p><code>pos::Position{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL169">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{Tripod}}" href="#Base.read-Tuple{AbstractString, Type{Tripod}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
+</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{Hydrophone})</code></pre><p>Reads a vector of <code>Hydrophone</code>s from an ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL151">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Tripod" href="#KM3io.Tripod"><code>KM3io.Tripod</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Tripod</code></pre><p>A tripod installed on the seabed which sends acoustic signals to modules.</p><p><strong>Fields</strong></p><ul><li><p><code>id::Int8</code></p></li><li><p><code>pos::Position{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL169">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{Tripod}}" href="#Base.read-Tuple{AbstractString, Type{Tripod}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
     filename::AbstractString,
     T::Type{Tripod}
 ) -&gt; Vector{Tripod}
-</code></pre><pre><code class="nohighlight hljs">function read(filename:AbstractString, T::Type{Tripod})</code></pre><p>Reads a vector of <code>Tripod</code>s from an ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.write-Tuple{AbstractString, Vector{Tripod}}" href="#Base.write-Tuple{AbstractString, Vector{Tripod}}"><code>Base.write</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write(filename::AbstractString, tripods::Vector{Tripod})
-</code></pre><pre><code class="nohighlight hljs">function write(filename::AbstractString, tripods::Dict{Int8, Tripod})</code></pre><p>Writes the position of tripods out into an ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL194">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.piezoenabled" href="#KM3io.piezoenabled"><code>KM3io.piezoenabled</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">piezoenabled(m::DetectorModule) -&gt; Bool
-</code></pre><pre><code class="nohighlight hljs">function piezoenabled(m::DetectorModule)</code></pre><p>Return <code>true</code> if the piezo is enabled, <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/acoustics.jl#LL47">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hydrophoneenabled" href="#KM3io.hydrophoneenabled"><code>KM3io.hydrophoneenabled</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hydrophoneenabled(m::DetectorModule) -&gt; Bool
-</code></pre><pre><code class="nohighlight hljs">function hydrophonenabled(m::DetectorModule)</code></pre><p>Return <code>true</code> if the hydrophone is enabled, <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/acoustics.jl#LL54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.center" href="#KM3io.center"><code>KM3io.center</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">center(m::DetectorModule) -&gt; Position{Float64}
-</code></pre><p>Calculate the centre of a module by fitting the crossing point of the PMT axes.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL96">source</a></section><section><div><pre><code class="language-julia hljs">center(d::Detector) -&gt; Position{Float64}
-</code></pre><p>Calculate the center of the detector based on the location of the optical modules.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL374">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.StringMechanics" href="#KM3io.StringMechanics"><code>KM3io.StringMechanics</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct StringMechanics</code></pre><p>A container structure which holds the mechanical model parameters for multiple strings, including a default value for strings which have specific parameters.</p><p><strong>Fields</strong></p><ul><li><p><code>default::StringMechanicsParameters</code></p></li><li><p><code>stringparams::Dict{Int64, StringMechanicsParameters}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL731">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.StringMechanicsParameters" href="#KM3io.StringMechanicsParameters"><code>KM3io.StringMechanicsParameters</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct StringMechanicsParameters</code></pre><p>Data structure for parameters of the mechanical model of strings. This data structure is used to calculate the effective height conform to the mechanical model of the string.</p><p><strong>Fields</strong></p><ul><li><p><code>a::Float64</code></p></li><li><p><code>b::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL719">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{StringMechanics}}" href="#Base.read-Tuple{AbstractString, Type{StringMechanics}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
+</code></pre><pre><code class="nohighlight hljs">function read(filename:AbstractString, T::Type{Tripod})</code></pre><p>Reads a vector of <code>Tripod</code>s from an ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.write-Tuple{AbstractString, Vector{Tripod}}" href="#Base.write-Tuple{AbstractString, Vector{Tripod}}"><code>Base.write</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write(filename::AbstractString, tripods::Vector{Tripod})
+</code></pre><pre><code class="nohighlight hljs">function write(filename::AbstractString, tripods::Dict{Int8, Tripod})</code></pre><p>Writes the position of tripods out into an ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL194">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.piezoenabled" href="#KM3io.piezoenabled"><code>KM3io.piezoenabled</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">piezoenabled(m::DetectorModule) -&gt; Bool
+</code></pre><pre><code class="nohighlight hljs">function piezoenabled(m::DetectorModule)</code></pre><p>Return <code>true</code> if the piezo is enabled, <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/acoustics.jl#LL47">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hydrophoneenabled" href="#KM3io.hydrophoneenabled"><code>KM3io.hydrophoneenabled</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hydrophoneenabled(m::DetectorModule) -&gt; Bool
+</code></pre><pre><code class="nohighlight hljs">function hydrophonenabled(m::DetectorModule)</code></pre><p>Return <code>true</code> if the hydrophone is enabled, <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/acoustics.jl#LL54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.center" href="#KM3io.center"><code>KM3io.center</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">center(m::DetectorModule) -&gt; Position{Float64}
+</code></pre><p>Calculate the centre of a module by fitting the crossing point of the PMT axes.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL96">source</a></section><section><div><pre><code class="language-julia hljs">center(d::Detector) -&gt; Position{Float64}
+</code></pre><p>Calculate the center of the detector based on the location of the optical modules.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL374">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.StringMechanics" href="#KM3io.StringMechanics"><code>KM3io.StringMechanics</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct StringMechanics</code></pre><p>A container structure which holds the mechanical model parameters for multiple strings, including a default value for strings which have specific parameters.</p><p><strong>Fields</strong></p><ul><li><p><code>default::StringMechanicsParameters</code></p></li><li><p><code>stringparams::Dict{Int64, StringMechanicsParameters}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL731">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.StringMechanicsParameters" href="#KM3io.StringMechanicsParameters"><code>KM3io.StringMechanicsParameters</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct StringMechanicsParameters</code></pre><p>Data structure for parameters of the mechanical model of strings. This data structure is used to calculate the effective height conform to the mechanical model of the string.</p><p><strong>Fields</strong></p><ul><li><p><code>a::Float64</code></p></li><li><p><code>b::Float64</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL719">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{StringMechanics}}" href="#Base.read-Tuple{AbstractString, Type{StringMechanics}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
     filename::AbstractString,
     T::Type{StringMechanics}
 ) -&gt; StringMechanics
-</code></pre><p>Reads the mechanical models from a text file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL744">source</a></section></article><h2 id="Optical-Data"><a class="docs-heading-anchor" href="#Optical-Data">Optical Data</a><a id="Optical-Data-1"></a><a class="docs-heading-anchor-permalink" href="#Optical-Data" title="Permalink"></a></h2><h2 id="Acoustics"><a class="docs-heading-anchor" href="#Acoustics">Acoustics</a><a id="Acoustics-1"></a><a class="docs-heading-anchor-permalink" href="#Acoustics" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Waveform" href="#KM3io.Waveform"><code>KM3io.Waveform</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Waveform</code></pre><p>Waveform translates Emitter ID to Tripod ID.</p><p><strong>Fields</strong></p><ul><li><code>ids::Dict{Int8, Int8}</code></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL213">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{Waveform}}" href="#Base.read-Tuple{AbstractString, Type{Waveform}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
+</code></pre><p>Reads the mechanical models from a text file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL744">source</a></section></article><h2 id="Optical-Data"><a class="docs-heading-anchor" href="#Optical-Data">Optical Data</a><a id="Optical-Data-1"></a><a class="docs-heading-anchor-permalink" href="#Optical-Data" title="Permalink"></a></h2><h2 id="Acoustics"><a class="docs-heading-anchor" href="#Acoustics">Acoustics</a><a id="Acoustics-1"></a><a class="docs-heading-anchor-permalink" href="#Acoustics" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Waveform" href="#KM3io.Waveform"><code>KM3io.Waveform</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Waveform</code></pre><p>Waveform translates Emitter ID to Tripod ID.</p><p><strong>Fields</strong></p><ul><li><code>ids::Dict{Int8, Int8}</code></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL213">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{Waveform}}" href="#Base.read-Tuple{AbstractString, Type{Waveform}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
     filename::AbstractString,
     T::Type{Waveform}
 ) -&gt; Waveform
-</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{Waveform})</code></pre><p>Reads the waveform ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL219">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.AcousticSignal" href="#KM3io.AcousticSignal"><code>KM3io.AcousticSignal</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct AcousticSignal</code></pre><p>AcousticSignal is a custom type with four fields to store all the information inside the raw acoustic binary files.</p><ul><li>dom_id::Int32 ID of the module</li><li>utc_seconds:: UInt32 storing the first 4 Bytes and is a UNIX time stamp</li><li>ns_cycles:: UInt32 storing the second 4 Bytes</li><li>samples:: UInt32 storing the third 4 Bytes, corresponding to the number of data points accuired during the measring window</li><li>pcm:: Vector of Float32 of length frame_length, storing all other 4 Byte blocks. Each entry is a data point of the acoustic signal.</li></ul><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>utc_seconds::UInt32</code></p></li><li><p><code>ns_cycles::UInt32</code></p></li><li><p><code>samples::UInt32</code></p></li><li><p><code>pcm::Vector{Float32}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/acoustics.jl#LL8">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.AcousticsTriggerParameter" href="#KM3io.AcousticsTriggerParameter"><code>KM3io.AcousticsTriggerParameter</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct AcousticsTriggerParameter</code></pre><p>Certain parameters which define an acoustic event.</p><p><strong>Fields</strong></p><ul><li><p><code>q::Float64</code></p></li><li><p><code>tmax::Float64</code></p></li><li><p><code>nmin::Int32</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}" href="#Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
+</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{Waveform})</code></pre><p>Reads the waveform ASCII file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL219">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.AcousticSignal" href="#KM3io.AcousticSignal"><code>KM3io.AcousticSignal</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct AcousticSignal</code></pre><p>AcousticSignal is a custom type with four fields to store all the information inside the raw acoustic binary files.</p><ul><li>dom_id::Int32 ID of the module</li><li>utc_seconds:: UInt32 storing the first 4 Bytes and is a UNIX time stamp</li><li>ns_cycles:: UInt32 storing the second 4 Bytes</li><li>samples:: UInt32 storing the third 4 Bytes, corresponding to the number of data points accuired during the measring window</li><li>pcm:: Vector of Float32 of length frame_length, storing all other 4 Byte blocks. Each entry is a data point of the acoustic signal.</li></ul><p><strong>Fields</strong></p><ul><li><p><code>dom_id::Int32</code></p></li><li><p><code>utc_seconds::UInt32</code></p></li><li><p><code>ns_cycles::UInt32</code></p></li><li><p><code>samples::UInt32</code></p></li><li><p><code>pcm::Vector{Float32}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/acoustics.jl#LL8">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.AcousticsTriggerParameter" href="#KM3io.AcousticsTriggerParameter"><code>KM3io.AcousticsTriggerParameter</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct AcousticsTriggerParameter</code></pre><p>Certain parameters which define an acoustic event.</p><p><strong>Fields</strong></p><ul><li><p><code>q::Float64</code></p></li><li><p><code>tmax::Float64</code></p></li><li><p><code>nmin::Int32</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}" href="#Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}"><code>Base.read</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read(
     filename::AbstractString,
     T::Type{AcousticsTriggerParameter}
 ) -&gt; AcousticsTriggerParameter
-</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{AcousticsTriggerParameter})</code></pre><p>Reads the &#39;acoustics<em>trigger</em>parameters.txt&#39; file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/hardware.jl#LL248">source</a></section></article><h2 id="Calibration"><a class="docs-heading-anchor" href="#Calibration">Calibration</a><a id="Calibration-1"></a><a class="docs-heading-anchor-permalink" href="#Calibration" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.calibrate" href="#KM3io.calibrate"><code>KM3io.calibrate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">calibrate(det::Detector, hits) -&gt; Vector{XCalibratedHit}
-</code></pre><p>Apply full geometry and time calibration to given hits. This way of calibration should be used wisely since it creates a very bloaded <a href="#KM3io.XCalibratedHit"><code>XCalibratedHit</code></a> object, which might not be necessary. Often, we only need time the calibration to be applied.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/calibration.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.calibratetime" href="#KM3io.calibratetime"><code>KM3io.calibratetime</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">calibratetime(
+</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{AcousticsTriggerParameter})</code></pre><p>Reads the &#39;acoustics<em>trigger</em>parameters.txt&#39; file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/hardware.jl#LL248">source</a></section></article><h2 id="Calibration"><a class="docs-heading-anchor" href="#Calibration">Calibration</a><a id="Calibration-1"></a><a class="docs-heading-anchor-permalink" href="#Calibration" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.calibrate" href="#KM3io.calibrate"><code>KM3io.calibrate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">calibrate(det::Detector, hits) -&gt; Vector{XCalibratedHit}
+</code></pre><p>Apply full geometry and time calibration to given hits. This way of calibration should be used wisely since it creates a very bloaded <a href="#KM3io.XCalibratedHit"><code>XCalibratedHit</code></a> object, which might not be necessary. Often, we only need time the calibration to be applied.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/calibration.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.calibratetime" href="#KM3io.calibratetime"><code>KM3io.calibratetime</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">calibratetime(
     det::Detector,
     hits::Array{T&lt;:SnapshotHit, 1}
 ) -&gt; Vector{CalibratedSnapshotHit}
-</code></pre><p>Calibrate the time of a given array of snapshot hits.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/calibration.jl#LL35">source</a></section><section><div><pre><code class="language-julia hljs">calibratetime(
+</code></pre><p>Calibrate the time of a given array of snapshot hits.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/calibration.jl#LL35">source</a></section><section><div><pre><code class="language-julia hljs">calibratetime(
     det::Detector,
     hits::Array{T&lt;:TriggeredHit, 1}
 ) -&gt; Vector{CalibratedTriggeredHit}
-</code></pre><p>Calibrate the time of a given array of triggered hits.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/calibration.jl#LL48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.combine" href="#KM3io.combine"><code>KM3io.combine</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">combine(
+</code></pre><p>Calibrate the time of a given array of triggered hits.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/calibration.jl#LL48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.combine" href="#KM3io.combine"><code>KM3io.combine</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">combine(
     snapshot_hits::Vector{SnapshotHit},
     triggered_hits::Vector{TriggeredHit}
 ) -&gt; Vector{TriggeredHit}
-</code></pre><p>Combine snapshot and triggered hits to a single hits-vector.</p><p>This should be used to transfer the trigger information to the snapshot hits from a DAQEvent. The triggered hits are a subset of the snapshot hits.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/calibration.jl#LL61">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Orientations" href="#KM3io.Orientations"><code>KM3io.Orientations</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Orientations</code></pre><p>A data structure to hold orientations data. This struct should be instantiated by <code>Base.read(filename, Orientations)</code>.</p><p><strong>Fields</strong></p><ul><li><p><code>module_ids::Set{Int64}</code></p></li><li><p><code>times::Dict{Int64, Vector{Float64}}</code></p></li><li><p><code>quaternions::Dict{Int64, Vector{Quaternion}}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/calibration.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Compass" href="#KM3io.Compass"><code>KM3io.Compass</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Compass{T} &lt;: StaticArraysCore.FieldVector{3, T}</code></pre><p>A compass with yaw, pitch and roll.</p><p><strong>Fields</strong></p><ul><li><p><code>yaw::Any</code></p></li><li><p><code>pitch::Any</code></p></li><li><p><code>roll::Any</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/root/calibration.jl#LL68">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Quaternion" href="#KM3io.Quaternion"><code>KM3io.Quaternion</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Quaternion{T} &lt;: StaticArraysCore.FieldVector{4, T}</code></pre><p>A simple quaternion derived from a <code>FieldVector</code> of StaticArrays, no more, no less.</p><p><strong>Fields</strong></p><ul><li><p><code>q0::Any</code></p></li><li><p><code>qx::Any</code></p></li><li><p><code>qy::Any</code></p></li><li><p><code>qz::Any</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/types.jl#LL32">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.floordist" href="#KM3io.floordist"><code>KM3io.floordist</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">floordist(det::Detector) -&gt; Float64
-</code></pre><p>Calculates the average floor distance between neighboured modules.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/calibration.jl#LL88">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.slew" href="#KM3io.slew"><code>KM3io.slew</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew(tot::Integer) -&gt; Any
-</code></pre><p>Return the time slewing for a ToT.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/calibration.jl#LL102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.slerp" href="#KM3io.slerp"><code>KM3io.slerp</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slerp(q₁, q₂, t::Real; dot_threshold, normalized) -&gt; Any
-</code></pre><p>Interpolate between two vectors (e.g. quaternions) using the slerp method. <code>t</code> should be between 0 and 1. 0 will produce <code>q₁</code> and <code>1</code> <code>q₂</code>.</p><p>The input vectors <code>q₁</code> and <code>q₂</code> will be normalised unless <code>normalized</code> is <code>false</code>. It is not done by default to shave off a few dozens of nanoseconds. Make sure to set <code>normalized=false</code> if the input vectors are not unit vectors.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/math.jl#LL17">source</a></section></article><h2 id="Physics"><a class="docs-heading-anchor" href="#Physics">Physics</a><a id="Physics-1"></a><a class="docs-heading-anchor-permalink" href="#Physics" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.azimuth" href="#KM3io.azimuth"><code>KM3io.azimuth</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">azimuth(d::Direction) -&gt; Any
-</code></pre><p>Calculates the azimuth from a given <a href="#KM3io.Direction"><code>Direction</code></a> according to KM3NeT conventions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.zenith" href="#KM3io.zenith"><code>KM3io.zenith</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">zenith(d::Direction) -&gt; Any
-</code></pre><p>Calculates the zenith from a given <a href="#KM3io.Direction"><code>Direction</code></a> according to KM3NeT conventions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL61">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.phi" href="#KM3io.phi"><code>KM3io.phi</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phi(d::Direction) -&gt; Any
-</code></pre><p>Calculate the phi angle for a given direction</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.theta" href="#KM3io.theta"><code>KM3io.theta</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">theta(d::Direction) -&gt; Any
-</code></pre><p>Calculate the theta angle for a given direction</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL68">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.cherenkov" href="#KM3io.cherenkov"><code>KM3io.cherenkov</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">cherenkov(
+</code></pre><p>Combine snapshot and triggered hits to a single hits-vector.</p><p>This should be used to transfer the trigger information to the snapshot hits from a DAQEvent. The triggered hits are a subset of the snapshot hits.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/calibration.jl#LL61">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Orientations" href="#KM3io.Orientations"><code>KM3io.Orientations</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Orientations</code></pre><p>A data structure to hold orientations data. This struct should be instantiated by <code>Base.read(filename, Orientations)</code>.</p><p><strong>Fields</strong></p><ul><li><p><code>module_ids::Set{Int64}</code></p></li><li><p><code>times::Dict{Int64, Vector{Float64}}</code></p></li><li><p><code>quaternions::Dict{Int64, Vector{Quaternion}}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/calibration.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Compass" href="#KM3io.Compass"><code>KM3io.Compass</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Compass{T} &lt;: StaticArraysCore.FieldVector{3, T}</code></pre><p>A compass with yaw, pitch and roll.</p><p><strong>Fields</strong></p><ul><li><p><code>yaw::Any</code></p></li><li><p><code>pitch::Any</code></p></li><li><p><code>roll::Any</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/root/calibration.jl#LL68">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.Quaternion" href="#KM3io.Quaternion"><code>KM3io.Quaternion</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct Quaternion{T} &lt;: StaticArraysCore.FieldVector{4, T}</code></pre><p>A simple quaternion derived from a <code>FieldVector</code> of StaticArrays, no more, no less.</p><p><strong>Fields</strong></p><ul><li><p><code>q0::Any</code></p></li><li><p><code>qx::Any</code></p></li><li><p><code>qy::Any</code></p></li><li><p><code>qz::Any</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/types.jl#LL32">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.floordist" href="#KM3io.floordist"><code>KM3io.floordist</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">floordist(det::Detector) -&gt; Float64
+</code></pre><p>Calculates the average floor distance between neighboured modules.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/calibration.jl#LL88">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.slew" href="#KM3io.slew"><code>KM3io.slew</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew(tot::Integer) -&gt; Any
+</code></pre><p>Return the time slewing for a ToT.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/calibration.jl#LL102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.slerp" href="#KM3io.slerp"><code>KM3io.slerp</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slerp(q₁, q₂, t::Real; dot_threshold, normalized) -&gt; Any
+</code></pre><p>Interpolate between two vectors (e.g. quaternions) using the slerp method. <code>t</code> should be between 0 and 1. 0 will produce <code>q₁</code> and <code>1</code> <code>q₂</code>.</p><p>The input vectors <code>q₁</code> and <code>q₂</code> will be normalised unless <code>normalized</code> is <code>false</code>. It is not done by default to shave off a few dozens of nanoseconds. Make sure to set <code>normalized=false</code> if the input vectors are not unit vectors.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/math.jl#LL17">source</a></section></article><h2 id="Physics"><a class="docs-heading-anchor" href="#Physics">Physics</a><a id="Physics-1"></a><a class="docs-heading-anchor-permalink" href="#Physics" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.azimuth" href="#KM3io.azimuth"><code>KM3io.azimuth</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">azimuth(d::Direction) -&gt; Any
+</code></pre><p>Calculates the azimuth from a given <a href="#KM3io.Direction"><code>Direction</code></a> according to KM3NeT conventions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.zenith" href="#KM3io.zenith"><code>KM3io.zenith</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">zenith(d::Direction) -&gt; Any
+</code></pre><p>Calculates the zenith from a given <a href="#KM3io.Direction"><code>Direction</code></a> according to KM3NeT conventions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL61">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.phi" href="#KM3io.phi"><code>KM3io.phi</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phi(d::Direction) -&gt; Any
+</code></pre><p>Calculate the phi angle for a given direction</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.theta" href="#KM3io.theta"><code>KM3io.theta</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">theta(d::Direction) -&gt; Any
+</code></pre><p>Calculate the theta angle for a given direction</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL68">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.cherenkov" href="#KM3io.cherenkov"><code>KM3io.cherenkov</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">cherenkov(
     track,
     hits::Array{T&lt;:AbstractCalibratedHit, 1}
 ) -&gt; Vector
-</code></pre><p>Calculates the parameters of cherenkov photons emitted from a track and hitting the PMTs represented as (calibrated) hits. The returned cherenkov photons hold information about the closest distance to track, the time residual, arrival time, impact angle, photon travel distance, track travel distance and photon travel direction. See <a href="#KM3io.CherenkovPhoton"><code>CherenkovPhoton</code></a> for more information.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL18">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CherenkovPhoton" href="#KM3io.CherenkovPhoton"><code>KM3io.CherenkovPhoton</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CherenkovPhoton</code></pre><p>A Cherenkov photon with parameters calculated from its inducing track. See <a href="#KM3io.cherenkov"><code>cherenkov()</code></a> for more information.</p><p><strong>Fields</strong></p><ul><li><p><code>d_closest::Float64</code></p></li><li><p><code>d_photon::Float64</code></p></li><li><p><code>d_track::Float64</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>Δt::Float64</code></p></li><li><p><code>impact_angle::Float64</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.K40Rates" href="#KM3io.K40Rates"><code>KM3io.K40Rates</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct K40Rates</code></pre><p>K40 rates with L0 and higher level rates (with increasing multiplicities).</p><p><strong>Fields</strong></p><ul><li><p><code>L0::Float64</code></p></li><li><p><code>L1::Vector{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/physics.jl#LL83">source</a></section></article><h2 id="Trigger"><a class="docs-heading-anchor" href="#Trigger">Trigger</a><a id="Trigger-1"></a><a class="docs-heading-anchor-permalink" href="#Trigger" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.triggered" href="#KM3io.triggered"><code>KM3io.triggered</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">triggered(e) -&gt; Vector{T} where T&lt;:KM3io.AbstractDAQHit
-</code></pre><p>Return <code>true</code> if the passed object (hit, event, ...) was triggered by any trigger algorithm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/trigger.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.is3dmuon" href="#KM3io.is3dmuon"><code>KM3io.is3dmuon</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">is3dmuon(e::DAQEvent) -&gt; Bool
-</code></pre><pre><code class="language-julia hljs">is3dmuon(e)</code></pre><p>defined at <a href="https://github.com//tree/a326c08f8cd8589387af910f3af85c95ec612b59//src/tools/trigger.jl#L12"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:12</code></a>.</p><p>Return <code>true</code> the 3D Muon trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/trigger.jl#LL7-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.is3dshower" href="#KM3io.is3dshower"><code>KM3io.is3dshower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">is3dshower(e::DAQEvent) -&gt; Bool
-</code></pre><pre><code class="language-julia hljs">is3dshower(e)</code></pre><p>defined at <a href="https://github.com//tree/a326c08f8cd8589387af910f3af85c95ec612b59//src/tools/trigger.jl#L20"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:20</code></a>.</p><p>Return <code>true</code> if the 3D Shower trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/trigger.jl#LL15-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.ismxshower" href="#KM3io.ismxshower"><code>KM3io.ismxshower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ismxshower(x) -&gt; Bool
-</code></pre><pre><code class="language-julia hljs">ismxshower(x)</code></pre><p>defined at <a href="https://github.com//tree/a326c08f8cd8589387af910f3af85c95ec612b59//src/tools/trigger.jl#L28"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:28</code></a>.</p><pre><code class="language-julia hljs">ismxshower(e)</code></pre><p>defined at <a href="https://github.com//tree/a326c08f8cd8589387af910f3af85c95ec612b59//src/tools/trigger.jl#L29"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:29</code></a>.</p><p>Return <code>true</code> if the MX Shower trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/trigger.jl#LL23-L27">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.isnb" href="#KM3io.isnb"><code>KM3io.isnb</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">isnb(x) -&gt; Bool
-</code></pre><pre><code class="language-julia hljs">isnb(x)</code></pre><p>defined at <a href="https://github.com//tree/a326c08f8cd8589387af910f3af85c95ec612b59//src/tools/trigger.jl#L36"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:36</code></a>.</p><pre><code class="language-julia hljs">isnb(e)</code></pre><p>defined at <a href="https://github.com//tree/a326c08f8cd8589387af910f3af85c95ec612b59//src/tools/trigger.jl#L37"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:37</code></a>.</p><p>Return <code>true</code> if the NanoBeacon trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/trigger.jl#LL31-L35">source</a></section></article><h2 id="ControlHost"><a class="docs-heading-anchor" href="#ControlHost">ControlHost</a><a id="ControlHost-1"></a><a class="docs-heading-anchor-permalink" href="#ControlHost" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CHClient" href="#KM3io.CHClient"><code>KM3io.CHClient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CHClient{T}</code></pre><p>A ControlHost client which can communicate with a Ligier dispatcher to receive messages for all the subscribed tags.</p><p>To connect to a Ligier which is receiving triggered DAQ events e.g. in the KM3NeT monitoring system or in a test setup consisting of a <a href="https://common.pages.km3net.de/jpp/#JLigier">JLigier</a> dispatcher and a <a href="https://common.pages.km3net.de/jpp/#JRegurgitate">JRegurgitate</a> instance which is redispatching DAQ events (<code>JDAQEvent</code>) from a ROOT file in online format to the <code>JLigier</code>, a <code>CHClient</code> can be created to subscribe the event messages with</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io
+</code></pre><p>Calculates the parameters of cherenkov photons emitted from a track and hitting the PMTs represented as (calibrated) hits. The returned cherenkov photons hold information about the closest distance to track, the time residual, arrival time, impact angle, photon travel distance, track travel distance and photon travel direction. See <a href="#KM3io.CherenkovPhoton"><code>CherenkovPhoton</code></a> for more information.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL18">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CherenkovPhoton" href="#KM3io.CherenkovPhoton"><code>KM3io.CherenkovPhoton</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CherenkovPhoton</code></pre><p>A Cherenkov photon with parameters calculated from its inducing track. See <a href="#KM3io.cherenkov"><code>cherenkov()</code></a> for more information.</p><p><strong>Fields</strong></p><ul><li><p><code>d_closest::Float64</code></p></li><li><p><code>d_photon::Float64</code></p></li><li><p><code>d_track::Float64</code></p></li><li><p><code>t::Float64</code></p></li><li><p><code>Δt::Float64</code></p></li><li><p><code>impact_angle::Float64</code></p></li><li><p><code>dir::Direction{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.K40Rates" href="#KM3io.K40Rates"><code>KM3io.K40Rates</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct K40Rates</code></pre><p>K40 rates with L0 and higher level rates (with increasing multiplicities).</p><p><strong>Fields</strong></p><ul><li><p><code>L0::Float64</code></p></li><li><p><code>L1::Vector{Float64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/physics.jl#LL83">source</a></section></article><h2 id="Trigger"><a class="docs-heading-anchor" href="#Trigger">Trigger</a><a id="Trigger-1"></a><a class="docs-heading-anchor-permalink" href="#Trigger" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.triggered" href="#KM3io.triggered"><code>KM3io.triggered</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">triggered(e) -&gt; Vector{T} where T&lt;:KM3io.AbstractDAQHit
+</code></pre><p>Return <code>true</code> if the passed object (hit, event, ...) was triggered by any trigger algorithm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/trigger.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.is3dmuon" href="#KM3io.is3dmuon"><code>KM3io.is3dmuon</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">is3dmuon(e::DAQEvent) -&gt; Bool
+</code></pre><pre><code class="language-julia hljs">is3dmuon(e)</code></pre><p>defined at <a href="https://github.com//tree/d256d1d852266e72d98afaaa4c29bf60d281ee7a//src/tools/trigger.jl#L12"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:12</code></a>.</p><p>Return <code>true</code> the 3D Muon trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/trigger.jl#LL7-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.is3dshower" href="#KM3io.is3dshower"><code>KM3io.is3dshower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">is3dshower(e::DAQEvent) -&gt; Bool
+</code></pre><pre><code class="language-julia hljs">is3dshower(e)</code></pre><p>defined at <a href="https://github.com//tree/d256d1d852266e72d98afaaa4c29bf60d281ee7a//src/tools/trigger.jl#L20"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:20</code></a>.</p><p>Return <code>true</code> if the 3D Shower trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/trigger.jl#LL15-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.ismxshower" href="#KM3io.ismxshower"><code>KM3io.ismxshower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ismxshower(x) -&gt; Bool
+</code></pre><pre><code class="language-julia hljs">ismxshower(x)</code></pre><p>defined at <a href="https://github.com//tree/d256d1d852266e72d98afaaa4c29bf60d281ee7a//src/tools/trigger.jl#L28"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:28</code></a>.</p><pre><code class="language-julia hljs">ismxshower(e)</code></pre><p>defined at <a href="https://github.com//tree/d256d1d852266e72d98afaaa4c29bf60d281ee7a//src/tools/trigger.jl#L29"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:29</code></a>.</p><p>Return <code>true</code> if the MX Shower trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/trigger.jl#LL23-L27">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.isnb" href="#KM3io.isnb"><code>KM3io.isnb</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">isnb(x) -&gt; Bool
+</code></pre><pre><code class="language-julia hljs">isnb(x)</code></pre><p>defined at <a href="https://github.com//tree/d256d1d852266e72d98afaaa4c29bf60d281ee7a//src/tools/trigger.jl#L36"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:36</code></a>.</p><pre><code class="language-julia hljs">isnb(e)</code></pre><p>defined at <a href="https://github.com//tree/d256d1d852266e72d98afaaa4c29bf60d281ee7a//src/tools/trigger.jl#L37"><code>/builds/common/KM3io.jl/src/tools/trigger.jl:37</code></a>.</p><p>Return <code>true</code> if the NanoBeacon trigger bit is set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/trigger.jl#LL31-L35">source</a></section></article><h2 id="ControlHost"><a class="docs-heading-anchor" href="#ControlHost">ControlHost</a><a id="ControlHost-1"></a><a class="docs-heading-anchor-permalink" href="#ControlHost" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.CHClient" href="#KM3io.CHClient"><code>KM3io.CHClient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct CHClient{T}</code></pre><p>A ControlHost client which can communicate with a Ligier dispatcher to receive messages for all the subscribed tags.</p><p>To connect to a Ligier which is receiving triggered DAQ events e.g. in the KM3NeT monitoring system or in a test setup consisting of a <a href="https://common.pages.km3net.de/jpp/#JLigier">JLigier</a> dispatcher and a <a href="https://common.pages.km3net.de/jpp/#JRegurgitate">JRegurgitate</a> instance which is redispatching DAQ events (<code>JDAQEvent</code>) from a ROOT file in online format to the <code>JLigier</code>, a <code>CHClient</code> can be created to subscribe the event messages with</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io
 
 julia&gt; c = CHClient{DAQEvent}(ip&quot;127.0.0.1&quot;, 5553)
 
@@ -106,7 +106,7 @@ e = KM3io.DAQEvent with 154 snapshot and 8 triggered hits
 e = KM3io.DAQEvent with 152 snapshot and 6 triggered hits
 ...
 ...
-...</code></pre><p><strong>Fields</strong></p><ul><li><p><code>ip::Sockets.IPv4</code></p></li><li><p><code>port::UInt16</code></p></li><li><p><code>tags::Vector{CHTag}</code></p></li><li><p><code>socket::Sockets.TCPSocket</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/controlhost.jl#LL57">source</a></section></article><h2 id="Tools"><a class="docs-heading-anchor" href="#Tools">Tools</a><a id="Tools-1"></a><a class="docs-heading-anchor-permalink" href="#Tools" title="Permalink"></a></h2><h3 id="General-tools"><a class="docs-heading-anchor" href="#General-tools">General tools</a><a id="General-tools-1"></a><a class="docs-heading-anchor-permalink" href="#General-tools" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SummarysliceIntervalIterator" href="#KM3io.SummarysliceIntervalIterator"><code>KM3io.SummarysliceIntervalIterator</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SummarysliceIntervalIterator</code></pre><p>An iterator which yields a <code>Vector{Summaryslice}</code> containing summaryslices of a given <code>time_interval</code> (in seconds). Useful when analysing summary data with fixed time intervals. The returned summaryslices are also sorted in time.</p><p><strong>Examples</strong></p><pre><code class="language-julia-repl hljs">julia&gt; f = ROOTFile(&quot;KM3NeT_00000133_00014728.root&quot;)
+...</code></pre><p><strong>Fields</strong></p><ul><li><p><code>ip::Sockets.IPv4</code></p></li><li><p><code>port::UInt16</code></p></li><li><p><code>tags::Vector{CHTag}</code></p></li><li><p><code>socket::Sockets.TCPSocket</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/controlhost.jl#LL57">source</a></section></article><h2 id="Tools"><a class="docs-heading-anchor" href="#Tools">Tools</a><a id="Tools-1"></a><a class="docs-heading-anchor-permalink" href="#Tools" title="Permalink"></a></h2><h3 id="General-tools"><a class="docs-heading-anchor" href="#General-tools">General tools</a><a id="General-tools-1"></a><a class="docs-heading-anchor-permalink" href="#General-tools" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.SummarysliceIntervalIterator" href="#KM3io.SummarysliceIntervalIterator"><code>KM3io.SummarysliceIntervalIterator</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct SummarysliceIntervalIterator</code></pre><p>An iterator which yields a <code>Vector{Summaryslice}</code> containing summaryslices of a given <code>time_interval</code> (in seconds). Useful when analysing summary data with fixed time intervals. The returned summaryslices are also sorted in time.</p><p><strong>Examples</strong></p><pre><code class="language-julia-repl hljs">julia&gt; f = ROOTFile(&quot;KM3NeT_00000133_00014728.root&quot;)
 ROOTFile{OnlineTree (83509 events, 106969 summaryslices)}
 
 julia&gt; sii = SummarysliceIntervalIterator(f, 60)
@@ -135,12 +135,12 @@ n = 100
 n = 100
 n = 100
 n = 96
-n = 31</code></pre><p><strong>Fields</strong></p><ul><li><p><code>sc::KM3io.SummarysliceContainer</code></p></li><li><p><code>first_frame_index::Int64</code></p></li><li><p><code>time_interval::Int64</code></p></li><li><p><code>n_chunks::Int64</code></p></li><li><p><code>timespan::Float64</code></p></li><li><p><code>indices::Vector{Int64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/helpers.jl#LL63">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.getevent" href="#KM3io.getevent"><code>KM3io.getevent</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">getevent(
+n = 31</code></pre><p><strong>Fields</strong></p><ul><li><p><code>sc::KM3io.SummarysliceContainer</code></p></li><li><p><code>first_frame_index::Int64</code></p></li><li><p><code>time_interval::Int64</code></p></li><li><p><code>n_chunks::Int64</code></p></li><li><p><code>timespan::Float64</code></p></li><li><p><code>indices::Vector{Int64}</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/helpers.jl#LL65">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.getevent" href="#KM3io.getevent"><code>KM3io.getevent</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">getevent(
     tree::Union{KM3io.OnlineTree, KM3io.OfflineTree},
     frame_index,
     trigger_counter
 ) -&gt; Any
-</code></pre><p>Retrieves the event with for a given <code>frame_index</code> and <code>trigger_counter</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/helpers.jl#LL30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.categorize" href="#KM3io.categorize"><code>KM3io.categorize</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">categorize(
+</code></pre><p>Retrieves the event with for a given <code>frame_index</code> and <code>trigger_counter</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/helpers.jl#LL31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.categorize" href="#KM3io.categorize"><code>KM3io.categorize</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">categorize(
     field::Symbol,
     elements::Vector
 ) -&gt; Dict{_A, Vector{_A1}} where {_A, _A1}
@@ -156,41 +156,41 @@ julia&gt; pmts = [PMT(2, 10.4), PMT(4, 23.5), PMT(2, 42.0)];
 julia&gt; categorize(:dom_id, pmts)
 Dict{Any, Vector{PMT}} with 2 entries:
   4 =&gt; [PMT(4, 23.5)]
-  2 =&gt; [PMT(2, 10.4), PMT(2, 42.0)]</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/general.jl#LL56">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.nthbitset" href="#KM3io.nthbitset"><code>KM3io.nthbitset</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nthbitset(n, a) -&gt; Any
-</code></pre><p>Return <code>true</code> if the n-th bit of <code>a</code> is set, <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/general.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.most_frequent" href="#KM3io.most_frequent"><code>KM3io.most_frequent</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">most_frequent(iterable) -&gt; Any
-</code></pre><p>Return the most frequent value of a given iterable.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/general.jl#LL7">source</a></section><section><div><pre><code class="language-julia hljs">most_frequent(f::Function, iterable; rettype) -&gt; Int64
-</code></pre><p>Return the most frequent value of a given iterable based on the return value of a function <code>f</code> which returns (hashable) values of <code>rettype</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/general.jl#LL30">source</a></section></article><h3 id="DAQ"><a class="docs-heading-anchor" href="#DAQ">DAQ</a><a id="DAQ-1"></a><a class="docs-heading-anchor-permalink" href="#DAQ" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.pmtrate" href="#KM3io.pmtrate"><code>KM3io.pmtrate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">pmtrate(r::UInt8) -&gt; Float64
-</code></pre><p>Calculate the PMT hit rate from the raw byte stored in a summary frame.</p><p>The rate of each PMT is encoded in a single byte to reduce the size of the summary frame, therefore only 256 values are possible which are mapped to an exponential function. The values are precalculated by the <code>_getrate()</code> function for the best performance.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.pmtrates" href="#KM3io.pmtrates"><code>KM3io.pmtrates</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">pmtrates(
+  2 =&gt; [PMT(2, 10.4), PMT(2, 42.0)]</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/general.jl#LL56">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.nthbitset" href="#KM3io.nthbitset"><code>KM3io.nthbitset</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nthbitset(n, a) -&gt; Any
+</code></pre><p>Return <code>true</code> if the n-th bit of <code>a</code> is set, <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/general.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.most_frequent" href="#KM3io.most_frequent"><code>KM3io.most_frequent</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">most_frequent(iterable) -&gt; Any
+</code></pre><p>Return the most frequent value of a given iterable.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/general.jl#LL7">source</a></section><section><div><pre><code class="language-julia hljs">most_frequent(f::Function, iterable; rettype) -&gt; Int64
+</code></pre><p>Return the most frequent value of a given iterable based on the return value of a function <code>f</code> which returns (hashable) values of <code>rettype</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/general.jl#LL30">source</a></section></article><h3 id="DAQ"><a class="docs-heading-anchor" href="#DAQ">DAQ</a><a id="DAQ-1"></a><a class="docs-heading-anchor-permalink" href="#DAQ" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.pmtrate" href="#KM3io.pmtrate"><code>KM3io.pmtrate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">pmtrate(r::UInt8) -&gt; Float64
+</code></pre><p>Calculate the PMT hit rate from the raw byte stored in a summary frame.</p><p>The rate of each PMT is encoded in a single byte to reduce the size of the summary frame, therefore only 256 values are possible which are mapped to an exponential function. The values are precalculated by the <code>_getrate()</code> function for the best performance.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.pmtrates" href="#KM3io.pmtrates"><code>KM3io.pmtrates</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">pmtrates(
     s::SummaryFrame
 ) -&gt; StaticArraysCore.SVector{31, Float64}
-</code></pre><p>Return the actual rates (in Hz) for each PMT in a summary frame.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL19">source</a></section><section><div><pre><code class="language-julia hljs">pmtrates(
+</code></pre><p>Return the actual rates (in Hz) for each PMT in a summary frame.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL19">source</a></section><section><div><pre><code class="language-julia hljs">pmtrates(
     s::Summaryslice
 ) -&gt; Dict{Int32, StaticArraysCore.SVector{31, Float64}}
-</code></pre><p>Return a dictionary of DOM IDs as keys and PMT rates [Hz] as values (<code>Vector{Float64}</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hrvstatus" href="#KM3io.hrvstatus"><code>KM3io.hrvstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hrvstatus(f::SummaryFrame, tdc) -&gt; Any
-</code></pre><p>Return <code>true</code> if the TDC is in high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL35">source</a></section><section><div><pre><code class="language-julia hljs">hrvstatus(f::SummaryFrame) -&gt; Bool
-</code></pre><p>Return <code>true</code> if any of the TDCs is in high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.fifostatus" href="#KM3io.fifostatus"><code>KM3io.fifostatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fifostatus(f::SummaryFrame, tdc) -&gt; Any
-</code></pre><p>Return <code>true</code> if the TDC has FIFO almost full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL63">source</a></section><section><div><pre><code class="language-julia hljs">fifostatus(f::SummaryFrame) -&gt; Bool
-</code></pre><p>Return <code>true</code> if any of the TDCs is in high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.tdcstatus" href="#KM3io.tdcstatus"><code>KM3io.tdcstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">tdcstatus(f::SummaryFrame) -&gt; Bool
-</code></pre><p>Return <code>true</code> if TDC status is OK.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.wrstatus" href="#KM3io.wrstatus"><code>KM3io.wrstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">wrstatus(f::SummaryFrame) -&gt; Bool
-</code></pre><p>Return <code>true</code> if White Rabbit status is OK.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL56">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hasudptrailer" href="#KM3io.hasudptrailer"><code>KM3io.hasudptrailer</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hasudptrailer(f::SummaryFrame) -&gt; Bool
-</code></pre><p>Return <code>true</code> if the UDP trailer is present.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.count_active_channels" href="#KM3io.count_active_channels"><code>KM3io.count_active_channels</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">count_active_channels(f::SummaryFrame) -&gt; Int64
-</code></pre><p>Number of TDCs without high rate veto or FIFO almost full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.count_fifostatus" href="#KM3io.count_fifostatus"><code>KM3io.count_fifostatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">count_fifostatus(f::SummaryFrame) -&gt; Int64
-</code></pre><p>Number of TDCs with FIFO almost full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.count_hrvstatus" href="#KM3io.count_hrvstatus"><code>KM3io.count_hrvstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">count_hrvstatus(f::SummaryFrame) -&gt; Int64
-</code></pre><p>Number of TDCs with high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL116">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.status" href="#KM3io.status"><code>KM3io.status</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">status(f::SummaryFrame) -&gt; Bool
-</code></pre><p>Return <code>true</code> if TDC and White Rabbit status are OK.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL132">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.number_of_udp_packets_received" href="#KM3io.number_of_udp_packets_received"><code>KM3io.number_of_udp_packets_received</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">number_of_udp_packets_received(f::SummaryFrame) -&gt; Int32
-</code></pre><p>Number of received UDP packets (excluding the trailer).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL147">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.maximal_udp_sequence_number" href="#KM3io.maximal_udp_sequence_number"><code>KM3io.maximal_udp_sequence_number</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">maximal_udp_sequence_number(f::SummaryFrame) -&gt; Int32
-</code></pre><p>Maximal sequence number of all received UDP packets.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/daq.jl#LL140">source</a></section></article><h3 id="Reconstruction"><a class="docs-heading-anchor" href="#Reconstruction">Reconstruction</a><a id="Reconstruction-1"></a><a class="docs-heading-anchor-permalink" href="#Reconstruction" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.besttrack" href="#KM3io.besttrack"><code>KM3io.besttrack</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">besttrack(
+</code></pre><p>Return a dictionary of DOM IDs as keys and PMT rates [Hz] as values (<code>Vector{Float64}</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hrvstatus" href="#KM3io.hrvstatus"><code>KM3io.hrvstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hrvstatus(f::SummaryFrame, tdc) -&gt; Any
+</code></pre><p>Return <code>true</code> if the TDC is in high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL35">source</a></section><section><div><pre><code class="language-julia hljs">hrvstatus(f::SummaryFrame) -&gt; Bool
+</code></pre><p>Return <code>true</code> if any of the TDCs is in high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.fifostatus" href="#KM3io.fifostatus"><code>KM3io.fifostatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fifostatus(f::SummaryFrame, tdc) -&gt; Any
+</code></pre><p>Return <code>true</code> if the TDC has FIFO almost full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL63">source</a></section><section><div><pre><code class="language-julia hljs">fifostatus(f::SummaryFrame) -&gt; Bool
+</code></pre><p>Return <code>true</code> if any of the TDCs is in high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.tdcstatus" href="#KM3io.tdcstatus"><code>KM3io.tdcstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">tdcstatus(f::SummaryFrame) -&gt; Bool
+</code></pre><p>Return <code>true</code> if TDC status is OK.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.wrstatus" href="#KM3io.wrstatus"><code>KM3io.wrstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">wrstatus(f::SummaryFrame) -&gt; Bool
+</code></pre><p>Return <code>true</code> if White Rabbit status is OK.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL56">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hasudptrailer" href="#KM3io.hasudptrailer"><code>KM3io.hasudptrailer</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hasudptrailer(f::SummaryFrame) -&gt; Bool
+</code></pre><p>Return <code>true</code> if the UDP trailer is present.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.count_active_channels" href="#KM3io.count_active_channels"><code>KM3io.count_active_channels</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">count_active_channels(f::SummaryFrame) -&gt; Int64
+</code></pre><p>Number of TDCs without high rate veto or FIFO almost full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.count_fifostatus" href="#KM3io.count_fifostatus"><code>KM3io.count_fifostatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">count_fifostatus(f::SummaryFrame) -&gt; Int64
+</code></pre><p>Number of TDCs with FIFO almost full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.count_hrvstatus" href="#KM3io.count_hrvstatus"><code>KM3io.count_hrvstatus</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">count_hrvstatus(f::SummaryFrame) -&gt; Int64
+</code></pre><p>Number of TDCs with high rate veto.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL116">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.status" href="#KM3io.status"><code>KM3io.status</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">status(f::SummaryFrame) -&gt; Bool
+</code></pre><p>Return <code>true</code> if TDC and White Rabbit status are OK.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL132">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.number_of_udp_packets_received" href="#KM3io.number_of_udp_packets_received"><code>KM3io.number_of_udp_packets_received</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">number_of_udp_packets_received(f::SummaryFrame) -&gt; Int32
+</code></pre><p>Number of received UDP packets (excluding the trailer).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL147">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.maximal_udp_sequence_number" href="#KM3io.maximal_udp_sequence_number"><code>KM3io.maximal_udp_sequence_number</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">maximal_udp_sequence_number(f::SummaryFrame) -&gt; Int32
+</code></pre><p>Maximal sequence number of all received UDP packets.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/daq.jl#LL140">source</a></section></article><h3 id="Reconstruction"><a class="docs-heading-anchor" href="#Reconstruction">Reconstruction</a><a id="Reconstruction-1"></a><a class="docs-heading-anchor-permalink" href="#Reconstruction" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.besttrack" href="#KM3io.besttrack"><code>KM3io.besttrack</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">besttrack(
     e::Evt,
     rec_type::Integer,
     rsr::RecStageRange
 ) -&gt; Union{Missing, Trk}
-</code></pre><p>Return the best reconstructed track for a given reconstruction type and reconstruction stage range. If no track could be found, <code>missing</code> is returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.bestjppmuon" href="#KM3io.bestjppmuon"><code>KM3io.bestjppmuon</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bestjppmuon(e::Evt) -&gt; Union{Missing, Trk}
-</code></pre><p>Returns the best reconstructed JMuon track of an event or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL89">source</a></section><section><div><pre><code class="language-julia hljs">bestjppmuon(trks::Vector{Trk}) -&gt; Union{Missing, Trk}
-</code></pre><p>Returns the best reconstructed JMuon track or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.bestjppshower" href="#KM3io.bestjppshower"><code>KM3io.bestjppshower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bestjppshower(e::Evt) -&gt; Union{Missing, Trk}
-</code></pre><p>Returns the best reconstructed JShower &quot;track&quot; of an event or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL97">source</a></section><section><div><pre><code class="language-julia hljs">bestjppshower(trks::Vector{Trk}) -&gt; Union{Missing, Trk}
-</code></pre><p>Returns the best reconstructed JShower &quot;track&quot; or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL101">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.bestaashower" href="#KM3io.bestaashower"><code>KM3io.bestaashower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bestaashower(e::Evt) -&gt; Union{Missing, Trk}
-</code></pre><p>Returns the best reconstructed aashower &quot;track&quot; of an event or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL105">source</a></section><section><div><pre><code class="language-julia hljs">bestaashower(trks::Vector{Trk}) -&gt; Union{Missing, Trk}
-</code></pre><p>Returns the best reconstructed aashower &quot;track&quot; or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL109">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.RecStageRange" href="#KM3io.RecStageRange"><code>KM3io.RecStageRange</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct RecStageRange{T&lt;:Integer}</code></pre><p>This struct is used to represent a range of reconstruction stages. These are well-defined integers (see <a href="https://git.km3net.de/common/km3net-dataformat/-/blob/master/definitions/reconstruction.csv">KM3NeT Dataformat</a>) for each reconstruction algorithm and are stored in a vector named <code>rec_stages</code> of each <a href="#KM3io.Trk"><code>Trk</code></a>.</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io
+</code></pre><p>Return the best reconstructed track for a given reconstruction type and reconstruction stage range. If no track could be found, <code>missing</code> is returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.bestjppmuon" href="#KM3io.bestjppmuon"><code>KM3io.bestjppmuon</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bestjppmuon(e::Evt) -&gt; Union{Missing, Trk}
+</code></pre><p>Returns the best reconstructed JMuon track of an event or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL89">source</a></section><section><div><pre><code class="language-julia hljs">bestjppmuon(trks::Vector{Trk}) -&gt; Union{Missing, Trk}
+</code></pre><p>Returns the best reconstructed JMuon track or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.bestjppshower" href="#KM3io.bestjppshower"><code>KM3io.bestjppshower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bestjppshower(e::Evt) -&gt; Union{Missing, Trk}
+</code></pre><p>Returns the best reconstructed JShower &quot;track&quot; of an event or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL97">source</a></section><section><div><pre><code class="language-julia hljs">bestjppshower(trks::Vector{Trk}) -&gt; Union{Missing, Trk}
+</code></pre><p>Returns the best reconstructed JShower &quot;track&quot; or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL101">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.bestaashower" href="#KM3io.bestaashower"><code>KM3io.bestaashower</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bestaashower(e::Evt) -&gt; Union{Missing, Trk}
+</code></pre><p>Returns the best reconstructed aashower &quot;track&quot; of an event or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL105">source</a></section><section><div><pre><code class="language-julia hljs">bestaashower(trks::Vector{Trk}) -&gt; Union{Missing, Trk}
+</code></pre><p>Returns the best reconstructed aashower &quot;track&quot; or <code>missing</code> if there are none.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL109">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.RecStageRange" href="#KM3io.RecStageRange"><code>KM3io.RecStageRange</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">struct RecStageRange{T&lt;:Integer}</code></pre><p>This struct is used to represent a range of reconstruction stages. These are well-defined integers (see <a href="https://git.km3net.de/common/km3net-dataformat/-/blob/master/definitions/reconstruction.csv">KM3NeT Dataformat</a>) for each reconstruction algorithm and are stored in a vector named <code>rec_stages</code> of each <a href="#KM3io.Trk"><code>Trk</code></a>.</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io
 
 julia&gt; rsr = RecStageRange(KM3io.RECONSTRUCTION.JMUONBEGIN, KM3io.RECONSTRUCTION.JMUONEND)
 RecStageRange{Int64}(0, 99)
@@ -205,16 +205,16 @@ julia&gt; 23 ∈ rsr
 true
 
 julia&gt; 523 ∈ rsr
-false</code></pre><p><strong>Fields</strong></p><ul><li><p><code>lower::Integer</code></p></li><li><p><code>upper::Integer</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hashistory" href="#KM3io.hashistory"><code>KM3io.hashistory</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hashistory(
+false</code></pre><p><strong>Fields</strong></p><ul><li><p><code>lower::Integer</code></p></li><li><p><code>upper::Integer</code></p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.hashistory" href="#KM3io.hashistory"><code>KM3io.hashistory</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">hashistory(
     t::Trk,
     rec_type::Integer,
     rsr::RecStageRange
 ) -&gt; Bool
-</code></pre><p>Returns <code>true</code> if a track with a given <code>rec_type</code> contains all the reconstruction stages in <code>rsr::RecStageRange</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL34">source</a></section><section><div><pre><code class="language-julia hljs">hashistory(
+</code></pre><p>Returns <code>true</code> if a track with a given <code>rec_type</code> contains all the reconstruction stages in <code>rsr::RecStageRange</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL34">source</a></section><section><div><pre><code class="language-julia hljs">hashistory(
     t::Trk,
     rec_type::Integer,
     rec_stage::Integer
 ) -&gt; Bool
-</code></pre><p>Returns <code>true</code> if a track with a given <code>rec_type</code> contains the <code>rec_stage</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/reconstruction.jl#LL45">source</a></section></article><h3 id="Math"><a class="docs-heading-anchor" href="#Math">Math</a><a id="Math-1"></a><a class="docs-heading-anchor-permalink" href="#Math" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.angle" href="#Base.angle"><code>Base.angle</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">angle(d1::Direction, d2::Direction) -&gt; Any
-</code></pre><p>Calculate the angle between two vectors.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/math.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.distance" href="#KM3io.distance"><code>KM3io.distance</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">distance(a::Position, b::Position) -&gt; Any
-</code></pre><p>Calculates the disance between two points.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/a326c08f8cd8589387af910f3af85c95ec612b59/src/tools/math.jl#LL9">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../examples/hdf5/">« HDF5</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+</code></pre><p>Returns <code>true</code> if a track with a given <code>rec_type</code> contains the <code>rec_stage</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/reconstruction.jl#LL45">source</a></section></article><h3 id="Math"><a class="docs-heading-anchor" href="#Math">Math</a><a id="Math-1"></a><a class="docs-heading-anchor-permalink" href="#Math" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.angle" href="#Base.angle"><code>Base.angle</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">angle(d1::Direction, d2::Direction) -&gt; Any
+</code></pre><p>Calculate the angle between two vectors.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/math.jl#LL1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="KM3io.distance" href="#KM3io.distance"><code>KM3io.distance</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">distance(a::Position, b::Position) -&gt; Any
+</code></pre><p>Calculates the disance between two points.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.km3net.de/common/KM3io.jl/blob/d256d1d852266e72d98afaaa4c29bf60d281ee7a/src/tools/math.jl#LL9">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../examples/hdf5/">« HDF5</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/examples/cherenkov.pdf b/dev/examples/cherenkov.pdf
index fc32d76de2ae5d73f1f2b61a6d19174b34dc6ea9..e72cf34753653ecf545e3bb206549a900f1bc8b4 100644
GIT binary patch
delta 113
zcmZ2;pK;B7#tk<z*)0rB4Gc_8C*RK$gRwXN$=uB1=44`FX>4R>Y3AtS;%H%MYUb!@
gX<=+?U~Xn&;$mRxY^PvDSV`>U4eWB0h4W_u0G<yYp8x;=

delta 113
zcmZ2;pK;B7#tk<z*-Z>h4J-_dCg0B#gRwXN$=uB1W@&6};^=5#Xz6BY>Sk$VWaR8>
gY;107=Ir9+Xm050YNudBSV`>U4eWB0h4W_u0H81**#H0l

diff --git a/dev/examples/cherenkov_times/index.html b/dev/examples/cherenkov_times/index.html
index 2c6d8a3b..372a5edd 100644
--- a/dev/examples/cherenkov_times/index.html
+++ b/dev/examples/cherenkov_times/index.html
@@ -53,4 +53,4 @@ axis = @pgf Axis(
     },
     PlotInc(Coordinates(bincenters(Δts), bincounts(Δts)), raw&quot;\closedcycle&quot;)
 )
-axis</code></pre><p><a href="../cherenkov.pdf">[.pdf]</a>, <a href="../cherenkov.tex">[generated .tex]</a></p><p><img src="../cherenkov.svg" alt/></p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../offline_data/">« Offline data</a><a class="docs-footer-nextpage" href="../orientations/">Orientations »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+axis</code></pre><p><a href="../cherenkov.pdf">[.pdf]</a>, <a href="../cherenkov.tex">[generated .tex]</a></p><p><img src="../cherenkov.svg" alt/></p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../offline_data/">« Offline data</a><a class="docs-footer-nextpage" href="../orientations/">Orientations »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/examples/controlhost/index.html b/dev/examples/controlhost/index.html
index 446dfad5..a31610fe 100644
--- a/dev/examples/controlhost/index.html
+++ b/dev/examples/controlhost/index.html
@@ -31,4 +31,4 @@ e = DAQEvent with 149 snapshot and 6 triggered hits
 e = DAQEvent with 136 snapshot and 6 triggered hits
 ...
 ...
-...</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../orientations/">« Orientations</a><a class="docs-footer-nextpage" href="../hdf5/">HDF5 »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+...</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../orientations/">« Orientations</a><a class="docs-footer-nextpage" href="../hdf5/">HDF5 »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/examples/foo.h5 b/dev/examples/foo.h5
index 92f7dc85e7ab54a36722cddbc0cc81146a402adb..cd8d95aeec0ff67467b1ecee90936335ffcd25f0 100644
GIT binary patch
delta 16
Ycmcava<gQ^84l)+=MQc^&(UQF08eZPr~m)}

delta 16
Ycmcava<gQ^84l+7?me5&b95O307~Kr4FCWD

diff --git a/dev/examples/hdf5/index.html b/dev/examples/hdf5/index.html
index 6433a647..7193b7a9 100644
--- a/dev/examples/hdf5/index.html
+++ b/dev/examples/hdf5/index.html
@@ -4,11 +4,11 @@ using Random
 
 Random.seed!(23)  # to make things reproducible ;)
 
-f = H5File(&quot;foo.h5&quot;, &quot;w&quot;)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">H5File(HDF5.File: (read-write) foo.h5, Dict{String, H5CompoundDataset}(), ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (2, 140655058735536, 140655058738704)))</code></pre><p>We now have an <code>H5File</code> instance which we can use to store datasets.</p><p>Let&#39;s say we have our custom data type (<code>struct</code>) like</p><pre><code class="language-julia hljs">struct Particle
+f = H5File(&quot;foo.h5&quot;, &quot;w&quot;)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">H5File(HDF5.File: (read-write) foo.h5, Dict{String, H5CompoundDataset}(), ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (8, 139639913747662, 139644454441600)))</code></pre><p>We now have an <code>H5File</code> instance which we can use to store datasets.</p><p>Let&#39;s say we have our custom data type (<code>struct</code>) like</p><pre><code class="language-julia hljs">struct Particle
     x::Float32
     y::Float32
     E::Int64
-end</code></pre><p>and we generate instances of <code>Particle</code> in a loop which we want to dump directly into an HDF5 file to the dataset stored at <code>simulation/particles</code>, meaning that <code>simulation</code> is the group name and <code>particles</code> the dataset name.</p><h2 id="Creating-datasets"><a class="docs-heading-anchor" href="#Creating-datasets">Creating datasets</a><a id="Creating-datasets-1"></a><a class="docs-heading-anchor-permalink" href="#Creating-datasets" title="Permalink"></a></h2><p>First, we create our dataset with our type <code>Particle</code>. This is a so called <code>H5CompoundDataset</code> and resembles a dataset wich has a compound type (<code>struct</code>) associated with it:</p><pre><code class="language-julia hljs">dset = create_dataset(f, &quot;simulation/particles&quot;, Particle)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">H5CompoundDataset{Main.Particle}(HDF5.Dataset: /simulation/particles (file: foo.h5 xfer_mode: 0), KM3io.H5CompoundDatasetCache{Main.Particle}(Main.Particle[], 10000), ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (2, 140655058735536, 140655058738704)))</code></pre><p>We fill some random particles using the dummy loop:</p><pre><code class="language-julia hljs">for i in 1:1000
+end</code></pre><p>and we generate instances of <code>Particle</code> in a loop which we want to dump directly into an HDF5 file to the dataset stored at <code>simulation/particles</code>, meaning that <code>simulation</code> is the group name and <code>particles</code> the dataset name.</p><h2 id="Creating-datasets"><a class="docs-heading-anchor" href="#Creating-datasets">Creating datasets</a><a id="Creating-datasets-1"></a><a class="docs-heading-anchor-permalink" href="#Creating-datasets" title="Permalink"></a></h2><p>First, we create our dataset with our type <code>Particle</code>. This is a so called <code>H5CompoundDataset</code> and resembles a dataset wich has a compound type (<code>struct</code>) associated with it:</p><pre><code class="language-julia hljs">dset = create_dataset(f, &quot;simulation/particles&quot;, Particle)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">H5CompoundDataset{Main.Particle}(HDF5.Dataset: /simulation/particles (file: foo.h5 xfer_mode: 0), KM3io.H5CompoundDatasetCache{Main.Particle}(Main.Particle[], 10000), ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (8, 139639913747662, 139644454441600)))</code></pre><p>We fill some random particles using the dummy loop:</p><pre><code class="language-julia hljs">for i in 1:1000
     # creates some random particle
     particle = Particle(rand(), rand(), rand(1:1000))
     # we push to the dataset, just like if it was an Array
@@ -62,4 +62,4 @@ attributes(f)</code></pre><pre class="documenter-example-output"><code class="no
 ├─ 🏷️ can_height
 ├─ 🏷️ can_radius
 ├─ 🏷️ maximum_energy
-└─ 🏷️ minimum_energy</code></pre><p>To access individual attributes, use <code>HDF5.read_attribute</code>:</p><pre><code class="language-julia hljs">read_attribute(f, &quot;can_radius&quot;)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">200</code></pre><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>It is possible to add metadata to datasets and groups too. Make sure that the struct you pass to <code>addmeta()</code> only contains primitive types or strings in their fields. Arrays and other nested or compound fieldtypes are not supported by HDF5.</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../controlhost/">« Accessing Live Data</a><a class="docs-footer-nextpage" href="../../api/">API »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+└─ 🏷️ minimum_energy</code></pre><p>To access individual attributes, use <code>HDF5.read_attribute</code>:</p><pre><code class="language-julia hljs">read_attribute(f, &quot;can_radius&quot;)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">200</code></pre><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>It is possible to add metadata to datasets and groups too. Make sure that the struct you pass to <code>addmeta()</code> only contains primitive types or strings in their fields. Arrays and other nested or compound fieldtypes are not supported by HDF5.</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../controlhost/">« Accessing Live Data</a><a class="docs-footer-nextpage" href="../../api/">API »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/examples/offline_data/index.html b/dev/examples/offline_data/index.html
index 1d019d7b..c129d51f 100644
--- a/dev/examples/offline_data/index.html
+++ b/dev/examples/offline_data/index.html
@@ -68,4 +68,4 @@ f.offline[1].usr</code></pre><pre class="documenter-example-output"><code class=
   &quot;RecoNDF&quot;            =&gt; 37.0
   &quot;FirstPartPosZ&quot;      =&gt; 135.295
   &quot;CoC&quot;                =&gt; 118.63
-  &quot;ChargeAbove&quot;        =&gt; 176.0</code></pre><pre><code class="language-julia hljs">close(f)</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../online_data/">« Online data</a><a class="docs-footer-nextpage" href="../cherenkov_times/">Cherenkov times »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+  &quot;ChargeAbove&quot;        =&gt; 176.0</code></pre><pre><code class="language-julia hljs">close(f)</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../online_data/">« Online data</a><a class="docs-footer-nextpage" href="../cherenkov_times/">Cherenkov times »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/examples/online_data/index.html b/dev/examples/online_data/index.html
index 99746567..8538fdd5 100644
--- a/dev/examples/online_data/index.html
+++ b/dev/examples/online_data/index.html
@@ -3,4 +3,4 @@
 
 f = ROOTFile(datapath(&quot;online&quot;, &quot;km3net_online.root&quot;))</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">ROOTFile{OnlineTree (3 events, 3 summaryslices), OfflineTree (0 events)}</code></pre><p>The <code>ROOTFile</code> is the container object which gives access to both the online and offline tree. In this case, the online tree is empty</p><pre><code class="language-julia hljs">f.offline</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">OfflineTree (0 events)</code></pre><p>and the online tree holds 3 events and 3 summaryslices:</p><pre><code class="language-julia hljs">f.online</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">OnlineTree (3 events, 3 summaryslices)</code></pre><h2 id="Events"><a class="docs-heading-anchor" href="#Events">Events</a><a id="Events-1"></a><a class="docs-heading-anchor-permalink" href="#Events" title="Permalink"></a></h2><p>To access a single event, you can use the usual indexing syntax:</p><pre><code class="language-julia hljs">some_event = f.online.events[2]</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">DAQEvent with 124 snapshot and 53 triggered hits</code></pre><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>While both the offline and online tree contain events which are essentially an array of events (<code>Vector{Evt}</code> respectively <code>Vector{DAQEvent}</code>), the online tree also contains summaryslices and timeslices (timeslices are not implemented yet). For simplicity, indexing into an <code>OfflineTree</code> is directly indexing into events by default, while in case of the <code>OfflineTree</code> the field <code>.events</code> is necessary.</p></div></div><p>or ranges of events:</p><pre><code class="language-julia hljs">events = f.online.events[2:3]</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">2-element Vector{DAQEvent}:
  DAQEvent with 124 snapshot and 53 triggered hits
- DAQEvent with 78 snapshot and 9 triggered hits</code></pre><p>Another way to access events is given by getter function <code>getevent()</code> (which also works for online trees). If a single number if passed, it will be treated as a regular index, just like above:</p><pre><code class="language-julia hljs">event = getevent(f.online, 2)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">DAQEvent with 124 snapshot and 53 triggered hits</code></pre><p>when two numbers are passed, the first one is interpreted as <code>frame_index</code> and the second one as <code>trigger_counter</code>:</p><pre><code class="language-julia hljs">event = getevent(f.online, 127, 1)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">DAQEvent with 124 snapshot and 53 triggered hits</code></pre><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Events in a ROOT tree are not strictly ordered by time or <code>frame_index</code> and <code>trigger_counter</code>, therefore accessing an event via these two parameters needs a traverse through the tree. The indices are cached for future access but you may experience some delays especially dependening on the location of the event in the tree. In future, a fuzzy binary search might be implemented to speed up this process signifficantly.</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../../manual/tools/">« Tools</a><a class="docs-footer-nextpage" href="../offline_data/">Offline data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+ DAQEvent with 78 snapshot and 9 triggered hits</code></pre><p>Another way to access events is given by getter function <code>getevent()</code> (which also works for online trees). If a single number if passed, it will be treated as a regular index, just like above:</p><pre><code class="language-julia hljs">event = getevent(f.online, 2)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">DAQEvent with 124 snapshot and 53 triggered hits</code></pre><p>when two numbers are passed, the first one is interpreted as <code>frame_index</code> and the second one as <code>trigger_counter</code>:</p><pre><code class="language-julia hljs">event = getevent(f.online, 127, 1)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">DAQEvent with 124 snapshot and 53 triggered hits</code></pre><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Events in a ROOT tree are not strictly ordered by time or <code>frame_index</code> and <code>trigger_counter</code>, therefore accessing an event via these two parameters needs a traverse through the tree. The indices are cached for future access but you may experience some delays especially dependening on the location of the event in the tree. In future, a fuzzy binary search might be implemented to speed up this process signifficantly.</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../../manual/tools/">« Tools</a><a class="docs-footer-nextpage" href="../offline_data/">Offline data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/examples/orientations/b6aaed3c.png b/dev/examples/orientations/b6aaed3c.png
deleted file mode 100644
index 9c355c74504a7501dfb1e9d8d3aebbfb7a053589..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 129678
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
GPW=s<-SCY7

diff --git a/dev/examples/orientations/cc83a880.png b/dev/examples/orientations/cc83a880.png
new file mode 100644
index 0000000000000000000000000000000000000000..df923e5be16e737a28086e6bf3f950aa83680908
GIT binary patch
literal 164758
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
R@^k#tx7Wa)Upsot{SW6hw*&wH

literal 0
HcmV?d00001

diff --git a/dev/examples/orientations/index.html b/dev/examples/orientations/index.html
index cb6f6155..e48ef7ea 100644
--- a/dev/examples/orientations/index.html
+++ b/dev/examples/orientations/index.html
@@ -56,4 +56,4 @@ scatter!(ax_pitch_and_roll, times, pitches, label=&quot;pitch&quot;)
 scatter!(ax_pitch_and_roll, times, rolls, label=&quot;roll&quot;)
 axislegend(ax_pitch_and_roll, position = :rt)
 
-fig</code></pre><img src="b6aaed3c.png" alt="Example block output"/></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../cherenkov_times/">« Cherenkov times</a><a class="docs-footer-nextpage" href="../controlhost/">Accessing Live Data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+fig</code></pre><img src="cc83a880.png" alt="Example block output"/></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../cherenkov_times/">« Cherenkov times</a><a class="docs-footer-nextpage" href="../controlhost/">Accessing Live Data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/index.html b/dev/index.html
index 7008f309..823413ba 100644
--- a/dev/index.html
+++ b/dev/index.html
@@ -8,4 +8,4 @@ julia&gt; f.offline
 OfflineTree (10 events)
 
 julia&gt; some_event = f.offline[3]
-KM3io.Evt (3680 hits, 28 MC hits, 38 tracks, 12 MC tracks)</code></pre><h2 id="Acknowledgements"><a class="docs-heading-anchor" href="#Acknowledgements">Acknowledgements</a><a id="Acknowledgements-1"></a><a class="docs-heading-anchor-permalink" href="#Acknowledgements" title="Permalink"></a></h2><p>Thanks to <a href="https://git.km3net.de/jschumann">Johannes Schumann</a> for providing the awesome project logo!</p></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="manual/rootfiles/">ROOT Files »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+KM3io.Evt (3680 hits, 28 MC hits, 38 tracks, 12 MC tracks)</code></pre><h2 id="Acknowledgements"><a class="docs-heading-anchor" href="#Acknowledgements">Acknowledgements</a><a id="Acknowledgements-1"></a><a class="docs-heading-anchor-permalink" href="#Acknowledgements" title="Permalink"></a></h2><p>Thanks to <a href="https://git.km3net.de/jschumann">Johannes Schumann</a> for providing the awesome project logo!</p></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="manual/rootfiles/">ROOT Files »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/manual/auxfiles/index.html b/dev/manual/auxfiles/index.html
index e4b3ca01..9bd8c274 100644
--- a/dev/manual/auxfiles/index.html
+++ b/dev/manual/auxfiles/index.html
@@ -3,4 +3,4 @@
 using KM3NeTTestData
 
 pmtfile = read(datapath(&quot;pmt&quot;, &quot;calibration_00000117_H_1.0.0_00013757_00013826_1.txt&quot;), PMTFile)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">PMTFile containing parameters of 7254 PMTs</code></pre><p>Data for individual PMTs can be accessed by indexing using the module ID and the DAQ channel ID of the PMT:</p><pre><code class="language-julia hljs">pmtdata = pmtfile[806451572, 4]
-pmtdata.gain</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">0.95</code></pre><p>The returned type is <a href="../../api/#KM3io.PMTData"><code>PMTData</code></a> with following fields:</p><pre><code class="language-julia hljs">fieldnames(typeof(pmtdata))</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">(:QE, :gain, :gainSpread, :riseTime_ns, :TTS_ns, :threshold)</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../calibration/">« Calibration</a><a class="docs-footer-nextpage" href="../tools/">Tools »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+pmtdata.gain</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">0.95</code></pre><p>The returned type is <a href="../../api/#KM3io.PMTData"><code>PMTData</code></a> with following fields:</p><pre><code class="language-julia hljs">fieldnames(typeof(pmtdata))</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">(:QE, :gain, :gainSpread, :riseTime_ns, :TTS_ns, :threshold)</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../calibration/">« Calibration</a><a class="docs-footer-nextpage" href="../tools/">Tools »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/manual/calibration/index.html b/dev/manual/calibration/index.html
index 8630a435..7a233f13 100644
--- a/dev/manual/calibration/index.html
+++ b/dev/manual/calibration/index.html
@@ -12,4 +12,4 @@ q = o(module_id,  1693408347)</code></pre><pre class="documenter-example-output"
  -0.5579828704058057</code></pre><p>The quaternions can be converted to <a href="../../api/#KM3io.Compass"><code>Compass</code></a> object which has the fields <code>.yaw</code>, <code>.pitch</code> and <code>.roll</code>:</p><pre><code class="language-julia hljs">compass = Compass(q)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">3-element Compass{Float64} with indices SOneTo(3):
   1.183950558241863
  -0.004362150757249865
- -0.0104520470353834</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../detector/">« Detector and its Components</a><a class="docs-footer-nextpage" href="../auxfiles/">Auxiliary Files »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+ -0.0104520470353834</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../detector/">« Detector and its Components</a><a class="docs-footer-nextpage" href="../auxfiles/">Auxiliary Files »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/manual/detector/index.html b/dev/manual/detector/index.html
index b42e6654..b2e71f24 100644
--- a/dev/manual/detector/index.html
+++ b/dev/manual/detector/index.html
@@ -199,4 +199,4 @@ DOM(806487219, S009 F17)</code></pre><div class="admonition is-warning"><header
   pos: Position{Float64}(474.314, 583.421, 161.816)
   dir: Direction{Float64}(0.819, -0.144, 0.555)
   tâ‚€: 208297.659
-  status: 0</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../rootfiles/">« ROOT Files</a><a class="docs-footer-nextpage" href="../calibration/">Calibration »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+  status: 0</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../rootfiles/">« ROOT Files</a><a class="docs-footer-nextpage" href="../calibration/">Calibration »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/manual/hdf5/index.html b/dev/manual/hdf5/index.html
index 02778716..bf613649 100644
--- a/dev/manual/hdf5/index.html
+++ b/dev/manual/hdf5/index.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>HDF5 Files · KM3io.jl</title><meta name="title" content="HDF5 Files · KM3io.jl"/><meta property="og:title" content="HDF5 Files · KM3io.jl"/><meta property="twitter:title" content="HDF5 Files · KM3io.jl"/><meta name="description" content="Documentation for KM3io.jl."/><meta property="og:description" content="Documentation for KM3io.jl."/><meta property="twitter:description" content="Documentation for KM3io.jl."/><script data-outdated-warner src="../../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="../.."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../../assets/documenter.js"></script><script src="../../search_index.js"></script><script src="../../siteinfo.js"></script><script src="../../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../../assets/themeswap.js"></script><link href="../../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../../"><img src="../../assets/logo.svg" alt="KM3io.jl logo"/></a><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../../">Home</a></li><li><span class="tocitem">Manual</span><ul><li><a class="tocitem" href="../rootfiles/">ROOT Files</a></li><li><a class="tocitem" href="../detector/">Detector and its Components</a></li><li><a class="tocitem" href="../calibration/">Calibration</a></li><li><a class="tocitem" href="../auxfiles/">Auxiliary Files</a></li><li><a class="tocitem" href="../tools/">Tools</a></li></ul></li><li><span class="tocitem">Examples</span><ul><li><a class="tocitem" href="../../examples/online_data/">Online data</a></li><li><a class="tocitem" href="../../examples/offline_data/">Offline data</a></li><li><a class="tocitem" href="../../examples/cherenkov_times/">Cherenkov times</a></li><li><a class="tocitem" href="../../examples/orientations/">Orientations</a></li><li><a class="tocitem" href="../../examples/controlhost/">Accessing Live Data</a></li><li><a class="tocitem" href="../../examples/hdf5/">HDF5</a></li></ul></li><li><a class="tocitem" href="../../api/">API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>HDF5 Files</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>HDF5 Files</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl/blob/main/docs/src/manual/hdf5.md#L" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="HDF5-Files"><a class="docs-heading-anchor" href="#HDF5-Files">HDF5 Files</a><a id="HDF5-Files-1"></a><a class="docs-heading-anchor-permalink" href="#HDF5-Files" title="Permalink"></a></h1><p>...</p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>HDF5 Files · KM3io.jl</title><meta name="title" content="HDF5 Files · KM3io.jl"/><meta property="og:title" content="HDF5 Files · KM3io.jl"/><meta property="twitter:title" content="HDF5 Files · KM3io.jl"/><meta name="description" content="Documentation for KM3io.jl."/><meta property="og:description" content="Documentation for KM3io.jl."/><meta property="twitter:description" content="Documentation for KM3io.jl."/><script data-outdated-warner src="../../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="../.."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../../assets/documenter.js"></script><script src="../../search_index.js"></script><script src="../../siteinfo.js"></script><script src="../../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../../assets/themeswap.js"></script><link href="../../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../../"><img src="../../assets/logo.svg" alt="KM3io.jl logo"/></a><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../../">Home</a></li><li><span class="tocitem">Manual</span><ul><li><a class="tocitem" href="../rootfiles/">ROOT Files</a></li><li><a class="tocitem" href="../detector/">Detector and its Components</a></li><li><a class="tocitem" href="../calibration/">Calibration</a></li><li><a class="tocitem" href="../auxfiles/">Auxiliary Files</a></li><li><a class="tocitem" href="../tools/">Tools</a></li></ul></li><li><span class="tocitem">Examples</span><ul><li><a class="tocitem" href="../../examples/online_data/">Online data</a></li><li><a class="tocitem" href="../../examples/offline_data/">Offline data</a></li><li><a class="tocitem" href="../../examples/cherenkov_times/">Cherenkov times</a></li><li><a class="tocitem" href="../../examples/orientations/">Orientations</a></li><li><a class="tocitem" href="../../examples/controlhost/">Accessing Live Data</a></li><li><a class="tocitem" href="../../examples/hdf5/">HDF5</a></li></ul></li><li><a class="tocitem" href="../../api/">API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>HDF5 Files</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>HDF5 Files</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl/blob/main/docs/src/manual/hdf5.md#L" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="HDF5-Files"><a class="docs-heading-anchor" href="#HDF5-Files">HDF5 Files</a><a id="HDF5-Files-1"></a><a class="docs-heading-anchor-permalink" href="#HDF5-Files" title="Permalink"></a></h1><p>...</p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/manual/rootfiles/index.html b/dev/manual/rootfiles/index.html
index 4269fda5..858dad96 100644
--- a/dev/manual/rootfiles/index.html
+++ b/dev/manual/rootfiles/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>ROOT Files · KM3io.jl</title><meta name="title" content="ROOT Files · KM3io.jl"/><meta property="og:title" content="ROOT Files · KM3io.jl"/><meta property="twitter:title" content="ROOT Files · KM3io.jl"/><meta name="description" content="Documentation for KM3io.jl."/><meta property="og:description" content="Documentation for KM3io.jl."/><meta property="twitter:description" content="Documentation for KM3io.jl."/><script data-outdated-warner src="../../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="../.."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../../assets/documenter.js"></script><script src="../../search_index.js"></script><script src="../../siteinfo.js"></script><script src="../../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../../assets/themeswap.js"></script><link href="../../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../../"><img src="../../assets/logo.svg" alt="KM3io.jl logo"/></a><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../../">Home</a></li><li><span class="tocitem">Manual</span><ul><li class="is-active"><a class="tocitem" href>ROOT Files</a><ul class="internal"><li><a class="tocitem" href="#offline-dataformat"><span>Offline Dataformat</span></a></li><li><a class="tocitem" href="#online_dataformat"><span>Online Dataformat</span></a></li><li><a class="tocitem" href="#xrootd-access"><span>xrootd access</span></a></li></ul></li><li><a class="tocitem" href="../detector/">Detector and its Components</a></li><li><a class="tocitem" href="../calibration/">Calibration</a></li><li><a class="tocitem" href="../auxfiles/">Auxiliary Files</a></li><li><a class="tocitem" href="../tools/">Tools</a></li></ul></li><li><span class="tocitem">Examples</span><ul><li><a class="tocitem" href="../../examples/online_data/">Online data</a></li><li><a class="tocitem" href="../../examples/offline_data/">Offline data</a></li><li><a class="tocitem" href="../../examples/cherenkov_times/">Cherenkov times</a></li><li><a class="tocitem" href="../../examples/orientations/">Orientations</a></li><li><a class="tocitem" href="../../examples/controlhost/">Accessing Live Data</a></li><li><a class="tocitem" href="../../examples/hdf5/">HDF5</a></li></ul></li><li><a class="tocitem" href="../../api/">API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Manual</a></li><li class="is-active"><a href>ROOT Files</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>ROOT Files</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl/blob/main/docs/src/manual/rootfiles.md#L" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="ROOT-Files"><a class="docs-heading-anchor" href="#ROOT-Files">ROOT Files</a><a id="ROOT-Files-1"></a><a class="docs-heading-anchor-permalink" href="#ROOT-Files" title="Permalink"></a></h1><p>The two main types of ROOT files in KM3NeT are the online and offline files, however, both types can be mixed together as the data is stored in distinct ROOT trees. <code>UnROOT</code> has a single <code>ROOTFile</code> type to represent a KM3NeT ROOT file which can be used to access both the online and offline information. This section describes what kind of data is stored in each tree and how to access them.</p><h2 id="offline-dataformat"><a class="docs-heading-anchor" href="#offline-dataformat">Offline Dataformat</a><a id="offline-dataformat-1"></a><a class="docs-heading-anchor-permalink" href="#offline-dataformat" title="Permalink"></a></h2><p>The <a href="https://git.km3net.de/common/km3net-dataformat/-/tree/master/offline">offline dataformat</a> is used to store Monte Carlo (MC) simulations and reconstruction results. The <code>OfflineTree</code> type represents an actual offline file and it is essentially a vector of events (<code>Vector{Evt}</code>) with some fancy caching, lazy access and slicing magic. The offline tree is accessible via the <code>.offline</code> field of the <code>ROOTFile</code> type.</p><h3 id="MC-Header"><a class="docs-heading-anchor" href="#MC-Header">MC Header</a><a id="MC-Header-1"></a><a class="docs-heading-anchor-permalink" href="#MC-Header" title="Permalink"></a></h3><p>The MC header stores metadata related to the simulation chain. The individual entries can be accessed as properties, as shown below.</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io, KM3NeTTestData
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>ROOT Files · KM3io.jl</title><meta name="title" content="ROOT Files · KM3io.jl"/><meta property="og:title" content="ROOT Files · KM3io.jl"/><meta property="twitter:title" content="ROOT Files · KM3io.jl"/><meta name="description" content="Documentation for KM3io.jl."/><meta property="og:description" content="Documentation for KM3io.jl."/><meta property="twitter:description" content="Documentation for KM3io.jl."/><script data-outdated-warner src="../../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="../.."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../../assets/documenter.js"></script><script src="../../search_index.js"></script><script src="../../siteinfo.js"></script><script src="../../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../../assets/themeswap.js"></script><link href="../../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../../"><img src="../../assets/logo.svg" alt="KM3io.jl logo"/></a><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../../">Home</a></li><li><span class="tocitem">Manual</span><ul><li class="is-active"><a class="tocitem" href>ROOT Files</a><ul class="internal"><li><a class="tocitem" href="#offline-dataformat"><span>Offline Dataformat</span></a></li><li><a class="tocitem" href="#online_dataformat"><span>Online Dataformat</span></a></li><li><a class="tocitem" href="#xrootd-access"><span>xrootd access</span></a></li><li><a class="tocitem" href="#oscillations-dataformat"><span>Oscillations Open Dataformat</span></a></li></ul></li><li><a class="tocitem" href="../detector/">Detector and its Components</a></li><li><a class="tocitem" href="../calibration/">Calibration</a></li><li><a class="tocitem" href="../auxfiles/">Auxiliary Files</a></li><li><a class="tocitem" href="../tools/">Tools</a></li></ul></li><li><span class="tocitem">Examples</span><ul><li><a class="tocitem" href="../../examples/online_data/">Online data</a></li><li><a class="tocitem" href="../../examples/offline_data/">Offline data</a></li><li><a class="tocitem" href="../../examples/cherenkov_times/">Cherenkov times</a></li><li><a class="tocitem" href="../../examples/orientations/">Orientations</a></li><li><a class="tocitem" href="../../examples/controlhost/">Accessing Live Data</a></li><li><a class="tocitem" href="../../examples/hdf5/">HDF5</a></li></ul></li><li><a class="tocitem" href="../../api/">API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Manual</a></li><li class="is-active"><a href>ROOT Files</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>ROOT Files</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.km3net.de/common/KM3io.jl/blob/main/docs/src/manual/rootfiles.md#L" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="ROOT-Files"><a class="docs-heading-anchor" href="#ROOT-Files">ROOT Files</a><a id="ROOT-Files-1"></a><a class="docs-heading-anchor-permalink" href="#ROOT-Files" title="Permalink"></a></h1><p>The two main types of ROOT files in KM3NeT are the online and offline files, however, both types can be mixed together as the data is stored in distinct ROOT trees. <code>UnROOT</code> has a single <code>ROOTFile</code> type to represent a KM3NeT ROOT file which can be used to access both the online and offline information. This section describes what kind of data is stored in each tree and how to access them.</p><h2 id="offline-dataformat"><a class="docs-heading-anchor" href="#offline-dataformat">Offline Dataformat</a><a id="offline-dataformat-1"></a><a class="docs-heading-anchor-permalink" href="#offline-dataformat" title="Permalink"></a></h2><p>The <a href="https://git.km3net.de/common/km3net-dataformat/-/tree/master/offline">offline dataformat</a> is used to store Monte Carlo (MC) simulations and reconstruction results. The <code>OfflineTree</code> type represents an actual offline file and it is essentially a vector of events (<code>Vector{Evt}</code>) with some fancy caching, lazy access and slicing magic. The offline tree is accessible via the <code>.offline</code> field of the <code>ROOTFile</code> type.</p><h3 id="MC-Header"><a class="docs-heading-anchor" href="#MC-Header">MC Header</a><a id="MC-Header-1"></a><a class="docs-heading-anchor-permalink" href="#MC-Header" title="Permalink"></a></h3><p>The MC header stores metadata related to the simulation chain. The individual entries can be accessed as properties, as shown below.</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io, KM3NeTTestData
 
 julia&gt; f = ROOTFile(datapath(&quot;offline&quot;, &quot;numucc.root&quot;))
 ROOTFile{OnlineTree (0 events, 0 summaryslices), OfflineTree (10 events)}
@@ -181,4 +181,29 @@ PMT 29: HRV(false) FIFO(true)
 PMT 30: HRV(true) FIFO(false)</code></pre><h2 id="xrootd-access"><a class="docs-heading-anchor" href="#xrootd-access">xrootd access</a><a id="xrootd-access-1"></a><a class="docs-heading-anchor-permalink" href="#xrootd-access" title="Permalink"></a></h2><p>You can access files directly via <code>xrootd</code> by providing the URL on e.g. HPSS. Be aware that URL has to be typed correctly, <code>/</code> instead of <code>//</code> results in an error!), so it should always start with something like <code>root://ccxroot:1999//hpss/...</code>.</p><pre><code class="language-julia hljs">julia&gt; using KM3io
 
 julia&gt; f = ROOTFile(&quot;root://ccxroot:1999//hpss/in2p3.fr/group/km3net/data/raw/sea/KM3NeT_00000132/14/KM3NeT_00000132_00014481.root&quot;)
-ROOTFile{OnlineTree (136335 events, 107632 summaryslices)}</code></pre><p>Now you can use it as if it was on your local filesystem. <code>UnROOT.jl</code> will take care of loading only the needed data from the server.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../../">« Home</a><a class="docs-footer-nextpage" href="../detector/">Detector and its Components »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+ROOTFile{OnlineTree (136335 events, 107632 summaryslices)}</code></pre><p>Now you can use it as if it was on your local filesystem. <code>UnROOT.jl</code> will take care of loading only the needed data from the server.</p><h2 id="oscillations-dataformat"><a class="docs-heading-anchor" href="#oscillations-dataformat">Oscillations Open Dataformat</a><a id="oscillations-dataformat-1"></a><a class="docs-heading-anchor-permalink" href="#oscillations-dataformat" title="Permalink"></a></h2><p>The <a href="https://git.km3net.de/vcarretero/prepare-opendata-orca6-433kty/-/tree/main?ref_type=heads">oscillations dataformat</a> is used to store the responses from a particular oscillations analysis data release. The <code>OSCFile</code> type represents an actual ROOT file and it is essentially a vector of Response like entries (<code>Vector{ResponseMatrixBin}</code>) . Depending on what is stored in the initial ROOT file, neutrinos, data and muons response trees are accessible via the <code>.osc_opendata_nu</code>, <code>.osc_opendata_data</code> and <code>.osc_opendata_muons</code>  fields of the <code>ROOTFile</code> type respectively.</p><h3 id="ResponseMatrixBin"><a class="docs-heading-anchor" href="#ResponseMatrixBin">ResponseMatrixBin</a><a id="ResponseMatrixBin-1"></a><a class="docs-heading-anchor-permalink" href="#ResponseMatrixBin" title="Permalink"></a></h3><p>The <code>ResponseMatrixBin</code> stores individual directions of a bin in order to fill a histogram.</p><pre><code class="language-julia-repl hljs">julia&gt; using KM3io, KM3NeTTestData
+
+julia&gt; f = OSCFile(datapath(&quot;oscillations&quot;, &quot;ORCA6_433kt-y_opendata_v0.4_testdata.root&quot;))
+OSCFile{OscOpenDataTree of Neutrinos (59301 events), OscOpenDataTree of Data (106 events), OscOpenDataTree of Muons (99 events)}
+
+julia&gt; f.osc_opendata_nu
+OscOpenDataTree (59301 events)
+
+julia&gt; f.osc_opendata_nu[1]
+KM3io.ResponseMatrixBinNeutrinos(10, 1, 30, 18, -12, 1, 1, 52.25311519561337, 2730.388047646041)
+
+julia&gt; dump(f.osc_opendata_nu[1])
+KM3io.ResponseMatrixBinNeutrinos
+  E_reco_bin: Int64 10
+  Ct_reco_bin: Int64 1
+  E_true_bin: Int64 30
+  Ct_true_bin: Int64 18
+  Flav: Int16 -12
+  IsCC: Int16 1
+  AnaClass: Int16 1
+  W: Float64 52.25311519561337
+  Werr: Float64 2730.388047646041
+
+julia&gt; f.osc_opendata_data[1]
+KM3io.ResponseMatrixBinData(2, 6, 1, 2.0)
+</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../../">« Home</a><a class="docs-footer-nextpage" href="../detector/">Detector and its Components »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/manual/tools/index.html b/dev/manual/tools/index.html
index 0a1e363c..9fd30239 100644
--- a/dev/manual/tools/index.html
+++ b/dev/manual/tools/index.html
@@ -31,4 +31,4 @@ f = ROOTFile(datapath(&quot;offline&quot;, &quot;km3net_offline.root&quot;))</co
  Trk(1, Position{Float64}(465.057, 532.682, 80.732), Direction{Float64}(-0.175, 0.521, -0.835), 8.106927901568094e7, 99.10458562488608, 0.0, 96.75133289411137, 4000, Int32[1, 3, 5, 4], FitInformation([0.01837814570268761, 0.009401304503949024, -96.75133289411137, 72.0, 99.10458562488608, 1.7976931348623157e308, 259.2943164149993, 59.0, 16.87128649083537, 24.773873409176925, 59.43893182922881, 0.0, 0.0, 344.9767431592819, -178.51901912484058, 790.0, 54.0]))
  Trk(1, Position{Float64}(456.976, 592.751, 193.825), Direction{Float64}(-0.082, -0.122, -0.989), 2.128187723727164e7, 99.10458562488608, 0.0, 560.2775306614813, 4000, Int32[1, 3, 5, 4], FitInformation([0.0022862363916181096, 0.0015619992272287897, -560.2775306614813, 261.0, 99.10458562488608, 1.7976931348623157e308, 5.84464995424756, 52.0, 91.37269495454369, 148.1224810941145, 165.70400027827318, 0.0, 0.0, 344.9767431592819, -654.1882814711497, 2526.0, 198.0]))
  Trk(1, Position{Float64}(439.747, 590.475, 203.835), Direction{Float64}(-0.102, -0.230, -0.968), 1.6513108700491736e7, 37.8551524925863, 0.0, 278.2872951665753, 4000, Int32[1, 3, 5, 4], FitInformation([0.006041091149104179, 0.0035514113196960105, -278.2872951665753, 118.0, 37.8551524925863, 265.5559310077148, 52.601849588228035, 53.0, 40.65396902507262, 46.54735947527185, 97.27912085164719, 0.0, 0.0, 141.61500301253315, -Inf, 2713.0, 88.0]))
- Trk(1, Position{Float64}(439.743, 546.334, 58.645), Direction{Float64}(0.187, 0.540, -0.821), 4.717893801990337e7, 99.10458562488608, 0.0, 99.59098153341449, 4000, Int32[1, 3, 5, 4], FitInformation([0.024623519864386552, 0.014331655995648987, -99.59098153341449, 47.0, 99.10458562488608, 1.7976931348623157e308, 64.29114949672314, 51.0, 22.75185164189341, 22.75185164189341, 33.78774068100958, 0.0, 0.0, 344.9767431592819, -115.80151219196675, 480.0, 35.0]))</code></pre><p>Let&#39;s close our file <code>;)</code></p><pre><code class="language-julia hljs">close(f)</code></pre><h2 id="Trigger-masks/flags"><a class="docs-heading-anchor" href="#Trigger-masks/flags">Trigger masks/flags</a><a id="Trigger-masks/flags-1"></a><a class="docs-heading-anchor-permalink" href="#Trigger-masks/flags" title="Permalink"></a></h2><p>KM3NeT uses a 64bit integer type to store information about which triggers have fired for a given event or hit. The index of the bit which indicates if a specific trigger has fired is defined in the <a href="https://git.km3net.de/common/km3net-dataformat">KM3NeT Dataformat</a> specification which is used in <code>KM3io.jl</code>.</p><p>Functions to check if a trigger has fired are for example</p><ul><li><a href="../../api/#KM3io.is3dmuon"><code>is3dmuon()</code></a></li><li><a href="../../api/#KM3io.is3dshower"><code>is3dshower()</code></a></li><li><a href="../../api/#KM3io.ismxshower"><code>ismxshower()</code></a></li><li><a href="../../api/#KM3io.isnb"><code>isnb()</code></a></li></ul><p>which all accept either an event is input or something which has a <code>.trigger_mask</code> field, like a triggered hit.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../auxfiles/">« Auxiliary Files</a><a class="docs-footer-nextpage" href="../../examples/online_data/">Online data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Monday 24 February 2025 15:08">Monday 24 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+ Trk(1, Position{Float64}(439.743, 546.334, 58.645), Direction{Float64}(0.187, 0.540, -0.821), 4.717893801990337e7, 99.10458562488608, 0.0, 99.59098153341449, 4000, Int32[1, 3, 5, 4], FitInformation([0.024623519864386552, 0.014331655995648987, -99.59098153341449, 47.0, 99.10458562488608, 1.7976931348623157e308, 64.29114949672314, 51.0, 22.75185164189341, 22.75185164189341, 33.78774068100958, 0.0, 0.0, 344.9767431592819, -115.80151219196675, 480.0, 35.0]))</code></pre><p>Let&#39;s close our file <code>;)</code></p><pre><code class="language-julia hljs">close(f)</code></pre><h2 id="Trigger-masks/flags"><a class="docs-heading-anchor" href="#Trigger-masks/flags">Trigger masks/flags</a><a id="Trigger-masks/flags-1"></a><a class="docs-heading-anchor-permalink" href="#Trigger-masks/flags" title="Permalink"></a></h2><p>KM3NeT uses a 64bit integer type to store information about which triggers have fired for a given event or hit. The index of the bit which indicates if a specific trigger has fired is defined in the <a href="https://git.km3net.de/common/km3net-dataformat">KM3NeT Dataformat</a> specification which is used in <code>KM3io.jl</code>.</p><p>Functions to check if a trigger has fired are for example</p><ul><li><a href="../../api/#KM3io.is3dmuon"><code>is3dmuon()</code></a></li><li><a href="../../api/#KM3io.is3dshower"><code>is3dshower()</code></a></li><li><a href="../../api/#KM3io.ismxshower"><code>ismxshower()</code></a></li><li><a href="../../api/#KM3io.isnb"><code>isnb()</code></a></li></ul><p>which all accept either an event is input or something which has a <code>.trigger_mask</code> field, like a triggered hit.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../auxfiles/">« Auxiliary Files</a><a class="docs-footer-nextpage" href="../../examples/online_data/">Online data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.8.1 on <span class="colophon-date" title="Friday 28 February 2025 15:01">Friday 28 February 2025</span>. Using Julia version 1.10.4.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/objects.inv b/dev/objects.inv
index 7a67663c89199a23977d9008bd4b6844a9c22314..593542a6f18c5155b8688de48cdedc955a153ff8 100644
GIT binary patch
delta 1949
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

delta 1856
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

diff --git a/dev/search_index.js b/dev/search_index.js
index e1f96f48..6ab45f52 100644
--- a/dev/search_index.js
+++ b/dev/search_index.js
@@ -1,3 +1,3 @@
 var documenterSearchIndex = {"docs":
-[{"location":"manual/auxfiles/#Auxiliary-Files","page":"Auxiliary Files","title":"Auxiliary Files","text":"","category":"section"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"There are a bunch of auxiliary file formats in KM3NeT which are used in different stages of processing and calibration procedures. KM3io.jl supports many of them by defining a container type and extending the Base.read function so that the general pattern is:","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"f = read(\"path/to/the.file\", FileContainerType)","category":"page"},{"location":"manual/auxfiles/#PMT-File","page":"Auxiliary Files","title":"PMT File","text":"","category":"section"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"The container type PMTFile is used to load PMT files which are produced by the K40 calibration procedure in Jpp.","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"Below is an example, using a PMT file from the KM3NeTTestData.jl package.","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"using KM3io\nusing KM3NeTTestData\n\npmtfile = read(datapath(\"pmt\", \"calibration_00000117_H_1.0.0_00013757_00013826_1.txt\"), PMTFile)","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"Data for individual PMTs can be accessed by indexing using the module ID and the DAQ channel ID of the PMT:","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"pmtdata = pmtfile[806451572, 4]\npmtdata.gain","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"The returned type is PMTData with following fields:","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"fieldnames(typeof(pmtdata))","category":"page"},{"location":"manual/detector/#Detector-and-its-Components","page":"Detector and its Components","title":"Detector and its Components","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"In this example, we will explore the components of a KM3NeT detector, which is represented by the Detector type in KM3io.jl. The detector description is stored in so-called DETX and DATX files, named after their filename extensions .detx (ASCII) and .datx (binary) respectively. By time of writing this example, v5 is the latest format version.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"note: Note\nKM3io.jl offers conversions between the different DETX format versions. Typically, each major version brings a new set of parameters. Downgrading is therefore not lossless. When when upgrading from one version to another, the new parameters needs to be filled in. Some of these can be calculated from existing ones, like the module position, which was introduced in v4 and is equal to the crossing point of the PMT axes. Otherwise, these parameters are either set to meaningful default values or to missing.","category":"page"},{"location":"manual/detector/#Loading-a-DETX/DATX-File","page":"Detector and its Components","title":"Loading a DETX/DATX File","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"The Detector type has a constructor which takes a filepath to a DETX or DATX file. The KM3NeTTestData.jl offers a collection of detector sample files, so let's pick one of them:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"using KM3io, KM3NeTTestData\n\ndet = Detector(datapath(\"detx\", \"detx_v5.detx\"))","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"A detector configuration (format version 5) has been loaded with 6 strings (sometimes also called detection unit or DU) holding a total 114 modules.","category":"page"},{"location":"manual/detector/#Retrieve-a-detector-from-the-DB","page":"Detector and its Components","title":"Retrieve a detector from the DB","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"KM3io.jl comes with a KM3DB.jl extension which allows to load detector information directly from the database. The extension is automatically loaded when KM3DB is imported:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"using KM3io\nusing KM3DB\n\ndet = Detector(133)","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Keyword arguments passed as Detector(det_id; kwarg1=..., kwarg2=..., ...) are handed over to the detx() function in KM3DB.jl.","category":"page"},{"location":"manual/detector/#Accessing-Modules","page":"Detector and its Components","title":"Accessing Modules","text":"","category":"section"},{"location":"manual/detector/#Iterating-over-all-modules","page":"Detector and its Components","title":"Iterating over all modules","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"There are multiple ways to access modules within a Detector. One of them is iterating over it, which yields DetectorModule instances in no specific order:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"for m in det\n    println(m)\nend","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"warning: Warning\nmodule is a reserved keyword in Julia and mod is the \"modulo function\", so keep this in mind when chosing a variable name for a DetectorModule. Most of the time m is fine, or just be verbose with detector_module and use your editors tab-completion.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"As we can see in the output, there are two types of modules: optical modules and base modules. The main difference between the two in the detector file context is that base modules do not contain PMTs and are always sitting on floor 0.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"note: Note\nAlthough iterating over a Detector feels like iterating over a vector, accessing single elements via det[idx] will not work as such since it requires the idx to be a module ID. This design was chosen since the detector dataformat specification does not specify module ordering, so there is no such thing as the \"n-th module\". Accessing modules by their module ID however is the standard use case, see below.","category":"page"},{"location":"manual/detector/#Detector-Modules","page":"Detector and its Components","title":"Detector Modules","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Modules have a unique identification number called module ID (sometimes also called \"DOM ID\", where DOM stands for \"Digital Optical Module\") and we can use this ID to access individual modules within a Detector instance.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"The .modules field is a dictionary which maps the modules to their module IDs:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"det.modules","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"A flat vector of modules can be obtained with:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"modules(det)","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"To access a module with a given module ID, one can either use the dictionary or index the Detector directly, which is the recommended way:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"detector_module = det[808468425]","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Or for a given string and floor:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"det[3, 15]","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"It is possible to select all modules for a given floor on all strings using  the : syntax. Here we select all the base modules on each string:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"det[:, 0]","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Another way is using the getmodule(d::Detector, string::Integer, floor::Integer) function to access a module on a given string and floor:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"detector_module = getmodule(det, 3, 15)","category":"page"},{"location":"manual/detector/#PMTs","page":"Detector and its Components","title":"PMTs","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Each optical module consists of PMTs, which can be access using the getpmts(m::DetectorModule) function:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"getpmts(detector_module)","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"To access a specific PMT with a given channel ID (TDC ID), use the getpmt(m::DetectorModule, channel_id::Integer) function. Here, we access the PMT at DAQ channel 0 of our previously obtained detector module:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"getpmt(detector_module, 0)","category":"page"},{"location":"manual/calibration/#Calibration","page":"Calibration","title":"Calibration","text":"","category":"section"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"In general, data related to detector calibration are either stored in the database or in the Calibration Archive.","category":"page"},{"location":"manual/calibration/#Hits","page":"Calibration","title":"Hits","text":"","category":"section"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"Hit calibration is implemented but not documented here yet. Check out the docs for calibrate().","category":"page"},{"location":"manual/calibration/#Module-Orientations","page":"Calibration","title":"Module Orientations","text":"","category":"section"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"Module orientation data is stored in ROOT files which are generated by the Jpp framework. The corresponding ROOT files, which are the output of the dynamic calibration procedure, are stored in the Calibration Archive under orientations/.","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"KM3io.jl extends the Base.read function with a method which reads the whole orientations file at once in an object of type Orientations. This object can be called to calculate the orientation of a module (as a quaternion) for a given time, as long as the time is within the time range of the orientation data. The quaternions from the orientation data are interpolated for the given time using slerp().","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"The following example shows how to read the orientation data and obtain the orientation quaternion for a module at a given time.","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"using KM3io, KM3NeTTestData\n\no = read(datapath(\"calib\", \"KM3NeT_00000133_D_1.0.0_00017397_00017496_1.orientations.root\"), Orientations)\n\nmodule_id = 817589211\n\nq = o(module_id,  1693408347)","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"The quaternions can be converted to Compass object which has the fields .yaw, .pitch and .roll:","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"compass = Compass(q)","category":"page"},{"location":"examples/controlhost/#Accessing-Live-Data","page":"Accessing Live Data","title":"Accessing Live Data","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"This example shows how to access and process live data (events) from the KM3NeT DAQ system. We will use two Jpp command line tools (JLigier and JRegurgitate) to create a ligier dispatcher and send triggered DAQ events to it.","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"This example uses Jpp v14.4.3 and real data from a KM3NeT detector (online ROOT format) with the filename KM3NeT_00000075_00010275.root which can be found on the HPSS storage.","category":"page"},{"location":"examples/controlhost/#Launching-JLigier","page":"Accessing Live Data","title":"Launching JLigier","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"We open a terminal and launch the JLigier process with a high debug level. This ligier is the central communication point and it will receive messages which are tagged with short label of maximum 8 characters.","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"$ JLigier -P 5553 -d 3\nPort              5553\nMemory limit 16760735744\nQueue  limit        100","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"The ligier is now running and and listening on port 5553 of all host IP addresses (including the localhost 127.0.0.1). Clients can connect to it and subscribe for a given set of message tags. Leave this terminal open.","category":"page"},{"location":"examples/controlhost/#Simulating-the-DAQ","page":"Accessing Live Data","title":"Simulating the DAQ","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"The first client we start in new terminal session is the JRegurgitate process which takes a ROOT file (in online format), a class identifier, a few other parameters like the frequency and timeout of the messages and also the IP and port of the ligier to send to. We will use this application to simulate the KM3NeT DAQ – at least the output of the JDataFilter which is responsible for triggering events and sending them downstreams to a JLigier so that they can be picked up by the JDataWriter to store them in  ROOT files (online format).","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"$ JRegurgitate -f /data/sea/KM3NeT_00000075_00010275.root -C JDAQEvent -R 2 -T 10000000 -H 127.0.0.1:5553","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"This program is fairly quite but if you look at the terminal where the JLigier is running, you'll see a flood of messages, showing that a new client has connected and data is received (tagged with IO_EVT). It also prints the number of bytes of each message:","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"$ JLigier -P 5553 -d 3\nPort              30001\nMemory limit 16760735744\nQueue  limit        100\nNew client[4]\nClient[4].read(0,1,1756)\nClient[4].read(1,2,0)\nMessage[4] IO_EVT 1772\nClient[4].read(0,1,1394)\nClient[4].read(1,2,0)\nMessage[4] IO_EVT 1410\nClient[4].read(0,1,1716)\n...\n...\n...","category":"page"},{"location":"examples/controlhost/#Retrieving-Events","page":"Accessing Live Data","title":"Retrieving Events","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"Now open a thrid terminal and fire up the Julia REPL. With a few lines, we will able to connect to the ligier and receive DAQ events interactively.","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"julia> using KM3io\n\njulia> c = CHClient{KM3io.DAQEvent}(ip\"127.0.0.1\", 5553)\nCHClient{DAQEvent}(ip\"127.0.0.1\", 0x7531, CHTag[CHTag(\"IO_EVT\")], Sockets.TCPSocket(RawFD(20) open, 0 bytes waiting))\n\njulia> for e in c\n         @show e\n       end\ne = DAQEvent with 126 snapshot and 7 triggered hits\ne = DAQEvent with 138 snapshot and 6 triggered hits\ne = DAQEvent with 149 snapshot and 6 triggered hits\ne = DAQEvent with 149 snapshot and 6 triggered hits\ne = DAQEvent with 136 snapshot and 6 triggered hits\n...\n...\n...","category":"page"},{"location":"api/#API","page":"API","title":"API","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"","category":"page"},{"location":"api/#Basic-Data-Structures","page":"API","title":"Basic Data Structures","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"Position\nDirection\nLocation","category":"page"},{"location":"api/#KM3io.Position","page":"API","title":"KM3io.Position","text":"struct Position{T} <: StaticArraysCore.FieldVector{3, T}\n\nA vector to represent a position in 3D.\n\nFields\n\nx::Any\ny::Any\nz::Any\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Direction","page":"API","title":"KM3io.Direction","text":"struct Direction{T<:AbstractFloat} <: StaticArraysCore.FieldVector{3, T<:AbstractFloat}\n\nA vector to represent a direction in 3D.\n\nFields\n\nx::AbstractFloat\ny::AbstractFloat\nz::AbstractFloat\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Location","page":"API","title":"KM3io.Location","text":"struct Location\n\nA module's location in the detector where string represents the detection unit identifier and floor counts from 0 from the bottom to top. Base modules are sitting on floor 0 and optical modules on floor 1 and higher.\n\nFields\n\nstring::Int32\nfloor::Int8\n\n\n\n\n\n","category":"type"},{"location":"api/#Offline-Format","page":"API","title":"Offline Format","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"Evt\nCalibratedHit\nCalibratedMCHit\nXCalibratedHit\nTrk\nMCTrk\nFitInformation","category":"page"},{"location":"api/#KM3io.Evt","page":"API","title":"KM3io.Evt","text":"struct Evt\n\nAn offline event.\n\nFields\n\nid::Int64\ndet_id::Int64\nmc_id::Int64\nrun_id::Int64\nmc_run_id::Int64\nframe_index::Int64\ntrigger_mask::UInt64\ntrigger_counter::UInt64\noverlays::UInt64\nt::UTCTime\nhits::Vector{CalibratedHit}\ntrks::Vector{Trk}\nw::Vector{Float64}\nw2list::Vector{Float64}\nw3list::Vector{Float64}\nmc_event_time::UTCTime\nmc_t::Float64\nmc_hits::Vector{CalibratedMCHit}\nmc_trks::Vector{MCTrk}\nindex::Int64\nflags::Int64\nusr::Dict{String, Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedHit","page":"API","title":"KM3io.CalibratedHit","text":"struct CalibratedHit <: AbstractCalibratedHit\n\nA calibrated hit of the offline dataformat. Caveat: the position, direction and t fields might still be 0 due to the design philosophy of the offline format (one class for all).\n\nFields\n\ndom_id::Int32\nchannel_id::UInt32\ntdc::UInt32\ntot::UInt32\ntrigger_mask::UInt64\nt::Float64\npos::Position{Float64}\ndir::Direction{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedMCHit","page":"API","title":"KM3io.CalibratedMCHit","text":"struct CalibratedMCHit <: KM3io.AbstractCalibratedMCHit\n\nA calibrated MC hit of the offline dataformat. Caveat: the position and direction fields might still be 0 due to the design philosophy of the offline format (one class for all).\n\nFields\n\npmt_id::Int32\nt::Float64\na::Float64\ntype::Int32\norigin::Int32\npos::Position{Float64}\ndir::Direction{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.XCalibratedHit","page":"API","title":"KM3io.XCalibratedHit","text":"struct XCalibratedHit <: AbstractCalibratedHit\n\nA fully dressed hit with all calibration information which can be obtained. This structure is similar to the Hit structure in aanet and should be used wisely. Most of the time it's much more performant to use dedicated (simplified) structures.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt32\nt::Float64\ntot::UInt8\ntrigger_mask::UInt64\npos::Position{Float64}\ndir::Direction{Float64}\nt0::Float64\nstring::UInt8\nfloor::UInt8\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Trk","page":"API","title":"KM3io.Trk","text":"struct Trk\n\nRepresents a reconstructed \"track\", which can be e.g. a muon track but also a shower.\n\nFields\n\nid::Int64\npos::Position{Float64}\ndir::Direction{Float64}\nt::Float64\nE::Float64\nlen::Float64\nlik::Float64\nrec_type::Int32\nrec_stages::Vector{Int32}\nfitinf::FitInformation\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.MCTrk","page":"API","title":"KM3io.MCTrk","text":"struct MCTrk\n\nA simulated (Monte Carlo, hence \"MC\") track (or shower).\n\nFields\n\nid::Int64\npos::Position{Float64}\ndir::Direction{Float64}\nt::Float64\nE::Float64\nlen::Float64\ntype::Int32\nstatus::Int32\nmother_id::Int32\ncounter::Int32\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.FitInformation","page":"API","title":"KM3io.FitInformation","text":"struct FitInformation\n\nA container object to store fit information which uses 0-based indexing. It implements the array interface. The entries is this vector are float values and their position encodes the meaning of their meaning which is defined in the KM3NeT DataFormat\n\nnote: Note\nThe elements of this object should always be accessed using constants defined in KM3io.FITINFORMATION. The use of magic numbers should be avoided to ensure that future changes in the KM3NeT DataFormat do not break existing code.\n\nFields\n\nvalues::Vector{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Online-Format","page":"API","title":"Online Format","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"DAQEvent\nEventHeader\nSnapshotHit\nTriggeredHit\nCalibratedSnapshotHit\nCalibratedTriggeredHit\nUTCTime\nUTCExtended\nSummaryslice\nSummarysliceHeader\nSummaryFrame","category":"page"},{"location":"api/#KM3io.DAQEvent","page":"API","title":"KM3io.DAQEvent","text":"struct DAQEvent\n\nA (triggered) event holding snapshot hits and triggered hits. The triggered hits are a subset of the snapshot hits.\n\nFields\n\nheader::EventHeader\nsnapshot_hits::Vector{SnapshotHit}\ntriggered_hits::Vector{TriggeredHit}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.EventHeader","page":"API","title":"KM3io.EventHeader","text":"struct EventHeader\n\nThe header of an event.\n\nFields\n\ndetector_id::Int32\nrun::Int32\nframe_index::Int32\nt::UTCExtended\ntrigger_counter::UInt64\ntrigger_mask::UInt64\noverlays::UInt32\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.SnapshotHit","page":"API","title":"KM3io.SnapshotHit","text":"struct SnapshotHit <: KM3io.AbstractDAQHit\n\nA snapshot hit.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt8\nt::Int32\ntot::UInt8\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.TriggeredHit","page":"API","title":"KM3io.TriggeredHit","text":"struct TriggeredHit <: KM3io.AbstractDAQHit\n\nA hit which was triggered.\n\nFields\n\ndom_id::Int32\nchannel_id::UInt8\nt::Int32\ntot::UInt8\ntrigger_mask::UInt64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedSnapshotHit","page":"API","title":"KM3io.CalibratedSnapshotHit","text":"struct CalibratedSnapshotHit <: AbstractCalibratedHit\n\nA calibrated snapshot hit.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt8\nt::Float64\ntot::UInt8\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedTriggeredHit","page":"API","title":"KM3io.CalibratedTriggeredHit","text":"struct CalibratedTriggeredHit <: AbstractCalibratedHit\n\nA calibrated triggered hit.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt8\nt::Float64\ntot::UInt8\ntrigger_mask::UInt64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.UTCTime","page":"API","title":"KM3io.UTCTime","text":"struct UTCTime\n\nA basic time structure with seconds and nanoseconds. The seconds are counting from the start of the epoch, just like the UNIX time.\n\nFields\n\ns::UInt64\nns::UInt64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.UTCExtended","page":"API","title":"KM3io.UTCExtended","text":"struct UTCExtended\n\nAn extended time structure which contains the White Rabbit time synchronisation status. wr_status == 0 means that the synchronisation is OK.\n\nFields\n\ns::UInt32\nns::UInt32\nwr_status::Int64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Summaryslice","page":"API","title":"KM3io.Summaryslice","text":"struct Summaryslice\n\nA summaryslice is a condensed timeslice with the header information of the corresponding timeslice and a summary frame for each optical module. The hit information of the original timeslice is reduced so that for each PMT a single byte is used to encode the hit rate.\n\nFields\n\nheader::SummarysliceHeader\nframes::Vector{SummaryFrame}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.SummarysliceHeader","page":"API","title":"KM3io.SummarysliceHeader","text":"struct SummarysliceHeader\n\nThe header of a summaryslice.\n\nFields\n\ndetector_id::Int32\nrun::Int32\nframe_index::Int32\nt::UTCExtended\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.SummaryFrame","page":"API","title":"KM3io.SummaryFrame","text":"struct SummaryFrame\n\nA SummaryFrame contains reduced timeslice data from an optical module.\n\nThe PMT rates are encoded as single bytes and can be converted to real hit rates using the rates(s::SummaryFrame) function.\n\nFields\n\ndom_id::Int32\ndaq::UInt32\nstatus::UInt32\nfifo::UInt32\nstatus3::UInt32\nstatus4::UInt32\nrates::StaticArraysCore.SVector{31, UInt8}\n\n\n\n\n\n","category":"type"},{"location":"api/#HDF5","page":"API","title":"HDF5","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"H5File\nH5CompoundDataset\naddmeta\ncreate_dataset\nflush","category":"page"},{"location":"api/#KM3io.H5File","page":"API","title":"KM3io.H5File","text":"struct H5File\n\nA wrapper for an HDF5 file used in KM3NeT.\n\nFields\n\n_h5f::HDF5.File\n_datasets::Dict{String, H5CompoundDataset}\n_lock::ReentrantLock\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.H5CompoundDataset","page":"API","title":"KM3io.H5CompoundDataset","text":"struct H5CompoundDataset{T}\n\nA flat HDF5 compound dataset which is essentially a vector of structs. It has a cache which is filled when elements are pushed to it. The cache is automatically written to the target HDF5 path when full.\n\nFields\n\ndset::HDF5.Dataset\ncache::KM3io.H5CompoundDatasetCache\n_lock::ReentrantLock\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.addmeta","page":"API","title":"KM3io.addmeta","text":"addmeta(\n    dset::Union{HDF5.Dataset, HDF5.Datatype, HDF5.File, HDF5.Group},\n    object\n)\n\n\nAttaches key-value-pair meta entries to an HDF5 instance for each field of the given object.\n\n\n\n\n\n","category":"function"},{"location":"api/#HDF5.create_dataset","page":"API","title":"HDF5.create_dataset","text":"create_dataset(\n    f::H5File,\n    path::AbstractString,\n    ::Type{T};\n    cache_size,\n    chunk,\n    filters,\n    kwargs...\n) -> H5CompoundDataset\n\n\nCreates a one-dimensional compound dataset H5CompoundDataset of a given type which can be extended one-by-one. The cache is used to accumulate data and reduce the number of dataset extensions. Each time the cache is full, the HDF5 dataset will be extended, the buffer written and cleared.\n\nTo force the writing, use flush\n\n\n\n\n\n","category":"function"},{"location":"api/#Base.flush","page":"API","title":"Base.flush","text":"flush(d::H5CompoundDataset; nolock) -> H5CompoundDataset\n\n\nForces the cache to be written to the HDF5 file.\n\n\n\n\n\n","category":"function"},{"location":"api/#Hardware","page":"API","title":"Hardware","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"PMT\nDetectorModule\nDetector\nPMTFile\nPMTData\nmodules\ngetmodule\ngetpmt\nhaslocation\nhasstring\nisbasemodule\nisopticalmodule\nwrite(::AbstractString, ::Detector)\nwrite(::IO, ::Detector)\nHydrophone\nread(::AbstractString, ::Type{Hydrophone})\nTripod\nread(::AbstractString, ::Type{Tripod})\nwrite(::AbstractString, ::Vector{Tripod})\npiezoenabled\nhydrophoneenabled\ncenter\nStringMechanics\nStringMechanicsParameters\nread(::AbstractString, ::Type{StringMechanics})","category":"page"},{"location":"api/#KM3io.PMT","page":"API","title":"KM3io.PMT","text":"struct PMT\n\nThe photomultiplier tube of an optical module. The id stands for the DAQ channel ID.\n\nA non-zero status means the PMT is \"not OK\". Individual bits can be read out to identify the problem (see definitions/pmt_status.jl for the bit positions and check them using the nthbitset() function).\n\nFields\n\nid::Int32\npos::Position{Float64}\ndir::Direction{Float64}\nt₀::Float64\nstatus::Union{Missing, Int32}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.DetectorModule","page":"API","title":"KM3io.DetectorModule","text":"struct DetectorModule\n\nEither a base module or an optical module. A non-zero status means the module is \"not OK\". Individual bits can be read out to identify the problem (see definitions/module_status.jl for the bit positions and check them using the nthbitset() function).\n\nFields\n\nid::Int32\npos::Position{Float64}\nlocation::Location\nn_pmts::Int8\npmts::Vector{PMT}\nq::Union{Missing, Quaternion{Float64}}\nstatus::Int32\nt₀::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Detector","page":"API","title":"KM3io.Detector","text":"struct Detector\n\nA KM3NeT detector.\n\nFields\n\nversion::Int8\nid::Int32\nvalidity::Union{Missing, KM3io.DateRange}\npos::Union{Missing, UTMPosition{Float64}}\nutm_ref_grid::Union{Missing, String}\nn_modules::Int32\nmodules::Dict{Int32, DetectorModule}\nlocations::Dict{Tuple{Int64, Int64}, DetectorModule}\nstrings::Vector{Int64}\ncomments::Vector{String}\n_pmt_id_module_map::Dict{Int64, DetectorModule}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.PMTFile","page":"API","title":"KM3io.PMTFile","text":"struct PMTFile\n\nA container type to hold PMT data which are stored in \"PMT files\", created by K40 calibrations. This type can be passe to Base.read to load the contents of such a file.\n\nExample\n\njulia> f = read(\"path/to/pmt.txt\", PMTFile)\nPMTFile containing parameters of 7254 PMTs\n\nFields\n\nQE::Float64\nmu::Float64\ncomments::Vector{String}\nparameters::KM3io.PMTParameters\npmt_data::Dict{Tuple{Int64, Int64}, PMTData}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.PMTData","page":"API","title":"KM3io.PMTData","text":"struct PMTData\n\nPMT parameters as stored in PMTFiles.\n\nFields\n\nQE::Float64\ngain::Float64\ngainSpread::Float64\nriseTime_ns::Float64\nTTS_ns::Float64\nthreshold::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.modules","page":"API","title":"KM3io.modules","text":"modules(d::Detector) -> Vector{DetectorModule}\n\n\nReturn a vector of all modules of a given detector.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.getmodule","page":"API","title":"KM3io.getmodule","text":"getmodule(d::Detector, module_id::Integer) -> DetectorModule\n\n\nReturn the detector module for a given module ID.\n\n\n\n\n\ngetmodule(\n    d::Detector,\n    string::Integer,\n    floor::Integer\n) -> DetectorModule\n\n\nReturn the detector module for a given string and floor.\n\n\n\n\n\ngetmodule(\n    d::Detector,\n    loc::Tuple{T<:Integer, T<:Integer}\n) -> DetectorModule\n\n\nReturn the detector module for a given string and floor (as Tuple).\n\n\n\n\n\ngetmodule(d::Detector, loc::Location) -> DetectorModule\n\n\nReturn the detector module for a given location.\n\n\n\n\n\ngetmodule(d::Detector, hit::KM3io.AbstractDAQHit) -> Any\n\n\nReturn the detector module for a given DAQ hit.\n\n\n\n\n\ngetmodule(\n    d::Detector,\n    hit::KM3io.AbstractMCHit\n) -> DetectorModule\n\n\nReturn the detector module for a given MC hit.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.getpmt","page":"API","title":"KM3io.getpmt","text":"getpmt(d::DetectorModule, channel_id::Integer) -> Any\n\n\nGet the PMT for a given DAQ channel ID (TDC)\n\n\n\n\n\ngetpmt(d::Detector, hit::KM3io.AbstractDAQHit) -> Any\n\n\nReturn the PMT for a given hit.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.haslocation","page":"API","title":"KM3io.haslocation","text":"haslocation(d::Detector, loc::Location) -> Bool\n\n\nReturns true if there is a module at the given location.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hasstring","page":"API","title":"KM3io.hasstring","text":"hasstring(d::Detector, s::Integer) -> Union{Missing, Bool}\n\n\nReturns true if there is a string with a given number.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.isbasemodule","page":"API","title":"KM3io.isbasemodule","text":"isbasemodule(d::DetectorModule) -> Bool\n\n\nReturns true if the module is a basemodule.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.isopticalmodule","page":"API","title":"KM3io.isopticalmodule","text":"isopticalmodule(d::DetectorModule) -> Bool\n\n\nReturns true if the module is an optical module.\n\n\n\n\n\n","category":"function"},{"location":"api/#Base.write-Tuple{AbstractString, Detector}","page":"API","title":"Base.write","text":"write(filename::AbstractString, d::Detector; version)\n\n\nWrites the detector definition to a file, according to the DETX format specification. The version parameter can be a version number or :same, which is the default value and writes the same version as the provided detector has.\n\n\n\n\n\n","category":"method"},{"location":"api/#Base.write-Tuple{IO, Detector}","page":"API","title":"Base.write","text":"write(io::IO, d::Detector; version)\n\n\nfunction write(io::IO, d::Detector; version=:same)\n\nWrites the detector to a DETX formatted file. The target version can be specified via the version keyword. Note that if converting to higher versions, missing parameters will be filled with reasonable default values. In case of downgrading, information will be lost.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.Hydrophone","page":"API","title":"KM3io.Hydrophone","text":"struct Hydrophone\n\nA hydrophone, typically installed in the base module of a KM3NeT detector's string.\n\nFields\n\nlocation::Location\npos::Position{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{Hydrophone}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{Hydrophone}\n) -> Vector{Hydrophone}\n\n\nfunction read(filename::AbstractString, T::Type{Hydrophone})\n\nReads a vector of Hydrophones from an ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.Tripod","page":"API","title":"KM3io.Tripod","text":"struct Tripod\n\nA tripod installed on the seabed which sends acoustic signals to modules.\n\nFields\n\nid::Int8\npos::Position{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{Tripod}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{Tripod}\n) -> Vector{Tripod}\n\n\nfunction read(filename:AbstractString, T::Type{Tripod})\n\nReads a vector of Tripods from an ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#Base.write-Tuple{AbstractString, Vector{Tripod}}","page":"API","title":"Base.write","text":"write(filename::AbstractString, tripods::Vector{Tripod})\n\n\nfunction write(filename::AbstractString, tripods::Dict{Int8, Tripod})\n\nWrites the position of tripods out into an ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.piezoenabled","page":"API","title":"KM3io.piezoenabled","text":"piezoenabled(m::DetectorModule) -> Bool\n\n\nfunction piezoenabled(m::DetectorModule)\n\nReturn true if the piezo is enabled, false otherwise.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hydrophoneenabled","page":"API","title":"KM3io.hydrophoneenabled","text":"hydrophoneenabled(m::DetectorModule) -> Bool\n\n\nfunction hydrophonenabled(m::DetectorModule)\n\nReturn true if the hydrophone is enabled, false otherwise.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.center","page":"API","title":"KM3io.center","text":"center(m::DetectorModule) -> Position{Float64}\n\n\nCalculate the centre of a module by fitting the crossing point of the PMT axes.\n\n\n\n\n\ncenter(d::Detector) -> Position{Float64}\n\n\nCalculate the center of the detector based on the location of the optical modules.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.StringMechanics","page":"API","title":"KM3io.StringMechanics","text":"struct StringMechanics\n\nA container structure which holds the mechanical model parameters for multiple strings, including a default value for strings which have specific parameters.\n\nFields\n\ndefault::StringMechanicsParameters\nstringparams::Dict{Int64, StringMechanicsParameters}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.StringMechanicsParameters","page":"API","title":"KM3io.StringMechanicsParameters","text":"struct StringMechanicsParameters\n\nData structure for parameters of the mechanical model of strings. This data structure is used to calculate the effective height conform to the mechanical model of the string.\n\nFields\n\na::Float64\nb::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{StringMechanics}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{StringMechanics}\n) -> StringMechanics\n\n\nReads the mechanical models from a text file.\n\n\n\n\n\n","category":"method"},{"location":"api/#Optical-Data","page":"API","title":"Optical Data","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"","category":"page"},{"location":"api/#Acoustics","page":"API","title":"Acoustics","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"Waveform\nread(filename::AbstractString, T::Type{Waveform})\nAcousticSignal\nAcousticsTriggerParameter\nread(filename::AbstractString, T::Type{AcousticsTriggerParameter})","category":"page"},{"location":"api/#KM3io.Waveform","page":"API","title":"KM3io.Waveform","text":"struct Waveform\n\nWaveform translates Emitter ID to Tripod ID.\n\nFields\n\nids::Dict{Int8, Int8}\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{Waveform}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{Waveform}\n) -> Waveform\n\n\nfunction read(filename::AbstractString, T::Type{Waveform})\n\nReads the waveform ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.AcousticSignal","page":"API","title":"KM3io.AcousticSignal","text":"struct AcousticSignal\n\nAcousticSignal is a custom type with four fields to store all the information inside the raw acoustic binary files.\n\ndom_id::Int32 ID of the module\nutc_seconds:: UInt32 storing the first 4 Bytes and is a UNIX time stamp\nns_cycles:: UInt32 storing the second 4 Bytes\nsamples:: UInt32 storing the third 4 Bytes, corresponding to the number of data points accuired during the measring window\npcm:: Vector of Float32 of length frame_length, storing all other 4 Byte blocks. Each entry is a data point of the acoustic signal.\n\nFields\n\ndom_id::Int32\nutc_seconds::UInt32\nns_cycles::UInt32\nsamples::UInt32\npcm::Vector{Float32}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.AcousticsTriggerParameter","page":"API","title":"KM3io.AcousticsTriggerParameter","text":"struct AcousticsTriggerParameter\n\nCertain parameters which define an acoustic event.\n\nFields\n\nq::Float64\ntmax::Float64\nnmin::Int32\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{AcousticsTriggerParameter}\n) -> AcousticsTriggerParameter\n\n\nfunction read(filename::AbstractString, T::Type{AcousticsTriggerParameter})\n\nReads the 'acousticstriggerparameters.txt' file.\n\n\n\n\n\n","category":"method"},{"location":"api/#Calibration","page":"API","title":"Calibration","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"calibrate\ncalibratetime\ncombine\nOrientations\nCompass\nQuaternion\nfloordist\nslew\nslerp","category":"page"},{"location":"api/#KM3io.calibrate","page":"API","title":"KM3io.calibrate","text":"calibrate(det::Detector, hits) -> Vector{XCalibratedHit}\n\n\nApply full geometry and time calibration to given hits. This way of calibration should be used wisely since it creates a very bloaded XCalibratedHit object, which might not be necessary. Often, we only need time the calibration to be applied.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.calibratetime","page":"API","title":"KM3io.calibratetime","text":"calibratetime(\n    det::Detector,\n    hits::Array{T<:SnapshotHit, 1}\n) -> Vector{CalibratedSnapshotHit}\n\n\nCalibrate the time of a given array of snapshot hits.\n\n\n\n\n\ncalibratetime(\n    det::Detector,\n    hits::Array{T<:TriggeredHit, 1}\n) -> Vector{CalibratedTriggeredHit}\n\n\nCalibrate the time of a given array of triggered hits.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.combine","page":"API","title":"KM3io.combine","text":"combine(\n    snapshot_hits::Vector{SnapshotHit},\n    triggered_hits::Vector{TriggeredHit}\n) -> Vector{TriggeredHit}\n\n\nCombine snapshot and triggered hits to a single hits-vector.\n\nThis should be used to transfer the trigger information to the snapshot hits from a DAQEvent. The triggered hits are a subset of the snapshot hits.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.Orientations","page":"API","title":"KM3io.Orientations","text":"struct Orientations\n\nA data structure to hold orientations data. This struct should be instantiated by Base.read(filename, Orientations).\n\nFields\n\nmodule_ids::Set{Int64}\ntimes::Dict{Int64, Vector{Float64}}\nquaternions::Dict{Int64, Vector{Quaternion}}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Compass","page":"API","title":"KM3io.Compass","text":"struct Compass{T} <: StaticArraysCore.FieldVector{3, T}\n\nA compass with yaw, pitch and roll.\n\nFields\n\nyaw::Any\npitch::Any\nroll::Any\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Quaternion","page":"API","title":"KM3io.Quaternion","text":"struct Quaternion{T} <: StaticArraysCore.FieldVector{4, T}\n\nA simple quaternion derived from a FieldVector of StaticArrays, no more, no less.\n\nFields\n\nq0::Any\nqx::Any\nqy::Any\nqz::Any\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.floordist","page":"API","title":"KM3io.floordist","text":"floordist(det::Detector) -> Float64\n\n\nCalculates the average floor distance between neighboured modules.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.slew","page":"API","title":"KM3io.slew","text":"slew(tot::Integer) -> Any\n\n\nReturn the time slewing for a ToT.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.slerp","page":"API","title":"KM3io.slerp","text":"slerp(q₁, q₂, t::Real; dot_threshold, normalized) -> Any\n\n\nInterpolate between two vectors (e.g. quaternions) using the slerp method. t should be between 0 and 1. 0 will produce q₁ and 1 q₂.\n\nThe input vectors q₁ and q₂ will be normalised unless normalized is false. It is not done by default to shave off a few dozens of nanoseconds. Make sure to set normalized=false if the input vectors are not unit vectors.\n\n\n\n\n\n","category":"function"},{"location":"api/#Physics","page":"API","title":"Physics","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"azimuth\nzenith\nphi\ntheta\ncherenkov\nCherenkovPhoton\nK40Rates","category":"page"},{"location":"api/#KM3io.azimuth","page":"API","title":"KM3io.azimuth","text":"azimuth(d::Direction) -> Any\n\n\nCalculates the azimuth from a given Direction according to KM3NeT conventions.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.zenith","page":"API","title":"KM3io.zenith","text":"zenith(d::Direction) -> Any\n\n\nCalculates the zenith from a given Direction according to KM3NeT conventions.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.phi","page":"API","title":"KM3io.phi","text":"phi(d::Direction) -> Any\n\n\nCalculate the phi angle for a given direction\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.theta","page":"API","title":"KM3io.theta","text":"theta(d::Direction) -> Any\n\n\nCalculate the theta angle for a given direction\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.cherenkov","page":"API","title":"KM3io.cherenkov","text":"cherenkov(\n    track,\n    hits::Array{T<:AbstractCalibratedHit, 1}\n) -> Vector\n\n\nCalculates the parameters of cherenkov photons emitted from a track and hitting the PMTs represented as (calibrated) hits. The returned cherenkov photons hold information about the closest distance to track, the time residual, arrival time, impact angle, photon travel distance, track travel distance and photon travel direction. See CherenkovPhoton for more information.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.CherenkovPhoton","page":"API","title":"KM3io.CherenkovPhoton","text":"struct CherenkovPhoton\n\nA Cherenkov photon with parameters calculated from its inducing track. See cherenkov() for more information.\n\nFields\n\nd_closest::Float64\nd_photon::Float64\nd_track::Float64\nt::Float64\nΔt::Float64\nimpact_angle::Float64\ndir::Direction{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.K40Rates","page":"API","title":"KM3io.K40Rates","text":"struct K40Rates\n\nK40 rates with L0 and higher level rates (with increasing multiplicities).\n\nFields\n\nL0::Float64\nL1::Vector{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Trigger","page":"API","title":"Trigger","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"triggered\nis3dmuon\nis3dshower\nismxshower\nisnb","category":"page"},{"location":"api/#KM3io.triggered","page":"API","title":"KM3io.triggered","text":"triggered(e) -> Vector{T} where T<:KM3io.AbstractDAQHit\n\n\nReturn true if the passed object (hit, event, ...) was triggered by any trigger algorithm.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.is3dmuon","page":"API","title":"KM3io.is3dmuon","text":"is3dmuon(e::DAQEvent) -> Bool\n\n\nis3dmuon(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:12.\n\nReturn true the 3D Muon trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.is3dshower","page":"API","title":"KM3io.is3dshower","text":"is3dshower(e::DAQEvent) -> Bool\n\n\nis3dshower(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:20.\n\nReturn true if the 3D Shower trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.ismxshower","page":"API","title":"KM3io.ismxshower","text":"ismxshower(x) -> Bool\n\n\nismxshower(x)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:28.\n\nismxshower(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:29.\n\nReturn true if the MX Shower trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.isnb","page":"API","title":"KM3io.isnb","text":"isnb(x) -> Bool\n\n\nisnb(x)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:36.\n\nisnb(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:37.\n\nReturn true if the NanoBeacon trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#ControlHost","page":"API","title":"ControlHost","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"CHClient","category":"page"},{"location":"api/#KM3io.CHClient","page":"API","title":"KM3io.CHClient","text":"struct CHClient{T}\n\nA ControlHost client which can communicate with a Ligier dispatcher to receive messages for all the subscribed tags.\n\nTo connect to a Ligier which is receiving triggered DAQ events e.g. in the KM3NeT monitoring system or in a test setup consisting of a JLigier dispatcher and a JRegurgitate instance which is redispatching DAQ events (JDAQEvent) from a ROOT file in online format to the JLigier, a CHClient can be created to subscribe the event messages with\n\njulia> using KM3io\n\njulia> c = CHClient{DAQEvent}(ip\"127.0.0.1\", 5553)\n\njulia> for event in c\n           @show event\n       end\ne = KM3io.DAQEvent with 127 snapshot and 6 triggered hits\ne = KM3io.DAQEvent with 147 snapshot and 6 triggered hits\ne = KM3io.DAQEvent with 154 snapshot and 8 triggered hits\ne = KM3io.DAQEvent with 152 snapshot and 6 triggered hits\n...\n...\n...\n\nFields\n\nip::Sockets.IPv4\nport::UInt16\ntags::Vector{CHTag}\nsocket::Sockets.TCPSocket\n\n\n\n\n\n","category":"type"},{"location":"api/#Tools","page":"API","title":"Tools","text":"","category":"section"},{"location":"api/#General-tools","page":"API","title":"General tools","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"SummarysliceIntervalIterator\ngetevent\ncategorize\nnthbitset\nmost_frequent","category":"page"},{"location":"api/#KM3io.SummarysliceIntervalIterator","page":"API","title":"KM3io.SummarysliceIntervalIterator","text":"struct SummarysliceIntervalIterator\n\nAn iterator which yields a Vector{Summaryslice} containing summaryslices of a given time_interval (in seconds). Useful when analysing summary data with fixed time intervals. The returned summaryslices are also sorted in time.\n\nExamples\n\njulia> f = ROOTFile(\"KM3NeT_00000133_00014728.root\")\nROOTFile{OnlineTree (83509 events, 106969 summaryslices)}\n\njulia> sii = SummarysliceIntervalIterator(f, 60)\nSummarysliceIntervalIterator (10739.7s, 60s intervals, 179 chunks)\n\njulia> for summaryslices in sii\n           @show length(summaryslices)\n           @show summaryslices[1].header\n           break\n       end\nlength(summaryslices) = 599\n(summaryslices[1]).header = SummarysliceHeader(133, 14728, 134, UTCExtended(1676246413, 400000000, 0))\n\nnote: Note\nShort time intervals (a few tens of seconds) will likely return Vector{Summaryslice}s with few entries in the first and last iterations due to a delay in run changes. The number of frames per summaryslice will gradually increase due to the asynchronous nature of the run transition. See the example below with a time inteval of 10s and 100 active optical modules.\n\njulia> sii = SummarysliceIntervalIterator(f, 10)\nSummarysliceIntervalIterator (106.2s, 10s intervals, 11 chunks)\n\njulia> for summaryslices in sii\n           n = length(summaryslices)\n           @show n\n       end\nn = 73\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 96\nn = 31\n\nFields\n\nsc::KM3io.SummarysliceContainer\nfirst_frame_index::Int64\ntime_interval::Int64\nn_chunks::Int64\ntimespan::Float64\nindices::Vector{Int64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.getevent","page":"API","title":"KM3io.getevent","text":"getevent(\n    tree::Union{KM3io.OnlineTree, KM3io.OfflineTree},\n    frame_index,\n    trigger_counter\n) -> Any\n\n\nRetrieves the event with for a given frame_index and trigger_counter.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.categorize","page":"API","title":"KM3io.categorize","text":"categorize(\n    field::Symbol,\n    elements::Vector\n) -> Dict{_A, Vector{_A1}} where {_A, _A1}\n\n\nCategorise the struct elements of a vector by a given field into a dictionary of T.field => Vector{T}.\n\nExamples\n\njulia> using KM3io\n\njulia> struct PMT  # just an ad-hoc PMT struct for demonstration purposes\n         dom_id\n         time\n       end\n\njulia> pmts = [PMT(2, 10.4), PMT(4, 23.5), PMT(2, 42.0)];\n\njulia> categorize(:dom_id, pmts)\nDict{Any, Vector{PMT}} with 2 entries:\n  4 => [PMT(4, 23.5)]\n  2 => [PMT(2, 10.4), PMT(2, 42.0)]\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.nthbitset","page":"API","title":"KM3io.nthbitset","text":"nthbitset(n, a) -> Any\n\n\nReturn true if the n-th bit of a is set, false otherwise.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.most_frequent","page":"API","title":"KM3io.most_frequent","text":"most_frequent(iterable) -> Any\n\n\nReturn the most frequent value of a given iterable.\n\n\n\n\n\nmost_frequent(f::Function, iterable; rettype) -> Int64\n\n\nReturn the most frequent value of a given iterable based on the return value of a function f which returns (hashable) values of rettype.\n\n\n\n\n\n","category":"function"},{"location":"api/#DAQ","page":"API","title":"DAQ","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"pmtrate\npmtrates\nhrvstatus\nfifostatus\ntdcstatus\nwrstatus\nhasudptrailer\ncount_active_channels\ncount_fifostatus\ncount_hrvstatus\nstatus\nnumber_of_udp_packets_received\nmaximal_udp_sequence_number","category":"page"},{"location":"api/#KM3io.pmtrate","page":"API","title":"KM3io.pmtrate","text":"pmtrate(r::UInt8) -> Float64\n\n\nCalculate the PMT hit rate from the raw byte stored in a summary frame.\n\nThe rate of each PMT is encoded in a single byte to reduce the size of the summary frame, therefore only 256 values are possible which are mapped to an exponential function. The values are precalculated by the _getrate() function for the best performance.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.pmtrates","page":"API","title":"KM3io.pmtrates","text":"pmtrates(\n    s::SummaryFrame\n) -> StaticArraysCore.SVector{31, Float64}\n\n\nReturn the actual rates (in Hz) for each PMT in a summary frame.\n\n\n\n\n\npmtrates(\n    s::Summaryslice\n) -> Dict{Int32, StaticArraysCore.SVector{31, Float64}}\n\n\nReturn a dictionary of DOM IDs as keys and PMT rates [Hz] as values (Vector{Float64}).\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hrvstatus","page":"API","title":"KM3io.hrvstatus","text":"hrvstatus(f::SummaryFrame, tdc) -> Any\n\n\nReturn true if the TDC is in high rate veto.\n\n\n\n\n\nhrvstatus(f::SummaryFrame) -> Bool\n\n\nReturn true if any of the TDCs is in high rate veto.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.fifostatus","page":"API","title":"KM3io.fifostatus","text":"fifostatus(f::SummaryFrame, tdc) -> Any\n\n\nReturn true if the TDC has FIFO almost full.\n\n\n\n\n\nfifostatus(f::SummaryFrame) -> Bool\n\n\nReturn true if any of the TDCs is in high rate veto.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.tdcstatus","page":"API","title":"KM3io.tdcstatus","text":"tdcstatus(f::SummaryFrame) -> Bool\n\n\nReturn true if TDC status is OK.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.wrstatus","page":"API","title":"KM3io.wrstatus","text":"wrstatus(f::SummaryFrame) -> Bool\n\n\nReturn true if White Rabbit status is OK.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hasudptrailer","page":"API","title":"KM3io.hasudptrailer","text":"hasudptrailer(f::SummaryFrame) -> Bool\n\n\nReturn true if the UDP trailer is present.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.count_active_channels","page":"API","title":"KM3io.count_active_channels","text":"count_active_channels(f::SummaryFrame) -> Int64\n\n\nNumber of TDCs without high rate veto or FIFO almost full.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.count_fifostatus","page":"API","title":"KM3io.count_fifostatus","text":"count_fifostatus(f::SummaryFrame) -> Int64\n\n\nNumber of TDCs with FIFO almost full.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.count_hrvstatus","page":"API","title":"KM3io.count_hrvstatus","text":"count_hrvstatus(f::SummaryFrame) -> Int64\n\n\nNumber of TDCs with high rate veto.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.status","page":"API","title":"KM3io.status","text":"status(f::SummaryFrame) -> Bool\n\n\nReturn true if TDC and White Rabbit status are OK.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.number_of_udp_packets_received","page":"API","title":"KM3io.number_of_udp_packets_received","text":"number_of_udp_packets_received(f::SummaryFrame) -> Int32\n\n\nNumber of received UDP packets (excluding the trailer).\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.maximal_udp_sequence_number","page":"API","title":"KM3io.maximal_udp_sequence_number","text":"maximal_udp_sequence_number(f::SummaryFrame) -> Int32\n\n\nMaximal sequence number of all received UDP packets.\n\n\n\n\n\n","category":"function"},{"location":"api/#Reconstruction","page":"API","title":"Reconstruction","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"besttrack\nbestjppmuon\nbestjppshower\nbestaashower\nRecStageRange\nhashistory","category":"page"},{"location":"api/#KM3io.besttrack","page":"API","title":"KM3io.besttrack","text":"besttrack(\n    e::Evt,\n    rec_type::Integer,\n    rsr::RecStageRange\n) -> Union{Missing, Trk}\n\n\nReturn the best reconstructed track for a given reconstruction type and reconstruction stage range. If no track could be found, missing is returned.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.bestjppmuon","page":"API","title":"KM3io.bestjppmuon","text":"bestjppmuon(e::Evt) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JMuon track of an event or missing if there are none.\n\n\n\n\n\nbestjppmuon(trks::Vector{Trk}) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JMuon track or missing if there are none.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.bestjppshower","page":"API","title":"KM3io.bestjppshower","text":"bestjppshower(e::Evt) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JShower \"track\" of an event or missing if there are none.\n\n\n\n\n\nbestjppshower(trks::Vector{Trk}) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JShower \"track\" or missing if there are none.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.bestaashower","page":"API","title":"KM3io.bestaashower","text":"bestaashower(e::Evt) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed aashower \"track\" of an event or missing if there are none.\n\n\n\n\n\nbestaashower(trks::Vector{Trk}) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed aashower \"track\" or missing if there are none.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.RecStageRange","page":"API","title":"KM3io.RecStageRange","text":"struct RecStageRange{T<:Integer}\n\nThis struct is used to represent a range of reconstruction stages. These are well-defined integers (see KM3NeT Dataformat) for each reconstruction algorithm and are stored in a vector named rec_stages of each Trk.\n\njulia> using KM3io\n\njulia> rsr = RecStageRange(KM3io.RECONSTRUCTION.JMUONBEGIN, KM3io.RECONSTRUCTION.JMUONEND)\nRecStageRange{Int64}(0, 99)\n\njulia> KM3io.RECONSTRUCTION.JMUONSIMPLEX ∈ rsr\ntrue\n\njulia> KM3io.RECONSTRUCTION.AASHOWERFITPREFIT ∈ rsr\nfalse\n\njulia> 23 ∈ rsr\ntrue\n\njulia> 523 ∈ rsr\nfalse\n\nFields\n\nlower::Integer\nupper::Integer\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.hashistory","page":"API","title":"KM3io.hashistory","text":"hashistory(\n    t::Trk,\n    rec_type::Integer,\n    rsr::RecStageRange\n) -> Bool\n\n\nReturns true if a track with a given rec_type contains all the reconstruction stages in rsr::RecStageRange.\n\n\n\n\n\nhashistory(\n    t::Trk,\n    rec_type::Integer,\n    rec_stage::Integer\n) -> Bool\n\n\nReturns true if a track with a given rec_type contains the rec_stage.\n\n\n\n\n\n","category":"function"},{"location":"api/#Math","page":"API","title":"Math","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"angle\ndistance","category":"page"},{"location":"api/#Base.angle","page":"API","title":"Base.angle","text":"angle(d1::Direction, d2::Direction) -> Any\n\n\nCalculate the angle between two vectors.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.distance","page":"API","title":"KM3io.distance","text":"distance(a::Position, b::Position) -> Any\n\n\nCalculates the disance between two points.\n\n\n\n\n\n","category":"function"},{"location":"examples/cherenkov_times/#Cherenkov-times","page":"Cherenkov times","title":"Cherenkov times","text":"","category":"section"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"using PGFPlotsX\nsavefigs = (figname, obj) -> begin\n    pgfsave(figname * \".pdf\", obj)\n    run(`pdftocairo -svg -l  1 $(figname * \".pdf\") $(figname * \".svg\")`)\n    pgfsave(figname * \".tex\", obj);\n    return nothing\nend","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"In this example, we will pick the best reconstructed muon (from the Jpp muon reconstruction chain JMuon) in each event and calculate the Cherenkov hit time residuals for each triggered hit.","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"We open the a sample file from the KM3NeTTestData package:","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"offline\", \"mcv6.0.gsg_muon_highE-CC_50-500GeV.km3sim.jterbr00008357.jorcarec.aanet.905.root\"))","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"Each event holds a vector of reconstructed tracks (Vector{Trk}) behind the .trks field. This vector contains different stages of reconstruction results from a variety of reconstruction algorithms (JMuon, JShower, aashower etc.). KM3io.jl exports helper functions to pick the best reconstructed track for a given reconstruction algorithm. The logic is based on the reference implementation in KM3NeT DataFormat tools. The function bestjppmuon() can be used to select the best reconstructed JMuon for a given event:","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"evt = f.offline[1]\nbest_muon = bestjppmuon(evt)","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"We now use this track as a seed to calculate the Cherenkov photon (see CherenkovPhoton) parameters using cherenkov() for each hit triggered hit in the event. To select only triggered hits, we use the triggered() function together withe filter() which returns a new vector of triggered hits:","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"cherenkov(best_muon, filter(triggered, evt.hits))","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"To obtain more statistics, we iterate through all the events and calculate the Cherenkov time residuals for each set of hits based on the best reconstruction track. We fill the time residuals in a 1D histogram using the FHist package.","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"note: Note\nThis example uses PGFPlotsX which is a wrapper for the LaTeX library PGFPlots. Feel free to adapt the example to use your favourite plotting library.","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"using KM3io, KM3NeTTestData\nusing FHist\nusing PGFPlotsX\n\nf = ROOTFile(datapath(\"offline\", \"mcv6.0.gsg_muon_highE-CC_50-500GeV.km3sim.jterbr00008357.jorcarec.aanet.905.root\"))\nΔts = Hist1D(; counttype=Int, binedges=-10:50)\n\nfor evt ∈ f.offline\n    m = bestjppmuon(evt)\n    cherenkov_photons = cherenkov(m, filter(triggered, evt.hits))\n    for cp ∈ cherenkov_photons\n        push!(Δts, cp.Δt)\n    end\nend\n\naxis = @pgf Axis(\n    {\n        ybar, const_plot, grid,\n        xlabel=raw\"\\Delta t / ns\",\n        ylabel=\"counts\",\n    },\n    PlotInc(Coordinates(bincenters(Δts), bincounts(Δts)), raw\"\\closedcycle\")\n)\naxis\nsavefigs(\"cherenkov\", ans) # hide","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"[.pdf], [generated .tex]","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"(Image: )","category":"page"},{"location":"manual/rootfiles/#ROOT-Files","page":"ROOT Files","title":"ROOT Files","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The two main types of ROOT files in KM3NeT are the online and offline files, however, both types can be mixed together as the data is stored in distinct ROOT trees. UnROOT has a single ROOTFile type to represent a KM3NeT ROOT file which can be used to access both the online and offline information. This section describes what kind of data is stored in each tree and how to access them.","category":"page"},{"location":"manual/rootfiles/#offline-dataformat","page":"ROOT Files","title":"Offline Dataformat","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The offline dataformat is used to store Monte Carlo (MC) simulations and reconstruction results. The OfflineTree type represents an actual offline file and it is essentially a vector of events (Vector{Evt}) with some fancy caching, lazy access and slicing magic. The offline tree is accessible via the .offline field of the ROOTFile type.","category":"page"},{"location":"manual/rootfiles/#MC-Header","page":"ROOT Files","title":"MC Header","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The MC header stores metadata related to the simulation chain. The individual entries can be accessed as properties, as shown below.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"offline\", \"numucc.root\"))\nROOTFile{OnlineTree (0 events, 0 summaryslices), OfflineTree (10 events)}\n\njulia> f.offline\nOfflineTree (10 events)\n\njulia> f.offline.header\nMCHeader\n  DAQ => (livetime = 394,)\n  PDF => (i1 = 4, i2 = 58)\n  XSecFile => Any[]\n  can => (zmin = 0, zmax = 1027, r = 888.4)\n  can_user => [0.0, 1027.0, 888.4]\n  coord_origin => (x = 0, y = 0, z = 0)\n  cut_in => (Emin = 0, Emax = 0, cosTmin = 0, cosTmax = 0)\n  cut_nu => (Emin = 100, Emax = 1.0e8, cosTmin = -1, cosTmax = 1)\n  cut_primary => (Emin = 0, Emax = 0, cosTmin = 0, cosTmax = 0)\n  cut_seamuon => (Emin = 0, Emax = 0, cosTmin = 0, cosTmax = 0)\n  decay => [\"doesnt\", \"happen\"]\n  detector => NOT\n  drawing => Volume\n  end_event => Any[]\n  genhencut => (gDir = 2000, Emin = 0)\n  genvol => (zmin = 0, zmax = 1027, r = 888.4, volume = 2.649e9, numberOfEvents = 100000)\n  kcut => 2\n  livetime => (numberOfSeconds = 0, errorOfSeconds = 0)\n  model => (interaction = 1, muon = 2, scattering = 0, numberOfEnergyBins = 1, field_4 = 12)\n  muon_desc_file => Any[]\n  ngen => 100000.0\n  norma => (primaryFlux = 0, numberOfPrimaries = 0)\n  nuflux => Real[0, 3, 0, 0.5, 0.0, 1.0, 3.0]\n  physics => (program = \"GENHEN\", version = \"7.2-220514\", date = 181116, time = 1138)\n  seed => (program = \"GENHEN\", level = 3, iseed = 305765867, field_3 = 0, field_4 = 0)\n  simul => (program = \"JSirene\", version = 11012, date = \"11/17/18\", time = 7)\n  sourcemode => diffuse\n  spectrum => (alpha = -1.4,)\n  start_run => 1\n  target => isoscalar\n  usedetfile => false\n  xlat_user => 0.63297\n  xparam => OFF\n  zed_user => [0.0, 3450.0]\n\n\njulia> f.offline.header.genvol\n(zmin = 0, zmax = 1027, r = 888.4, volume = 2.649e9, numberOfEvents = 100000)\n\njulia> f.offline.header.genvol.volume\n2.649e9","category":"page"},{"location":"manual/rootfiles/#Event-data","page":"ROOT Files","title":"Event data","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The following REPL session shows how to open a file, access individual events or slices of events, loop through events and access e.g. the tracks which are stored in the events.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"offline\", \"km3net_offline.root\"))\nROOTFile{OfflineTree (10 events)}\n\njulia> f.offline[5]\nKM3io.Evt (83 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n\njulia> f.offline[3:5]\n3-element Vector{KM3io.Evt}:\n KM3io.Evt (318 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n KM3io.Evt (157 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n KM3io.Evt (83 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n\njulia> event = f.offline[1]\nKM3io.Evt (176 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n\njulia> event.trks[1:4]\n4-element Vector{KM3io.Trk}:\n KM3io.Trk(1, [445.835395997812, ... , 294.6407542676734, 4000)\n KM3io.Trk(2, [445.835395997812, ... , 294.6407542676734, 4000)\n KM3io.Trk(3, [448.136188112227, ... , 294.6407542676734, 4000)\n KM3io.Trk(4, [448.258348900570, ... , 291.64653112688273, 4000)\n\njulia> for event in f.offline\n           @show event\n       end\nevent = KM3io.Evt (176 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (125 hits, 0 MC hits, 55 tracks, 0 MC tracks)\nevent = KM3io.Evt (318 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (157 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (83 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (60 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (71 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (84 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (255 hits, 0 MC hits, 54 tracks, 0 MC tracks)\nevent = KM3io.Evt (105 hits, 0 MC hits, 56 tracks, 0 MC tracks)","category":"page"},{"location":"manual/rootfiles/#online_dataformat","page":"ROOT Files","title":"Online Dataformat","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The online dataformat refers to the dataformat which is written by the data acquisition system (DAQ) of the KM3NeT detectors, more precisely, the ROOT files produced by the JDataFilter which is part of the Jpp framework. The very same format is used in run-by-run (RBR) Monte Carlo (MC) productions, which mimic the detector response and therefore produce similarly structured data. The online data can be accessed via the .online field of the ROOTFile type.","category":"page"},{"location":"manual/rootfiles/#Event-data-2","page":"ROOT Files","title":"Event data","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The events are accessible via ROOTFile(filename).online.events which supports indexing, slicing and iteration, just like the we have seen above, in case of the offline events. Notice however that the online format also contains other types of trees, that's why the explicit .events field is needed. Everything is lazily loaded so that the data is only occupying memory when it's actually accessed, similar to the offline access. In the examples below, we use KM3NeTTestdata to get access to small sample files.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"online\", \"km3net_online.root\"))\nROOTFile{OnlineTree (3 events, 3 summaryslices), OfflineTree (0 events)}\n\njulia> event = f.online.events[1]\nKM3io.DAQEvent with 96 snapshot and 18 triggered hits\n\njulia> event.triggered_hits[4:8]\n5-element Vector{KM3io.TriggeredHit}:\n KM3io.TriggeredHit(808447186, 0x00, 30733214, 0x19, 0x0000000000000016)\n KM3io.TriggeredHit(808447186, 0x01, 30733214, 0x15, 0x0000000000000016)\n KM3io.TriggeredHit(808447186, 0x02, 30733215, 0x15, 0x0000000000000016)\n KM3io.TriggeredHit(808447186, 0x03, 30733214, 0x1c, 0x0000000000000016)\n KM3io.TriggeredHit(808451907, 0x07, 30733441, 0x1e, 0x0000000000000004)\n\njulia> for event ∈ f.online.events\n           @show event.header.frame_index length(event.snapshot_hits)\n       end\nevent.header.frame_index = 127\nlength(event.snapshot_hits) = 96\nevent.header.frame_index = 127\nlength(event.snapshot_hits) = 124\nevent.header.frame_index = 129\nlength(event.snapshot_hits) = 78","category":"page"},{"location":"manual/rootfiles/#Summaryslices-and-Summary-Frames","page":"ROOT Files","title":"Summaryslices and Summary Frames","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Summaryslices are generated from timeslices (raw hit data) and are produced by the DataFilter. A slice contains the data of 100ms and is divided into so-called frames, each corresponding to the data of a single optical module. Due to the high amount of data, the storage of timeslices is usually reduced by a factor of 10-100 after the event triggering stage. However, summaryslices are covering the full data taking period. They however do not contain hit data but only the rates of the PMTs encoded into a single byte, which therefore is only capable to store 256 different values. The actual rate is calcuated by the helper functions pmtrate() and pmtrates() which take a SummaryFrame and optionally a PMT channel ID as arguments.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The summaryslices are accessible using the .summaryslices attribute of the OnlineTree instance, which again is hidden behind the .online field of a ROOTFile:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"online\", \"km3net_online.root\"))\nROOTFile{OnlineTree (3 events, 3 summaryslices), OfflineTree (0 events)}\n\njulia> f.online.summaryslices\nKM3io.SummarysliceContainer with 3 summaryslices\n\njulia> for s ∈ f.online.summaryslices\n           @show s.header\n       end\ns.header = KM3io.SummarysliceHeader(44, 6633, 126, KM3io.UTCExtended(0x5dc6018c, 0x23c34600, false))\ns.header = KM3io.SummarysliceHeader(44, 6633, 127, KM3io.UTCExtended(0x5dc6018c, 0x29b92700, false))\ns.header = KM3io.SummarysliceHeader(44, 6633, 128, KM3io.UTCExtended(0x5dc6018c, 0x2faf0800, false))","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Each summaryslice consists of multiple frames, one for every optical module which has sent data during the recording time of the corresponding timeslice.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"note: Note\nDuring run transistions, the number of summaryframes in a summaryslice is fluctuating a lot until it eventually saturates, usually within a few seconds or minutes. Therefore, it is expected that the number of summaryframes (i.e. active DOMs) is low at the beginning of the file and stabilises after a few summaryslices.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"To access the actual PMT rates and flags (e.g. for high-rate veto or FIFO status) of a summaryframe, several helper functions exist. Let's grab a summaryslice:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"online\", \"km3net_online.root\"))\n\ns = f.online.summaryslices[1]","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"and have a look at one of the frames, the 23rd of the first summaryslice:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"frame = s.frames[23]","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The White Rabbit status:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"wrstatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Checking if any of the PMTs is in high rate veto:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"hrvstatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The number of PMTs in high rate veto:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"count_hrvstatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Checking if any of the TDC FIFOs were almost full:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"fifostatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Counting the number of TDCs which had FIFO almost full:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"count_fifostatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The rates of each individual PMT channel ordered by increasing channel ID:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"pmtrates(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Individual PMT parameters can be accessed as well, by passing the summaryframe and the PMT ID (DAQ channel ID):","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"pmtrate(frame, 3)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Here is an example of a simple summary output:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"for pmt in 0:30\n    println(\"PMT $(pmt): HRV($(hrvstatus(frame, pmt))) FIFO($(fifostatus(frame, pmt)))\")\nend","category":"page"},{"location":"manual/rootfiles/#xrootd-access","page":"ROOT Files","title":"xrootd access","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"You can access files directly via xrootd by providing the URL on e.g. HPSS. Be aware that URL has to be typed correctly, / instead of // results in an error!), so it should always start with something like root://ccxroot:1999//hpss/....","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io\n\njulia> f = ROOTFile(\"root://ccxroot:1999//hpss/in2p3.fr/group/km3net/data/raw/sea/KM3NeT_00000132/14/KM3NeT_00000132_00014481.root\")\nROOTFile{OnlineTree (136335 events, 107632 summaryslices)}","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Now you can use it as if it was on your local filesystem. UnROOT.jl will take care of loading only the needed data from the server.","category":"page"},{"location":"examples/hdf5/#HDF5","page":"HDF5","title":"HDF5","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Plain ASCII (CSV) files are often perfectly fine for small, tabular datasets but when dealing with larger amounts of data, HDF5 comes in handy with compression, metadata and hierachical datasets. KM3NeT uses HDF5 in many analysis chains, often to store intermediate or end results.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"This example shows how to create an HDF5 file and write some vectors of structs into different datasets.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"using KM3io\nusing Random\n\nRandom.seed!(23)  # to make things reproducible ;)\n\nf = H5File(\"foo.h5\", \"w\")","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"We now have an H5File instance which we can use to store datasets.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Let's say we have our custom data type (struct) like","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"struct Particle\n    x::Float32\n    y::Float32\n    E::Int64\nend","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"and we generate instances of Particle in a loop which we want to dump directly into an HDF5 file to the dataset stored at simulation/particles, meaning that simulation is the group name and particles the dataset name.","category":"page"},{"location":"examples/hdf5/#Creating-datasets","page":"HDF5","title":"Creating datasets","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"First, we create our dataset with our type Particle. This is a so called H5CompoundDataset and resembles a dataset wich has a compound type (struct) associated with it:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"dset = create_dataset(f, \"simulation/particles\", Particle)","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"We fill some random particles using the dummy loop:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"for i in 1:1000\n    # creates some random particle\n    particle = Particle(rand(), rand(), rand(1:1000))\n    # we push to the dataset, just like if it was an Array\n    push!(dset, particle)\nend","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"note: Note\nTo avoid excessive I/O, KM3io uses a cache for each H5CompoundDataset. If you don't close the H5File properly, you might lose data which is still sitting in the cache. Therefore, always use close(f) to make sure that all the caches are dumped to the HDF5 file. The methods flush(d::H5CompoundDataset) and flush(f::H5File) can be used to manually to prematurely flush the cache of a dataset or all caches of an HDF5 file respectively.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Let's close the file","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"close(f)","category":"page"},{"location":"examples/hdf5/#Reading-datasets","page":"HDF5","title":"Reading datasets","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"We open the file from the previous example with HDF5.jl, just to demonstrate that we can read it without any KM3NeT related libraries:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"using HDF5\n\nf = h5open(\"foo.h5\")\nparticles = f[\"simulation/particles\"]\n\n@show particles[1:5]","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Notice that HDF5.jl automatically created NamedTuple instances with the same fieldnames as our own struct definition of Particle. This means that the elements behave just like the original one regarding the field access:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"particles[2].E","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"The whole vector can also be reinterpreted to the original struct definition with zero-cost. This can be mandatory if the data is then passed to other methods which require a specific type (in this case Particle). The following line will only work if Particle is already defined (i.e. the correspoinding module has been loaded). It is also mandatory to pass a slice (here, we pass the full slice by using [:]) to reinterpret and not the dataset itself:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"reinterpreted_particles = reinterpret(Particle, particles[:])","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Each element is now a proper Particle instance:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"reinterpreted_particles[4]","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"KM3io also writes the name of the struct into the attributes of the dataset:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"attrs(particles)[\"struct_name\"]","category":"page"},{"location":"examples/hdf5/#Adding-metadata","page":"HDF5","title":"Adding metadata","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Sometimes it's useful to keep track of additional metadata, e.g. a given set of parameters for a specific dataset. The addmeta() function can be used to attach key-value-pairs from a struct to a variety of HDF5 structures, like files, datasets or groups. The following example demonstrates it:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"using KM3io\nusing HDF5\n\nstruct SimulationParameters\n    can_height::Int32\n    can_radius::Int32\n    minimum_energy::Float64\n    maximum_energy::Float64\nend\n\nsimparams = SimulationParameters(800, 200, 1e3, 1e7)\n\nf = h5open(\"simulation.h5\", \"w\")\naddmeta(f, simparams)\n\nattributes(f)","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"To access individual attributes, use HDF5.read_attribute:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"read_attribute(f, \"can_radius\")","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"note: Note\nIt is possible to add metadata to datasets and groups too. Make sure that the struct you pass to addmeta() only contains primitive types or strings in their fields. Arrays and other nested or compound fieldtypes are not supported by HDF5.","category":"page"},{"location":"examples/offline_data/#Offline-data","page":"Offline data","title":"Offline data","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Let's use the KM3NeTTestData Julia package which contains all kinds of KM3NeT related sample files. The datapath() function can be used to get a path to such a file. In the following, we will discover the numucc.root file which contains 10 muon neutrino charged current interaction events.","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"offline\", \"numucc.root\"))","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"The ROOTFile is the container object which gives access to both the online and offline tree. In this case, the online tree is empty","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"f.online","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"and the offline tree holds our 10 MC events:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"f.offline","category":"page"},{"location":"examples/offline_data/#Events","page":"Offline data","title":"Events","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"To access a single event, you can use the usual indexing syntax:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"some_event = f.offline[5]","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"or ranges of events:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"events = f.offline[6:9]","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Another way to access events is given by getter function getevent() (which also works for online trees). If a single number if passed, it will be treated as a regular index, just like above:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"event = getevent(f.offline, 3)","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"when two numbers are passed, the first one is interpreted as frame_index and the second one as trigger_counter:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"event = getevent(f.offline, 87, 2)","category":"page"},{"location":"examples/offline_data/#Hits","page":"Offline data","title":"Hits","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Each event consists of a vector of hits, MC hits, tracks and MC tracks. Depending on the file, they may be empty. They are accessible via the fields .hit, .mc_hits, .trks and .mc_trks.","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Let's grab an event:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"evt = f.offline[3]","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"and have a look at its contents:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"evt.hits","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Let's close this file properly:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"close(f)","category":"page"},{"location":"examples/offline_data/#Usr-data","page":"Offline data","title":"Usr data","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"You can also access \"usr\"-data, which is a dynamic placeholder (Dict{String, Float64}) to store arbitrary data. Some software store values here which are only losely defined. Ideally, if these fields are used regulary by a software, a proper definition in the KM3NeT dataformat should be created and added to the according Struct as a field.","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Here is an example how to access the \"usr\"-data of a single event:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"f = ROOTFile(datapath(\"offline\", \"usr-sample.root\"))\n\nf.offline[1].usr","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"close(f)","category":"page"},{"location":"examples/orientations/#Orientations","page":"Orientations","title":"Orientations","text":"","category":"section"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"The following example shows how to read orientations from a calibration output (ROOT file) and plot the yaw, pitch and roll values for an optical module.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"The data used in this example is provided by KM3NeTTestData.jl.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"using KM3io\nusing KM3NeTTestData\nusing CairoMakie\nusing Dates","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"We use Makie for plotting:","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"fig = Figure(size=(900, 400), fontsize=16)\nax_yaw =  Axis(fig[1, 1])\nax_pitch_and_roll =  Axis(fig[1, 2])","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"We load the orientations data and extract the quaternions including the corresponding times from it:","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"o = read(datapath(\"calib\", \"KM3NeT_00000049_0.0.0_00007631_00007676_1.orientations.root\"), Orientations)\nqdata = o(808972593)","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"The times are converted to DateTime objects, which Makie will understand and display them in a human readable way.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"times = unix2datetime.(qdata.t)","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"We convert the Quaternions to Compasses to be able to access the yaw, pitch and roll values.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"compasses = Compass.(qdata.q)\nyaws = [c.yaw for c in compasses]\npitches = [c.pitch for c in compasses]\nrolls = [c.roll for c in compasses]","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"...and we populate the plots:","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"scatter!(ax_yaw, times, yaws, label=\"yaw\")\naxislegend(ax_yaw, position = :rb)\n\nscatter!(ax_pitch_and_roll, times, pitches, label=\"pitch\")\nscatter!(ax_pitch_and_roll, times, rolls, label=\"roll\")\naxislegend(ax_pitch_and_roll, position = :rt)\n\nfig","category":"page"},{"location":"manual/hdf5/#HDF5-Files","page":"HDF5 Files","title":"HDF5 Files","text":"","category":"section"},{"location":"manual/hdf5/","page":"HDF5 Files","title":"HDF5 Files","text":"...","category":"page"},{"location":"#KM3io.jl","page":"Home","title":"KM3io.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"KM3io.jl is a Julia library which implements high-performance I/O functions and additional utilities to deal with dataformats used in KM3NeT, e.g. ROOT (online/offline files), DETX (detector geometry and calibrations) and acoustics (waveforms and hardware). In contrast to Python, you are free to utilise as many (nested) for-loops as you like while still being as fast as in e.g. in C++.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Apropos ROOT and C++, the KM3NeT Dataformat is defined in C++ and uses the I/O functionality of the ROOT framework to create the online and offline ROOT files. Luckily, there is a pure Julia library named UnROOT.jl that provides access the the ROOT files without the need to install ROOT or the corresponding C++ library. This allows KM3io.jl to be completely free from these external dependencies.","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Note\nThe library is still under development so that the API might slightly change. Feedback and contributions are highly welcome!","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"KM3io.jl is not an officially registered Julia package but it's available via the KM3NeT Julia registry. To add the KM3NeT Julia registry to your local Julia registry list, follow the instructions in its README or simply do","category":"page"},{"location":"","page":"Home","title":"Home","text":"git clone https://git.km3net.de/common/julia-registry ~/.julia/registries/KM3NeT","category":"page"},{"location":"","page":"Home","title":"Home","text":"After that, you can instal KM3io.jl just like any other Julia package:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> import Pkg; Pkg.add(\"KM3io\")","category":"page"},{"location":"#Quickstart","page":"Home","title":"Quickstart","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"offline\", \"numucc.root\"))\nROOTFile{OnlineTree (0 events, 0 summaryslices), OfflineTree (10 events)}\n\njulia> f.offline\nOfflineTree (10 events)\n\njulia> some_event = f.offline[3]\nKM3io.Evt (3680 hits, 28 MC hits, 38 tracks, 12 MC tracks)","category":"page"},{"location":"#Acknowledgements","page":"Home","title":"Acknowledgements","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Thanks to Johannes Schumann for providing the awesome project logo!","category":"page"},{"location":"examples/online_data/#Online-data","page":"Online data","title":"Online data","text":"","category":"section"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"Let's use the KM3NeTTestData Julia package which contains all kinds of KM3NeT related sample files. The datapath() function can be used to get a path to such a file. In the following, we will discover the numucc.root file which contains 10 muon neutrino charged current interaction events.","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"online\", \"km3net_online.root\"))","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"The ROOTFile is the container object which gives access to both the online and offline tree. In this case, the online tree is empty","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"f.offline","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"and the online tree holds 3 events and 3 summaryslices:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"f.online","category":"page"},{"location":"examples/online_data/#Events","page":"Online data","title":"Events","text":"","category":"section"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"To access a single event, you can use the usual indexing syntax:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"some_event = f.online.events[2]","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"note: Note\nWhile both the offline and online tree contain events which are essentially an array of events (Vector{Evt} respectively Vector{DAQEvent}), the online tree also contains summaryslices and timeslices (timeslices are not implemented yet). For simplicity, indexing into an OfflineTree is directly indexing into events by default, while in case of the OfflineTree the field .events is necessary.","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"or ranges of events:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"events = f.online.events[2:3]","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"Another way to access events is given by getter function getevent() (which also works for online trees). If a single number if passed, it will be treated as a regular index, just like above:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"event = getevent(f.online, 2)","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"when two numbers are passed, the first one is interpreted as frame_index and the second one as trigger_counter:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"event = getevent(f.online, 127, 1)","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"note: Note\nEvents in a ROOT tree are not strictly ordered by time or frame_index and trigger_counter, therefore accessing an event via these two parameters needs a traverse through the tree. The indices are cached for future access but you may experience some delays especially dependening on the location of the event in the tree. In future, a fuzzy binary search might be implemented to speed up this process signifficantly.","category":"page"},{"location":"manual/tools/#Tools","page":"Tools","title":"Tools","text":"","category":"section"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"There are many commonly used routines to find for example the best reconstructed muon track or find out if a given hit was flagged by a specific trigger algorithm. This section will show some helper functions available in KM3io.jl.","category":"page"},{"location":"manual/tools/#Best-track/shower","page":"Tools","title":"Best track/shower","text":"","category":"section"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"In KM3NeT, the best reconstructed track or shower of a given set of tracks respectively showers is the one with the highest value of the likelihood parameter (lik) and the longest reconstruction history (rec_stages) which is a record of reconstruction stages performed during the whole fitting procedure.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The offline dataformat, which is used to store reconstruction information, has only a single Vector{Trk} per event which is a flat list of reconstructed tracks and showers. This vector can be a mix of different reconstruction algorithms (JGandalf, aashower, FibonacciFit, ...) and different stages of each, like prefit candidates, intermediate fits and final results. Therefore it is necessary to take the reconstruction type (rec_type) and also the values of the reconstruction stages (rec_stages) into account. Each reconstruction algorithm and each of their reconstruction stages have their own unique identifiers, which are stored in these two fields.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"note: Note\nBoth tracks and showers are stored as Trk. This comes from the fact that the original KM3NeT dataformat defintion for offline files uses the same C++ class (named Trk).","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The helper functions in KM3io.jl to pick the best track/shower always start with the prefix best, followed by the common name of the reconstruction routine, like jppmuon, or aashower. For example bestjppmuon(), bestjppshower() or besttrack(), latter being a more general function which gives the possibility to fine tune the selection criteria.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The API documentation of all related functions can be found in the Reconstruction section.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The input can be an event (Evt) or a vector of reconstructed tracks (Vector{Trk}). If no track/shower could be found, missing is returned instead.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Below are some examples of how to use these functions.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"offline\", \"km3net_offline.root\"))","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"event = f.offline[1]","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppmuon(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppshower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestaashower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppshower(event.trks)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestaashower(event.trks)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Additonally, there are helper functions which can be used to check if a specific reconstruction stage or result is present in an event or a given set of tracks/showers.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"track = event.trks |> first","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuonprefit(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuonsimplex(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuongandalf(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuonfit(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasaashowerfit(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasreconstructedjppmuon(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasreconstructedjppshower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasreconstructedaashower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"note: Note\nTo check multiple events in one go, use the Broadcasting feature of the Julia language by putting a dot (.) at the end of the function name, e.g. bestjppmuon.(f.offline) which will find the best Jpp muon reconstruction result for each event in the offline tree.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppmuon.(f.offline[2:5])","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Let's close our file ;)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"close(f)","category":"page"},{"location":"manual/tools/#Trigger-masks/flags","page":"Tools","title":"Trigger masks/flags","text":"","category":"section"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"KM3NeT uses a 64bit integer type to store information about which triggers have fired for a given event or hit. The index of the bit which indicates if a specific trigger has fired is defined in the KM3NeT Dataformat specification which is used in KM3io.jl.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Functions to check if a trigger has fired are for example","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"is3dmuon()\nis3dshower()\nismxshower()\nisnb()","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"which all accept either an event is input or something which has a .trigger_mask field, like a triggered hit.","category":"page"}]
+[{"location":"manual/auxfiles/#Auxiliary-Files","page":"Auxiliary Files","title":"Auxiliary Files","text":"","category":"section"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"There are a bunch of auxiliary file formats in KM3NeT which are used in different stages of processing and calibration procedures. KM3io.jl supports many of them by defining a container type and extending the Base.read function so that the general pattern is:","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"f = read(\"path/to/the.file\", FileContainerType)","category":"page"},{"location":"manual/auxfiles/#PMT-File","page":"Auxiliary Files","title":"PMT File","text":"","category":"section"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"The container type PMTFile is used to load PMT files which are produced by the K40 calibration procedure in Jpp.","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"Below is an example, using a PMT file from the KM3NeTTestData.jl package.","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"using KM3io\nusing KM3NeTTestData\n\npmtfile = read(datapath(\"pmt\", \"calibration_00000117_H_1.0.0_00013757_00013826_1.txt\"), PMTFile)","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"Data for individual PMTs can be accessed by indexing using the module ID and the DAQ channel ID of the PMT:","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"pmtdata = pmtfile[806451572, 4]\npmtdata.gain","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"The returned type is PMTData with following fields:","category":"page"},{"location":"manual/auxfiles/","page":"Auxiliary Files","title":"Auxiliary Files","text":"fieldnames(typeof(pmtdata))","category":"page"},{"location":"manual/detector/#Detector-and-its-Components","page":"Detector and its Components","title":"Detector and its Components","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"In this example, we will explore the components of a KM3NeT detector, which is represented by the Detector type in KM3io.jl. The detector description is stored in so-called DETX and DATX files, named after their filename extensions .detx (ASCII) and .datx (binary) respectively. By time of writing this example, v5 is the latest format version.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"note: Note\nKM3io.jl offers conversions between the different DETX format versions. Typically, each major version brings a new set of parameters. Downgrading is therefore not lossless. When when upgrading from one version to another, the new parameters needs to be filled in. Some of these can be calculated from existing ones, like the module position, which was introduced in v4 and is equal to the crossing point of the PMT axes. Otherwise, these parameters are either set to meaningful default values or to missing.","category":"page"},{"location":"manual/detector/#Loading-a-DETX/DATX-File","page":"Detector and its Components","title":"Loading a DETX/DATX File","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"The Detector type has a constructor which takes a filepath to a DETX or DATX file. The KM3NeTTestData.jl offers a collection of detector sample files, so let's pick one of them:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"using KM3io, KM3NeTTestData\n\ndet = Detector(datapath(\"detx\", \"detx_v5.detx\"))","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"A detector configuration (format version 5) has been loaded with 6 strings (sometimes also called detection unit or DU) holding a total 114 modules.","category":"page"},{"location":"manual/detector/#Retrieve-a-detector-from-the-DB","page":"Detector and its Components","title":"Retrieve a detector from the DB","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"KM3io.jl comes with a KM3DB.jl extension which allows to load detector information directly from the database. The extension is automatically loaded when KM3DB is imported:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"using KM3io\nusing KM3DB\n\ndet = Detector(133)","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Keyword arguments passed as Detector(det_id; kwarg1=..., kwarg2=..., ...) are handed over to the detx() function in KM3DB.jl.","category":"page"},{"location":"manual/detector/#Accessing-Modules","page":"Detector and its Components","title":"Accessing Modules","text":"","category":"section"},{"location":"manual/detector/#Iterating-over-all-modules","page":"Detector and its Components","title":"Iterating over all modules","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"There are multiple ways to access modules within a Detector. One of them is iterating over it, which yields DetectorModule instances in no specific order:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"for m in det\n    println(m)\nend","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"warning: Warning\nmodule is a reserved keyword in Julia and mod is the \"modulo function\", so keep this in mind when chosing a variable name for a DetectorModule. Most of the time m is fine, or just be verbose with detector_module and use your editors tab-completion.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"As we can see in the output, there are two types of modules: optical modules and base modules. The main difference between the two in the detector file context is that base modules do not contain PMTs and are always sitting on floor 0.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"note: Note\nAlthough iterating over a Detector feels like iterating over a vector, accessing single elements via det[idx] will not work as such since it requires the idx to be a module ID. This design was chosen since the detector dataformat specification does not specify module ordering, so there is no such thing as the \"n-th module\". Accessing modules by their module ID however is the standard use case, see below.","category":"page"},{"location":"manual/detector/#Detector-Modules","page":"Detector and its Components","title":"Detector Modules","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Modules have a unique identification number called module ID (sometimes also called \"DOM ID\", where DOM stands for \"Digital Optical Module\") and we can use this ID to access individual modules within a Detector instance.","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"The .modules field is a dictionary which maps the modules to their module IDs:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"det.modules","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"A flat vector of modules can be obtained with:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"modules(det)","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"To access a module with a given module ID, one can either use the dictionary or index the Detector directly, which is the recommended way:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"detector_module = det[808468425]","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Or for a given string and floor:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"det[3, 15]","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"It is possible to select all modules for a given floor on all strings using  the : syntax. Here we select all the base modules on each string:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"det[:, 0]","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Another way is using the getmodule(d::Detector, string::Integer, floor::Integer) function to access a module on a given string and floor:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"detector_module = getmodule(det, 3, 15)","category":"page"},{"location":"manual/detector/#PMTs","page":"Detector and its Components","title":"PMTs","text":"","category":"section"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"Each optical module consists of PMTs, which can be access using the getpmts(m::DetectorModule) function:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"getpmts(detector_module)","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"To access a specific PMT with a given channel ID (TDC ID), use the getpmt(m::DetectorModule, channel_id::Integer) function. Here, we access the PMT at DAQ channel 0 of our previously obtained detector module:","category":"page"},{"location":"manual/detector/","page":"Detector and its Components","title":"Detector and its Components","text":"getpmt(detector_module, 0)","category":"page"},{"location":"manual/calibration/#Calibration","page":"Calibration","title":"Calibration","text":"","category":"section"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"In general, data related to detector calibration are either stored in the database or in the Calibration Archive.","category":"page"},{"location":"manual/calibration/#Hits","page":"Calibration","title":"Hits","text":"","category":"section"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"Hit calibration is implemented but not documented here yet. Check out the docs for calibrate().","category":"page"},{"location":"manual/calibration/#Module-Orientations","page":"Calibration","title":"Module Orientations","text":"","category":"section"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"Module orientation data is stored in ROOT files which are generated by the Jpp framework. The corresponding ROOT files, which are the output of the dynamic calibration procedure, are stored in the Calibration Archive under orientations/.","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"KM3io.jl extends the Base.read function with a method which reads the whole orientations file at once in an object of type Orientations. This object can be called to calculate the orientation of a module (as a quaternion) for a given time, as long as the time is within the time range of the orientation data. The quaternions from the orientation data are interpolated for the given time using slerp().","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"The following example shows how to read the orientation data and obtain the orientation quaternion for a module at a given time.","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"using KM3io, KM3NeTTestData\n\no = read(datapath(\"calib\", \"KM3NeT_00000133_D_1.0.0_00017397_00017496_1.orientations.root\"), Orientations)\n\nmodule_id = 817589211\n\nq = o(module_id,  1693408347)","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"The quaternions can be converted to Compass object which has the fields .yaw, .pitch and .roll:","category":"page"},{"location":"manual/calibration/","page":"Calibration","title":"Calibration","text":"compass = Compass(q)","category":"page"},{"location":"examples/controlhost/#Accessing-Live-Data","page":"Accessing Live Data","title":"Accessing Live Data","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"This example shows how to access and process live data (events) from the KM3NeT DAQ system. We will use two Jpp command line tools (JLigier and JRegurgitate) to create a ligier dispatcher and send triggered DAQ events to it.","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"This example uses Jpp v14.4.3 and real data from a KM3NeT detector (online ROOT format) with the filename KM3NeT_00000075_00010275.root which can be found on the HPSS storage.","category":"page"},{"location":"examples/controlhost/#Launching-JLigier","page":"Accessing Live Data","title":"Launching JLigier","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"We open a terminal and launch the JLigier process with a high debug level. This ligier is the central communication point and it will receive messages which are tagged with short label of maximum 8 characters.","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"$ JLigier -P 5553 -d 3\nPort              5553\nMemory limit 16760735744\nQueue  limit        100","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"The ligier is now running and and listening on port 5553 of all host IP addresses (including the localhost 127.0.0.1). Clients can connect to it and subscribe for a given set of message tags. Leave this terminal open.","category":"page"},{"location":"examples/controlhost/#Simulating-the-DAQ","page":"Accessing Live Data","title":"Simulating the DAQ","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"The first client we start in new terminal session is the JRegurgitate process which takes a ROOT file (in online format), a class identifier, a few other parameters like the frequency and timeout of the messages and also the IP and port of the ligier to send to. We will use this application to simulate the KM3NeT DAQ – at least the output of the JDataFilter which is responsible for triggering events and sending them downstreams to a JLigier so that they can be picked up by the JDataWriter to store them in  ROOT files (online format).","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"$ JRegurgitate -f /data/sea/KM3NeT_00000075_00010275.root -C JDAQEvent -R 2 -T 10000000 -H 127.0.0.1:5553","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"This program is fairly quite but if you look at the terminal where the JLigier is running, you'll see a flood of messages, showing that a new client has connected and data is received (tagged with IO_EVT). It also prints the number of bytes of each message:","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"$ JLigier -P 5553 -d 3\nPort              30001\nMemory limit 16760735744\nQueue  limit        100\nNew client[4]\nClient[4].read(0,1,1756)\nClient[4].read(1,2,0)\nMessage[4] IO_EVT 1772\nClient[4].read(0,1,1394)\nClient[4].read(1,2,0)\nMessage[4] IO_EVT 1410\nClient[4].read(0,1,1716)\n...\n...\n...","category":"page"},{"location":"examples/controlhost/#Retrieving-Events","page":"Accessing Live Data","title":"Retrieving Events","text":"","category":"section"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"Now open a thrid terminal and fire up the Julia REPL. With a few lines, we will able to connect to the ligier and receive DAQ events interactively.","category":"page"},{"location":"examples/controlhost/","page":"Accessing Live Data","title":"Accessing Live Data","text":"julia> using KM3io\n\njulia> c = CHClient{KM3io.DAQEvent}(ip\"127.0.0.1\", 5553)\nCHClient{DAQEvent}(ip\"127.0.0.1\", 0x7531, CHTag[CHTag(\"IO_EVT\")], Sockets.TCPSocket(RawFD(20) open, 0 bytes waiting))\n\njulia> for e in c\n         @show e\n       end\ne = DAQEvent with 126 snapshot and 7 triggered hits\ne = DAQEvent with 138 snapshot and 6 triggered hits\ne = DAQEvent with 149 snapshot and 6 triggered hits\ne = DAQEvent with 149 snapshot and 6 triggered hits\ne = DAQEvent with 136 snapshot and 6 triggered hits\n...\n...\n...","category":"page"},{"location":"api/#API","page":"API","title":"API","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"","category":"page"},{"location":"api/#Basic-Data-Structures","page":"API","title":"Basic Data Structures","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"Position\nDirection\nLocation","category":"page"},{"location":"api/#KM3io.Position","page":"API","title":"KM3io.Position","text":"struct Position{T} <: StaticArraysCore.FieldVector{3, T}\n\nA vector to represent a position in 3D.\n\nFields\n\nx::Any\ny::Any\nz::Any\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Direction","page":"API","title":"KM3io.Direction","text":"struct Direction{T<:AbstractFloat} <: StaticArraysCore.FieldVector{3, T<:AbstractFloat}\n\nA vector to represent a direction in 3D.\n\nFields\n\nx::AbstractFloat\ny::AbstractFloat\nz::AbstractFloat\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Location","page":"API","title":"KM3io.Location","text":"struct Location\n\nA module's location in the detector where string represents the detection unit identifier and floor counts from 0 from the bottom to top. Base modules are sitting on floor 0 and optical modules on floor 1 and higher.\n\nFields\n\nstring::Int32\nfloor::Int8\n\n\n\n\n\n","category":"type"},{"location":"api/#Offline-Format","page":"API","title":"Offline Format","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"Evt\nCalibratedHit\nCalibratedMCHit\nXCalibratedHit\nTrk\nMCTrk\nFitInformation","category":"page"},{"location":"api/#KM3io.Evt","page":"API","title":"KM3io.Evt","text":"struct Evt\n\nAn offline event.\n\nFields\n\nid::Int64\ndet_id::Int64\nmc_id::Int64\nrun_id::Int64\nmc_run_id::Int64\nframe_index::Int64\ntrigger_mask::UInt64\ntrigger_counter::UInt64\noverlays::UInt64\nt::UTCTime\nhits::Vector{CalibratedHit}\ntrks::Vector{Trk}\nw::Vector{Float64}\nw2list::Vector{Float64}\nw3list::Vector{Float64}\nmc_event_time::UTCTime\nmc_t::Float64\nmc_hits::Vector{CalibratedMCHit}\nmc_trks::Vector{MCTrk}\nindex::Int64\nflags::Int64\nusr::Dict{String, Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedHit","page":"API","title":"KM3io.CalibratedHit","text":"struct CalibratedHit <: AbstractCalibratedHit\n\nA calibrated hit of the offline dataformat. Caveat: the position, direction and t fields might still be 0 due to the design philosophy of the offline format (one class for all).\n\nFields\n\ndom_id::Int32\nchannel_id::UInt32\ntdc::UInt32\ntot::UInt32\ntrigger_mask::UInt64\nt::Float64\npos::Position{Float64}\ndir::Direction{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedMCHit","page":"API","title":"KM3io.CalibratedMCHit","text":"struct CalibratedMCHit <: KM3io.AbstractCalibratedMCHit\n\nA calibrated MC hit of the offline dataformat. Caveat: the position and direction fields might still be 0 due to the design philosophy of the offline format (one class for all).\n\nFields\n\npmt_id::Int32\nt::Float64\na::Float64\ntype::Int32\norigin::Int32\npos::Position{Float64}\ndir::Direction{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.XCalibratedHit","page":"API","title":"KM3io.XCalibratedHit","text":"struct XCalibratedHit <: AbstractCalibratedHit\n\nA fully dressed hit with all calibration information which can be obtained. This structure is similar to the Hit structure in aanet and should be used wisely. Most of the time it's much more performant to use dedicated (simplified) structures.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt32\nt::Float64\ntot::UInt8\ntrigger_mask::UInt64\npos::Position{Float64}\ndir::Direction{Float64}\nt0::Float64\nstring::UInt8\nfloor::UInt8\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Trk","page":"API","title":"KM3io.Trk","text":"struct Trk\n\nRepresents a reconstructed \"track\", which can be e.g. a muon track but also a shower.\n\nFields\n\nid::Int64\npos::Position{Float64}\ndir::Direction{Float64}\nt::Float64\nE::Float64\nlen::Float64\nlik::Float64\nrec_type::Int32\nrec_stages::Vector{Int32}\nfitinf::FitInformation\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.MCTrk","page":"API","title":"KM3io.MCTrk","text":"struct MCTrk\n\nA simulated (Monte Carlo, hence \"MC\") track (or shower).\n\nFields\n\nid::Int64\npos::Position{Float64}\ndir::Direction{Float64}\nt::Float64\nE::Float64\nlen::Float64\ntype::Int32\nstatus::Int32\nmother_id::Int32\ncounter::Int32\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.FitInformation","page":"API","title":"KM3io.FitInformation","text":"struct FitInformation\n\nA container object to store fit information which uses 0-based indexing. It implements the array interface. The entries is this vector are float values and their position encodes the meaning of their meaning which is defined in the KM3NeT DataFormat\n\nnote: Note\nThe elements of this object should always be accessed using constants defined in KM3io.FITINFORMATION. The use of magic numbers should be avoided to ensure that future changes in the KM3NeT DataFormat do not break existing code.\n\nFields\n\nvalues::Vector{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Online-Format","page":"API","title":"Online Format","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"DAQEvent\nEventHeader\nSnapshotHit\nTriggeredHit\nCalibratedSnapshotHit\nCalibratedTriggeredHit\nUTCTime\nUTCExtended\nSummaryslice\nSummarysliceHeader\nSummaryFrame","category":"page"},{"location":"api/#KM3io.DAQEvent","page":"API","title":"KM3io.DAQEvent","text":"struct DAQEvent\n\nA (triggered) event holding snapshot hits and triggered hits. The triggered hits are a subset of the snapshot hits.\n\nFields\n\nheader::EventHeader\nsnapshot_hits::Vector{SnapshotHit}\ntriggered_hits::Vector{TriggeredHit}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.EventHeader","page":"API","title":"KM3io.EventHeader","text":"struct EventHeader\n\nThe header of an event.\n\nFields\n\ndetector_id::Int32\nrun::Int32\nframe_index::Int32\nt::UTCExtended\ntrigger_counter::UInt64\ntrigger_mask::UInt64\noverlays::UInt32\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.SnapshotHit","page":"API","title":"KM3io.SnapshotHit","text":"struct SnapshotHit <: KM3io.AbstractDAQHit\n\nA snapshot hit.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt8\nt::Int32\ntot::UInt8\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.TriggeredHit","page":"API","title":"KM3io.TriggeredHit","text":"struct TriggeredHit <: KM3io.AbstractDAQHit\n\nA hit which was triggered.\n\nFields\n\ndom_id::Int32\nchannel_id::UInt8\nt::Int32\ntot::UInt8\ntrigger_mask::UInt64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedSnapshotHit","page":"API","title":"KM3io.CalibratedSnapshotHit","text":"struct CalibratedSnapshotHit <: AbstractCalibratedHit\n\nA calibrated snapshot hit.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt8\nt::Float64\ntot::UInt8\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.CalibratedTriggeredHit","page":"API","title":"KM3io.CalibratedTriggeredHit","text":"struct CalibratedTriggeredHit <: AbstractCalibratedHit\n\nA calibrated triggered hit.\n\nFields\n\ndom_id::UInt32\nchannel_id::UInt8\nt::Float64\ntot::UInt8\ntrigger_mask::UInt64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.UTCTime","page":"API","title":"KM3io.UTCTime","text":"struct UTCTime\n\nA basic time structure with seconds and nanoseconds. The seconds are counting from the start of the epoch, just like the UNIX time.\n\nFields\n\ns::UInt64\nns::UInt64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.UTCExtended","page":"API","title":"KM3io.UTCExtended","text":"struct UTCExtended\n\nAn extended time structure which contains the White Rabbit time synchronisation status. wr_status == 0 means that the synchronisation is OK.\n\nFields\n\ns::UInt32\nns::UInt32\nwr_status::Int64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Summaryslice","page":"API","title":"KM3io.Summaryslice","text":"struct Summaryslice\n\nA summaryslice is a condensed timeslice with the header information of the corresponding timeslice and a summary frame for each optical module. The hit information of the original timeslice is reduced so that for each PMT a single byte is used to encode the hit rate.\n\nFields\n\nheader::SummarysliceHeader\nframes::Vector{SummaryFrame}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.SummarysliceHeader","page":"API","title":"KM3io.SummarysliceHeader","text":"struct SummarysliceHeader\n\nThe header of a summaryslice.\n\nFields\n\ndetector_id::Int32\nrun::Int32\nframe_index::Int32\nt::UTCExtended\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.SummaryFrame","page":"API","title":"KM3io.SummaryFrame","text":"struct SummaryFrame\n\nA SummaryFrame contains reduced timeslice data from an optical module.\n\nThe PMT rates are encoded as single bytes and can be converted to real hit rates using the rates(s::SummaryFrame) function.\n\nFields\n\ndom_id::Int32\ndaq::UInt32\nstatus::UInt32\nfifo::UInt32\nstatus3::UInt32\nstatus4::UInt32\nrates::StaticArraysCore.SVector{31, UInt8}\n\n\n\n\n\n","category":"type"},{"location":"api/#Oscillations-Open-Data","page":"API","title":"Oscillations Open Data","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"OscillationsData\nOSCFile\nResponseMatrixBin\nResponseMatrixBinNeutrinos\nResponseMatrixBinMuons\nResponseMatrixBinData\nOscOpenDataTree","category":"page"},{"location":"api/#KM3io.OscillationsData","page":"API","title":"KM3io.OscillationsData","text":"abstract type OscillationsData\n\nOscillationsData is an abstract type representing the data in an oscillation open data file.\n\nFields\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.OSCFile","page":"API","title":"KM3io.OSCFile","text":"struct OSCFile\n\nOSCFile is a structure representing an oscillation open data file. Depending on the trees inside the root file it will have different fields (neutrino, muons, data).\n\nFields\n\n_fobj::Union{UnROOT.ROOTFile, Dict}\nrawroot::Union{Nothing, UnROOT.ROOTFile}\nosc_opendata_nu::Union{Nothing, OscillationsData}\nosc_opendata_data::Union{Nothing, OscillationsData}\nosc_opendata_muons::Union{Nothing, OscillationsData}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.ResponseMatrixBin","page":"API","title":"KM3io.ResponseMatrixBin","text":"abstract type ResponseMatrixBin\n\nA ResponseMatrixBin is an abstract type representing a bin in a response matrix.\n\nFields\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.ResponseMatrixBinNeutrinos","page":"API","title":"KM3io.ResponseMatrixBinNeutrinos","text":"struct ResponseMatrixBinNeutrinos <: ResponseMatrixBin\n\nA concrete type representing a response matrix bin for neutrino events.\n\nFields\n\nE_reco_bin::Int64\nCt_reco_bin::Int64\nE_true_bin::Int64\nCt_true_bin::Int64\nFlav::Int16\nIsCC::Int16\nAnaClass::Int16\nW::Float64\nWerr::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.ResponseMatrixBinMuons","page":"API","title":"KM3io.ResponseMatrixBinMuons","text":"struct ResponseMatrixBinMuons <: ResponseMatrixBin\n\nA concrete type representing a response matrix bin for muon events. There is no true quantities for muon events.\n\nFields\n\nE_reco_bin::Int64\nCt_reco_bin::Int64\nAnaClass::Int16\nW::Float64\nWerr::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.ResponseMatrixBinData","page":"API","title":"KM3io.ResponseMatrixBinData","text":"struct ResponseMatrixBinData <: ResponseMatrixBin\n\nA concrete type representing a response matrix bin for data events. There is no true quantities for data events.\n\nFields\n\nE_reco_bin::Int64\nCt_reco_bin::Int64\nAnaClass::Int16\nW::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.OscOpenDataTree","page":"API","title":"KM3io.OscOpenDataTree","text":"struct OscOpenDataTree{T} <: OscillationsData\n\nOscOpenDataTree is a structure representing an oscillation open data tree, it will be represented as response functions.\n\nFields\n\n_fobj::UnROOT.ROOTFile\n_bin_lookup_map::Dict{Tuple{Int64, Int64, Int64}, Int64}\n_t::Any\ntpath::String\n\n\n\n\n\n","category":"type"},{"location":"api/#HDF5","page":"API","title":"HDF5","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"H5File\nH5CompoundDataset\naddmeta\ncreate_dataset\nflush","category":"page"},{"location":"api/#KM3io.H5File","page":"API","title":"KM3io.H5File","text":"struct H5File\n\nA wrapper for an HDF5 file used in KM3NeT.\n\nFields\n\n_h5f::HDF5.File\n_datasets::Dict{String, H5CompoundDataset}\n_lock::ReentrantLock\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.H5CompoundDataset","page":"API","title":"KM3io.H5CompoundDataset","text":"struct H5CompoundDataset{T}\n\nA flat HDF5 compound dataset which is essentially a vector of structs. It has a cache which is filled when elements are pushed to it. The cache is automatically written to the target HDF5 path when full.\n\nFields\n\ndset::HDF5.Dataset\ncache::KM3io.H5CompoundDatasetCache\n_lock::ReentrantLock\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.addmeta","page":"API","title":"KM3io.addmeta","text":"addmeta(\n    dset::Union{HDF5.Dataset, HDF5.Datatype, HDF5.File, HDF5.Group},\n    object\n)\n\n\nAttaches key-value-pair meta entries to an HDF5 instance for each field of the given object.\n\n\n\n\n\n","category":"function"},{"location":"api/#HDF5.create_dataset","page":"API","title":"HDF5.create_dataset","text":"create_dataset(\n    f::H5File,\n    path::AbstractString,\n    ::Type{T};\n    cache_size,\n    chunk,\n    filters,\n    kwargs...\n) -> H5CompoundDataset\n\n\nCreates a one-dimensional compound dataset H5CompoundDataset of a given type which can be extended one-by-one. The cache is used to accumulate data and reduce the number of dataset extensions. Each time the cache is full, the HDF5 dataset will be extended, the buffer written and cleared.\n\nTo force the writing, use flush\n\n\n\n\n\n","category":"function"},{"location":"api/#Base.flush","page":"API","title":"Base.flush","text":"flush(d::H5CompoundDataset; nolock) -> H5CompoundDataset\n\n\nForces the cache to be written to the HDF5 file.\n\n\n\n\n\n","category":"function"},{"location":"api/#Hardware","page":"API","title":"Hardware","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"PMT\nDetectorModule\nDetector\nPMTFile\nPMTData\nmodules\ngetmodule\ngetpmt\nhaslocation\nhasstring\nisbasemodule\nisopticalmodule\nwrite(::AbstractString, ::Detector)\nwrite(::IO, ::Detector)\nHydrophone\nread(::AbstractString, ::Type{Hydrophone})\nTripod\nread(::AbstractString, ::Type{Tripod})\nwrite(::AbstractString, ::Vector{Tripod})\npiezoenabled\nhydrophoneenabled\ncenter\nStringMechanics\nStringMechanicsParameters\nread(::AbstractString, ::Type{StringMechanics})","category":"page"},{"location":"api/#KM3io.PMT","page":"API","title":"KM3io.PMT","text":"struct PMT\n\nThe photomultiplier tube of an optical module. The id stands for the DAQ channel ID.\n\nA non-zero status means the PMT is \"not OK\". Individual bits can be read out to identify the problem (see definitions/pmt_status.jl for the bit positions and check them using the nthbitset() function).\n\nFields\n\nid::Int32\npos::Position{Float64}\ndir::Direction{Float64}\nt₀::Float64\nstatus::Union{Missing, Int32}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.DetectorModule","page":"API","title":"KM3io.DetectorModule","text":"struct DetectorModule\n\nEither a base module or an optical module. A non-zero status means the module is \"not OK\". Individual bits can be read out to identify the problem (see definitions/module_status.jl for the bit positions and check them using the nthbitset() function).\n\nFields\n\nid::Int32\npos::Position{Float64}\nlocation::Location\nn_pmts::Int8\npmts::Vector{PMT}\nq::Union{Missing, Quaternion{Float64}}\nstatus::Int32\nt₀::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Detector","page":"API","title":"KM3io.Detector","text":"struct Detector\n\nA KM3NeT detector.\n\nFields\n\nversion::Int8\nid::Int32\nvalidity::Union{Missing, KM3io.DateRange}\npos::Union{Missing, UTMPosition{Float64}}\nutm_ref_grid::Union{Missing, String}\nn_modules::Int32\nmodules::Dict{Int32, DetectorModule}\nlocations::Dict{Tuple{Int64, Int64}, DetectorModule}\nstrings::Vector{Int64}\ncomments::Vector{String}\n_pmt_id_module_map::Dict{Int64, DetectorModule}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.PMTFile","page":"API","title":"KM3io.PMTFile","text":"struct PMTFile\n\nA container type to hold PMT data which are stored in \"PMT files\", created by K40 calibrations. This type can be passe to Base.read to load the contents of such a file.\n\nExample\n\njulia> f = read(\"path/to/pmt.txt\", PMTFile)\nPMTFile containing parameters of 7254 PMTs\n\nFields\n\nQE::Float64\nmu::Float64\ncomments::Vector{String}\nparameters::KM3io.PMTParameters\npmt_data::Dict{Tuple{Int64, Int64}, PMTData}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.PMTData","page":"API","title":"KM3io.PMTData","text":"struct PMTData\n\nPMT parameters as stored in PMTFiles.\n\nFields\n\nQE::Float64\ngain::Float64\ngainSpread::Float64\nriseTime_ns::Float64\nTTS_ns::Float64\nthreshold::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.modules","page":"API","title":"KM3io.modules","text":"modules(d::Detector) -> Vector{DetectorModule}\n\n\nReturn a vector of all modules of a given detector.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.getmodule","page":"API","title":"KM3io.getmodule","text":"getmodule(d::Detector, module_id::Integer) -> DetectorModule\n\n\nReturn the detector module for a given module ID.\n\n\n\n\n\ngetmodule(\n    d::Detector,\n    string::Integer,\n    floor::Integer\n) -> DetectorModule\n\n\nReturn the detector module for a given string and floor.\n\n\n\n\n\ngetmodule(\n    d::Detector,\n    loc::Tuple{T<:Integer, T<:Integer}\n) -> DetectorModule\n\n\nReturn the detector module for a given string and floor (as Tuple).\n\n\n\n\n\ngetmodule(d::Detector, loc::Location) -> DetectorModule\n\n\nReturn the detector module for a given location.\n\n\n\n\n\ngetmodule(d::Detector, hit::KM3io.AbstractDAQHit) -> Any\n\n\nReturn the detector module for a given DAQ hit.\n\n\n\n\n\ngetmodule(\n    d::Detector,\n    hit::KM3io.AbstractMCHit\n) -> DetectorModule\n\n\nReturn the detector module for a given MC hit.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.getpmt","page":"API","title":"KM3io.getpmt","text":"getpmt(d::DetectorModule, channel_id::Integer) -> Any\n\n\nGet the PMT for a given DAQ channel ID (TDC)\n\n\n\n\n\ngetpmt(d::Detector, hit::KM3io.AbstractDAQHit) -> Any\n\n\nReturn the PMT for a given hit.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.haslocation","page":"API","title":"KM3io.haslocation","text":"haslocation(d::Detector, loc::Location) -> Bool\n\n\nReturns true if there is a module at the given location.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hasstring","page":"API","title":"KM3io.hasstring","text":"hasstring(d::Detector, s::Integer) -> Union{Missing, Bool}\n\n\nReturns true if there is a string with a given number.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.isbasemodule","page":"API","title":"KM3io.isbasemodule","text":"isbasemodule(d::DetectorModule) -> Bool\n\n\nReturns true if the module is a basemodule.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.isopticalmodule","page":"API","title":"KM3io.isopticalmodule","text":"isopticalmodule(d::DetectorModule) -> Bool\n\n\nReturns true if the module is an optical module.\n\n\n\n\n\n","category":"function"},{"location":"api/#Base.write-Tuple{AbstractString, Detector}","page":"API","title":"Base.write","text":"write(filename::AbstractString, d::Detector; version)\n\n\nWrites the detector definition to a file, according to the DETX format specification. The version parameter can be a version number or :same, which is the default value and writes the same version as the provided detector has.\n\n\n\n\n\n","category":"method"},{"location":"api/#Base.write-Tuple{IO, Detector}","page":"API","title":"Base.write","text":"write(io::IO, d::Detector; version)\n\n\nfunction write(io::IO, d::Detector; version=:same)\n\nWrites the detector to a DETX formatted file. The target version can be specified via the version keyword. Note that if converting to higher versions, missing parameters will be filled with reasonable default values. In case of downgrading, information will be lost.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.Hydrophone","page":"API","title":"KM3io.Hydrophone","text":"struct Hydrophone\n\nA hydrophone, typically installed in the base module of a KM3NeT detector's string.\n\nFields\n\nlocation::Location\npos::Position{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{Hydrophone}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{Hydrophone}\n) -> Vector{Hydrophone}\n\n\nfunction read(filename::AbstractString, T::Type{Hydrophone})\n\nReads a vector of Hydrophones from an ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.Tripod","page":"API","title":"KM3io.Tripod","text":"struct Tripod\n\nA tripod installed on the seabed which sends acoustic signals to modules.\n\nFields\n\nid::Int8\npos::Position{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{Tripod}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{Tripod}\n) -> Vector{Tripod}\n\n\nfunction read(filename:AbstractString, T::Type{Tripod})\n\nReads a vector of Tripods from an ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#Base.write-Tuple{AbstractString, Vector{Tripod}}","page":"API","title":"Base.write","text":"write(filename::AbstractString, tripods::Vector{Tripod})\n\n\nfunction write(filename::AbstractString, tripods::Dict{Int8, Tripod})\n\nWrites the position of tripods out into an ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.piezoenabled","page":"API","title":"KM3io.piezoenabled","text":"piezoenabled(m::DetectorModule) -> Bool\n\n\nfunction piezoenabled(m::DetectorModule)\n\nReturn true if the piezo is enabled, false otherwise.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hydrophoneenabled","page":"API","title":"KM3io.hydrophoneenabled","text":"hydrophoneenabled(m::DetectorModule) -> Bool\n\n\nfunction hydrophonenabled(m::DetectorModule)\n\nReturn true if the hydrophone is enabled, false otherwise.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.center","page":"API","title":"KM3io.center","text":"center(m::DetectorModule) -> Position{Float64}\n\n\nCalculate the centre of a module by fitting the crossing point of the PMT axes.\n\n\n\n\n\ncenter(d::Detector) -> Position{Float64}\n\n\nCalculate the center of the detector based on the location of the optical modules.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.StringMechanics","page":"API","title":"KM3io.StringMechanics","text":"struct StringMechanics\n\nA container structure which holds the mechanical model parameters for multiple strings, including a default value for strings which have specific parameters.\n\nFields\n\ndefault::StringMechanicsParameters\nstringparams::Dict{Int64, StringMechanicsParameters}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.StringMechanicsParameters","page":"API","title":"KM3io.StringMechanicsParameters","text":"struct StringMechanicsParameters\n\nData structure for parameters of the mechanical model of strings. This data structure is used to calculate the effective height conform to the mechanical model of the string.\n\nFields\n\na::Float64\nb::Float64\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{StringMechanics}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{StringMechanics}\n) -> StringMechanics\n\n\nReads the mechanical models from a text file.\n\n\n\n\n\n","category":"method"},{"location":"api/#Optical-Data","page":"API","title":"Optical Data","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"","category":"page"},{"location":"api/#Acoustics","page":"API","title":"Acoustics","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"Waveform\nread(filename::AbstractString, T::Type{Waveform})\nAcousticSignal\nAcousticsTriggerParameter\nread(filename::AbstractString, T::Type{AcousticsTriggerParameter})","category":"page"},{"location":"api/#KM3io.Waveform","page":"API","title":"KM3io.Waveform","text":"struct Waveform\n\nWaveform translates Emitter ID to Tripod ID.\n\nFields\n\nids::Dict{Int8, Int8}\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{Waveform}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{Waveform}\n) -> Waveform\n\n\nfunction read(filename::AbstractString, T::Type{Waveform})\n\nReads the waveform ASCII file.\n\n\n\n\n\n","category":"method"},{"location":"api/#KM3io.AcousticSignal","page":"API","title":"KM3io.AcousticSignal","text":"struct AcousticSignal\n\nAcousticSignal is a custom type with four fields to store all the information inside the raw acoustic binary files.\n\ndom_id::Int32 ID of the module\nutc_seconds:: UInt32 storing the first 4 Bytes and is a UNIX time stamp\nns_cycles:: UInt32 storing the second 4 Bytes\nsamples:: UInt32 storing the third 4 Bytes, corresponding to the number of data points accuired during the measring window\npcm:: Vector of Float32 of length frame_length, storing all other 4 Byte blocks. Each entry is a data point of the acoustic signal.\n\nFields\n\ndom_id::Int32\nutc_seconds::UInt32\nns_cycles::UInt32\nsamples::UInt32\npcm::Vector{Float32}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.AcousticsTriggerParameter","page":"API","title":"KM3io.AcousticsTriggerParameter","text":"struct AcousticsTriggerParameter\n\nCertain parameters which define an acoustic event.\n\nFields\n\nq::Float64\ntmax::Float64\nnmin::Int32\n\n\n\n\n\n","category":"type"},{"location":"api/#Base.read-Tuple{AbstractString, Type{AcousticsTriggerParameter}}","page":"API","title":"Base.read","text":"read(\n    filename::AbstractString,\n    T::Type{AcousticsTriggerParameter}\n) -> AcousticsTriggerParameter\n\n\nfunction read(filename::AbstractString, T::Type{AcousticsTriggerParameter})\n\nReads the 'acousticstriggerparameters.txt' file.\n\n\n\n\n\n","category":"method"},{"location":"api/#Calibration","page":"API","title":"Calibration","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"calibrate\ncalibratetime\ncombine\nOrientations\nCompass\nQuaternion\nfloordist\nslew\nslerp","category":"page"},{"location":"api/#KM3io.calibrate","page":"API","title":"KM3io.calibrate","text":"calibrate(det::Detector, hits) -> Vector{XCalibratedHit}\n\n\nApply full geometry and time calibration to given hits. This way of calibration should be used wisely since it creates a very bloaded XCalibratedHit object, which might not be necessary. Often, we only need time the calibration to be applied.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.calibratetime","page":"API","title":"KM3io.calibratetime","text":"calibratetime(\n    det::Detector,\n    hits::Array{T<:SnapshotHit, 1}\n) -> Vector{CalibratedSnapshotHit}\n\n\nCalibrate the time of a given array of snapshot hits.\n\n\n\n\n\ncalibratetime(\n    det::Detector,\n    hits::Array{T<:TriggeredHit, 1}\n) -> Vector{CalibratedTriggeredHit}\n\n\nCalibrate the time of a given array of triggered hits.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.combine","page":"API","title":"KM3io.combine","text":"combine(\n    snapshot_hits::Vector{SnapshotHit},\n    triggered_hits::Vector{TriggeredHit}\n) -> Vector{TriggeredHit}\n\n\nCombine snapshot and triggered hits to a single hits-vector.\n\nThis should be used to transfer the trigger information to the snapshot hits from a DAQEvent. The triggered hits are a subset of the snapshot hits.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.Orientations","page":"API","title":"KM3io.Orientations","text":"struct Orientations\n\nA data structure to hold orientations data. This struct should be instantiated by Base.read(filename, Orientations).\n\nFields\n\nmodule_ids::Set{Int64}\ntimes::Dict{Int64, Vector{Float64}}\nquaternions::Dict{Int64, Vector{Quaternion}}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Compass","page":"API","title":"KM3io.Compass","text":"struct Compass{T} <: StaticArraysCore.FieldVector{3, T}\n\nA compass with yaw, pitch and roll.\n\nFields\n\nyaw::Any\npitch::Any\nroll::Any\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.Quaternion","page":"API","title":"KM3io.Quaternion","text":"struct Quaternion{T} <: StaticArraysCore.FieldVector{4, T}\n\nA simple quaternion derived from a FieldVector of StaticArrays, no more, no less.\n\nFields\n\nq0::Any\nqx::Any\nqy::Any\nqz::Any\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.floordist","page":"API","title":"KM3io.floordist","text":"floordist(det::Detector) -> Float64\n\n\nCalculates the average floor distance between neighboured modules.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.slew","page":"API","title":"KM3io.slew","text":"slew(tot::Integer) -> Any\n\n\nReturn the time slewing for a ToT.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.slerp","page":"API","title":"KM3io.slerp","text":"slerp(q₁, q₂, t::Real; dot_threshold, normalized) -> Any\n\n\nInterpolate between two vectors (e.g. quaternions) using the slerp method. t should be between 0 and 1. 0 will produce q₁ and 1 q₂.\n\nThe input vectors q₁ and q₂ will be normalised unless normalized is false. It is not done by default to shave off a few dozens of nanoseconds. Make sure to set normalized=false if the input vectors are not unit vectors.\n\n\n\n\n\n","category":"function"},{"location":"api/#Physics","page":"API","title":"Physics","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"azimuth\nzenith\nphi\ntheta\ncherenkov\nCherenkovPhoton\nK40Rates","category":"page"},{"location":"api/#KM3io.azimuth","page":"API","title":"KM3io.azimuth","text":"azimuth(d::Direction) -> Any\n\n\nCalculates the azimuth from a given Direction according to KM3NeT conventions.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.zenith","page":"API","title":"KM3io.zenith","text":"zenith(d::Direction) -> Any\n\n\nCalculates the zenith from a given Direction according to KM3NeT conventions.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.phi","page":"API","title":"KM3io.phi","text":"phi(d::Direction) -> Any\n\n\nCalculate the phi angle for a given direction\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.theta","page":"API","title":"KM3io.theta","text":"theta(d::Direction) -> Any\n\n\nCalculate the theta angle for a given direction\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.cherenkov","page":"API","title":"KM3io.cherenkov","text":"cherenkov(\n    track,\n    hits::Array{T<:AbstractCalibratedHit, 1}\n) -> Vector\n\n\nCalculates the parameters of cherenkov photons emitted from a track and hitting the PMTs represented as (calibrated) hits. The returned cherenkov photons hold information about the closest distance to track, the time residual, arrival time, impact angle, photon travel distance, track travel distance and photon travel direction. See CherenkovPhoton for more information.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.CherenkovPhoton","page":"API","title":"KM3io.CherenkovPhoton","text":"struct CherenkovPhoton\n\nA Cherenkov photon with parameters calculated from its inducing track. See cherenkov() for more information.\n\nFields\n\nd_closest::Float64\nd_photon::Float64\nd_track::Float64\nt::Float64\nΔt::Float64\nimpact_angle::Float64\ndir::Direction{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.K40Rates","page":"API","title":"KM3io.K40Rates","text":"struct K40Rates\n\nK40 rates with L0 and higher level rates (with increasing multiplicities).\n\nFields\n\nL0::Float64\nL1::Vector{Float64}\n\n\n\n\n\n","category":"type"},{"location":"api/#Trigger","page":"API","title":"Trigger","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"triggered\nis3dmuon\nis3dshower\nismxshower\nisnb","category":"page"},{"location":"api/#KM3io.triggered","page":"API","title":"KM3io.triggered","text":"triggered(e) -> Vector{T} where T<:KM3io.AbstractDAQHit\n\n\nReturn true if the passed object (hit, event, ...) was triggered by any trigger algorithm.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.is3dmuon","page":"API","title":"KM3io.is3dmuon","text":"is3dmuon(e::DAQEvent) -> Bool\n\n\nis3dmuon(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:12.\n\nReturn true the 3D Muon trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.is3dshower","page":"API","title":"KM3io.is3dshower","text":"is3dshower(e::DAQEvent) -> Bool\n\n\nis3dshower(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:20.\n\nReturn true if the 3D Shower trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.ismxshower","page":"API","title":"KM3io.ismxshower","text":"ismxshower(x) -> Bool\n\n\nismxshower(x)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:28.\n\nismxshower(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:29.\n\nReturn true if the MX Shower trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.isnb","page":"API","title":"KM3io.isnb","text":"isnb(x) -> Bool\n\n\nisnb(x)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:36.\n\nisnb(e)\n\ndefined at /builds/common/KM3io.jl/src/tools/trigger.jl:37.\n\nReturn true if the NanoBeacon trigger bit is set.\n\n\n\n\n\n","category":"function"},{"location":"api/#ControlHost","page":"API","title":"ControlHost","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"CHClient","category":"page"},{"location":"api/#KM3io.CHClient","page":"API","title":"KM3io.CHClient","text":"struct CHClient{T}\n\nA ControlHost client which can communicate with a Ligier dispatcher to receive messages for all the subscribed tags.\n\nTo connect to a Ligier which is receiving triggered DAQ events e.g. in the KM3NeT monitoring system or in a test setup consisting of a JLigier dispatcher and a JRegurgitate instance which is redispatching DAQ events (JDAQEvent) from a ROOT file in online format to the JLigier, a CHClient can be created to subscribe the event messages with\n\njulia> using KM3io\n\njulia> c = CHClient{DAQEvent}(ip\"127.0.0.1\", 5553)\n\njulia> for event in c\n           @show event\n       end\ne = KM3io.DAQEvent with 127 snapshot and 6 triggered hits\ne = KM3io.DAQEvent with 147 snapshot and 6 triggered hits\ne = KM3io.DAQEvent with 154 snapshot and 8 triggered hits\ne = KM3io.DAQEvent with 152 snapshot and 6 triggered hits\n...\n...\n...\n\nFields\n\nip::Sockets.IPv4\nport::UInt16\ntags::Vector{CHTag}\nsocket::Sockets.TCPSocket\n\n\n\n\n\n","category":"type"},{"location":"api/#Tools","page":"API","title":"Tools","text":"","category":"section"},{"location":"api/#General-tools","page":"API","title":"General tools","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"SummarysliceIntervalIterator\ngetevent\ncategorize\nnthbitset\nmost_frequent","category":"page"},{"location":"api/#KM3io.SummarysliceIntervalIterator","page":"API","title":"KM3io.SummarysliceIntervalIterator","text":"struct SummarysliceIntervalIterator\n\nAn iterator which yields a Vector{Summaryslice} containing summaryslices of a given time_interval (in seconds). Useful when analysing summary data with fixed time intervals. The returned summaryslices are also sorted in time.\n\nExamples\n\njulia> f = ROOTFile(\"KM3NeT_00000133_00014728.root\")\nROOTFile{OnlineTree (83509 events, 106969 summaryslices)}\n\njulia> sii = SummarysliceIntervalIterator(f, 60)\nSummarysliceIntervalIterator (10739.7s, 60s intervals, 179 chunks)\n\njulia> for summaryslices in sii\n           @show length(summaryslices)\n           @show summaryslices[1].header\n           break\n       end\nlength(summaryslices) = 599\n(summaryslices[1]).header = SummarysliceHeader(133, 14728, 134, UTCExtended(1676246413, 400000000, 0))\n\nnote: Note\nShort time intervals (a few tens of seconds) will likely return Vector{Summaryslice}s with few entries in the first and last iterations due to a delay in run changes. The number of frames per summaryslice will gradually increase due to the asynchronous nature of the run transition. See the example below with a time inteval of 10s and 100 active optical modules.\n\njulia> sii = SummarysliceIntervalIterator(f, 10)\nSummarysliceIntervalIterator (106.2s, 10s intervals, 11 chunks)\n\njulia> for summaryslices in sii\n           n = length(summaryslices)\n           @show n\n       end\nn = 73\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 100\nn = 96\nn = 31\n\nFields\n\nsc::KM3io.SummarysliceContainer\nfirst_frame_index::Int64\ntime_interval::Int64\nn_chunks::Int64\ntimespan::Float64\nindices::Vector{Int64}\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.getevent","page":"API","title":"KM3io.getevent","text":"getevent(\n    tree::Union{KM3io.OnlineTree, KM3io.OfflineTree},\n    frame_index,\n    trigger_counter\n) -> Any\n\n\nRetrieves the event with for a given frame_index and trigger_counter.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.categorize","page":"API","title":"KM3io.categorize","text":"categorize(\n    field::Symbol,\n    elements::Vector\n) -> Dict{_A, Vector{_A1}} where {_A, _A1}\n\n\nCategorise the struct elements of a vector by a given field into a dictionary of T.field => Vector{T}.\n\nExamples\n\njulia> using KM3io\n\njulia> struct PMT  # just an ad-hoc PMT struct for demonstration purposes\n         dom_id\n         time\n       end\n\njulia> pmts = [PMT(2, 10.4), PMT(4, 23.5), PMT(2, 42.0)];\n\njulia> categorize(:dom_id, pmts)\nDict{Any, Vector{PMT}} with 2 entries:\n  4 => [PMT(4, 23.5)]\n  2 => [PMT(2, 10.4), PMT(2, 42.0)]\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.nthbitset","page":"API","title":"KM3io.nthbitset","text":"nthbitset(n, a) -> Any\n\n\nReturn true if the n-th bit of a is set, false otherwise.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.most_frequent","page":"API","title":"KM3io.most_frequent","text":"most_frequent(iterable) -> Any\n\n\nReturn the most frequent value of a given iterable.\n\n\n\n\n\nmost_frequent(f::Function, iterable; rettype) -> Int64\n\n\nReturn the most frequent value of a given iterable based on the return value of a function f which returns (hashable) values of rettype.\n\n\n\n\n\n","category":"function"},{"location":"api/#DAQ","page":"API","title":"DAQ","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"pmtrate\npmtrates\nhrvstatus\nfifostatus\ntdcstatus\nwrstatus\nhasudptrailer\ncount_active_channels\ncount_fifostatus\ncount_hrvstatus\nstatus\nnumber_of_udp_packets_received\nmaximal_udp_sequence_number","category":"page"},{"location":"api/#KM3io.pmtrate","page":"API","title":"KM3io.pmtrate","text":"pmtrate(r::UInt8) -> Float64\n\n\nCalculate the PMT hit rate from the raw byte stored in a summary frame.\n\nThe rate of each PMT is encoded in a single byte to reduce the size of the summary frame, therefore only 256 values are possible which are mapped to an exponential function. The values are precalculated by the _getrate() function for the best performance.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.pmtrates","page":"API","title":"KM3io.pmtrates","text":"pmtrates(\n    s::SummaryFrame\n) -> StaticArraysCore.SVector{31, Float64}\n\n\nReturn the actual rates (in Hz) for each PMT in a summary frame.\n\n\n\n\n\npmtrates(\n    s::Summaryslice\n) -> Dict{Int32, StaticArraysCore.SVector{31, Float64}}\n\n\nReturn a dictionary of DOM IDs as keys and PMT rates [Hz] as values (Vector{Float64}).\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hrvstatus","page":"API","title":"KM3io.hrvstatus","text":"hrvstatus(f::SummaryFrame, tdc) -> Any\n\n\nReturn true if the TDC is in high rate veto.\n\n\n\n\n\nhrvstatus(f::SummaryFrame) -> Bool\n\n\nReturn true if any of the TDCs is in high rate veto.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.fifostatus","page":"API","title":"KM3io.fifostatus","text":"fifostatus(f::SummaryFrame, tdc) -> Any\n\n\nReturn true if the TDC has FIFO almost full.\n\n\n\n\n\nfifostatus(f::SummaryFrame) -> Bool\n\n\nReturn true if any of the TDCs is in high rate veto.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.tdcstatus","page":"API","title":"KM3io.tdcstatus","text":"tdcstatus(f::SummaryFrame) -> Bool\n\n\nReturn true if TDC status is OK.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.wrstatus","page":"API","title":"KM3io.wrstatus","text":"wrstatus(f::SummaryFrame) -> Bool\n\n\nReturn true if White Rabbit status is OK.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.hasudptrailer","page":"API","title":"KM3io.hasudptrailer","text":"hasudptrailer(f::SummaryFrame) -> Bool\n\n\nReturn true if the UDP trailer is present.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.count_active_channels","page":"API","title":"KM3io.count_active_channels","text":"count_active_channels(f::SummaryFrame) -> Int64\n\n\nNumber of TDCs without high rate veto or FIFO almost full.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.count_fifostatus","page":"API","title":"KM3io.count_fifostatus","text":"count_fifostatus(f::SummaryFrame) -> Int64\n\n\nNumber of TDCs with FIFO almost full.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.count_hrvstatus","page":"API","title":"KM3io.count_hrvstatus","text":"count_hrvstatus(f::SummaryFrame) -> Int64\n\n\nNumber of TDCs with high rate veto.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.status","page":"API","title":"KM3io.status","text":"status(f::SummaryFrame) -> Bool\n\n\nReturn true if TDC and White Rabbit status are OK.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.number_of_udp_packets_received","page":"API","title":"KM3io.number_of_udp_packets_received","text":"number_of_udp_packets_received(f::SummaryFrame) -> Int32\n\n\nNumber of received UDP packets (excluding the trailer).\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.maximal_udp_sequence_number","page":"API","title":"KM3io.maximal_udp_sequence_number","text":"maximal_udp_sequence_number(f::SummaryFrame) -> Int32\n\n\nMaximal sequence number of all received UDP packets.\n\n\n\n\n\n","category":"function"},{"location":"api/#Reconstruction","page":"API","title":"Reconstruction","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"besttrack\nbestjppmuon\nbestjppshower\nbestaashower\nRecStageRange\nhashistory","category":"page"},{"location":"api/#KM3io.besttrack","page":"API","title":"KM3io.besttrack","text":"besttrack(\n    e::Evt,\n    rec_type::Integer,\n    rsr::RecStageRange\n) -> Union{Missing, Trk}\n\n\nReturn the best reconstructed track for a given reconstruction type and reconstruction stage range. If no track could be found, missing is returned.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.bestjppmuon","page":"API","title":"KM3io.bestjppmuon","text":"bestjppmuon(e::Evt) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JMuon track of an event or missing if there are none.\n\n\n\n\n\nbestjppmuon(trks::Vector{Trk}) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JMuon track or missing if there are none.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.bestjppshower","page":"API","title":"KM3io.bestjppshower","text":"bestjppshower(e::Evt) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JShower \"track\" of an event or missing if there are none.\n\n\n\n\n\nbestjppshower(trks::Vector{Trk}) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed JShower \"track\" or missing if there are none.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.bestaashower","page":"API","title":"KM3io.bestaashower","text":"bestaashower(e::Evt) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed aashower \"track\" of an event or missing if there are none.\n\n\n\n\n\nbestaashower(trks::Vector{Trk}) -> Union{Missing, Trk}\n\n\nReturns the best reconstructed aashower \"track\" or missing if there are none.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.RecStageRange","page":"API","title":"KM3io.RecStageRange","text":"struct RecStageRange{T<:Integer}\n\nThis struct is used to represent a range of reconstruction stages. These are well-defined integers (see KM3NeT Dataformat) for each reconstruction algorithm and are stored in a vector named rec_stages of each Trk.\n\njulia> using KM3io\n\njulia> rsr = RecStageRange(KM3io.RECONSTRUCTION.JMUONBEGIN, KM3io.RECONSTRUCTION.JMUONEND)\nRecStageRange{Int64}(0, 99)\n\njulia> KM3io.RECONSTRUCTION.JMUONSIMPLEX ∈ rsr\ntrue\n\njulia> KM3io.RECONSTRUCTION.AASHOWERFITPREFIT ∈ rsr\nfalse\n\njulia> 23 ∈ rsr\ntrue\n\njulia> 523 ∈ rsr\nfalse\n\nFields\n\nlower::Integer\nupper::Integer\n\n\n\n\n\n","category":"type"},{"location":"api/#KM3io.hashistory","page":"API","title":"KM3io.hashistory","text":"hashistory(\n    t::Trk,\n    rec_type::Integer,\n    rsr::RecStageRange\n) -> Bool\n\n\nReturns true if a track with a given rec_type contains all the reconstruction stages in rsr::RecStageRange.\n\n\n\n\n\nhashistory(\n    t::Trk,\n    rec_type::Integer,\n    rec_stage::Integer\n) -> Bool\n\n\nReturns true if a track with a given rec_type contains the rec_stage.\n\n\n\n\n\n","category":"function"},{"location":"api/#Math","page":"API","title":"Math","text":"","category":"section"},{"location":"api/","page":"API","title":"API","text":"angle\ndistance","category":"page"},{"location":"api/#Base.angle","page":"API","title":"Base.angle","text":"angle(d1::Direction, d2::Direction) -> Any\n\n\nCalculate the angle between two vectors.\n\n\n\n\n\n","category":"function"},{"location":"api/#KM3io.distance","page":"API","title":"KM3io.distance","text":"distance(a::Position, b::Position) -> Any\n\n\nCalculates the disance between two points.\n\n\n\n\n\n","category":"function"},{"location":"examples/cherenkov_times/#Cherenkov-times","page":"Cherenkov times","title":"Cherenkov times","text":"","category":"section"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"using PGFPlotsX\nsavefigs = (figname, obj) -> begin\n    pgfsave(figname * \".pdf\", obj)\n    run(`pdftocairo -svg -l  1 $(figname * \".pdf\") $(figname * \".svg\")`)\n    pgfsave(figname * \".tex\", obj);\n    return nothing\nend","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"In this example, we will pick the best reconstructed muon (from the Jpp muon reconstruction chain JMuon) in each event and calculate the Cherenkov hit time residuals for each triggered hit.","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"We open the a sample file from the KM3NeTTestData package:","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"offline\", \"mcv6.0.gsg_muon_highE-CC_50-500GeV.km3sim.jterbr00008357.jorcarec.aanet.905.root\"))","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"Each event holds a vector of reconstructed tracks (Vector{Trk}) behind the .trks field. This vector contains different stages of reconstruction results from a variety of reconstruction algorithms (JMuon, JShower, aashower etc.). KM3io.jl exports helper functions to pick the best reconstructed track for a given reconstruction algorithm. The logic is based on the reference implementation in KM3NeT DataFormat tools. The function bestjppmuon() can be used to select the best reconstructed JMuon for a given event:","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"evt = f.offline[1]\nbest_muon = bestjppmuon(evt)","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"We now use this track as a seed to calculate the Cherenkov photon (see CherenkovPhoton) parameters using cherenkov() for each hit triggered hit in the event. To select only triggered hits, we use the triggered() function together withe filter() which returns a new vector of triggered hits:","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"cherenkov(best_muon, filter(triggered, evt.hits))","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"To obtain more statistics, we iterate through all the events and calculate the Cherenkov time residuals for each set of hits based on the best reconstruction track. We fill the time residuals in a 1D histogram using the FHist package.","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"note: Note\nThis example uses PGFPlotsX which is a wrapper for the LaTeX library PGFPlots. Feel free to adapt the example to use your favourite plotting library.","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"using KM3io, KM3NeTTestData\nusing FHist\nusing PGFPlotsX\n\nf = ROOTFile(datapath(\"offline\", \"mcv6.0.gsg_muon_highE-CC_50-500GeV.km3sim.jterbr00008357.jorcarec.aanet.905.root\"))\nΔts = Hist1D(; counttype=Int, binedges=-10:50)\n\nfor evt ∈ f.offline\n    m = bestjppmuon(evt)\n    cherenkov_photons = cherenkov(m, filter(triggered, evt.hits))\n    for cp ∈ cherenkov_photons\n        push!(Δts, cp.Δt)\n    end\nend\n\naxis = @pgf Axis(\n    {\n        ybar, const_plot, grid,\n        xlabel=raw\"\\Delta t / ns\",\n        ylabel=\"counts\",\n    },\n    PlotInc(Coordinates(bincenters(Δts), bincounts(Δts)), raw\"\\closedcycle\")\n)\naxis\nsavefigs(\"cherenkov\", ans) # hide","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"[.pdf], [generated .tex]","category":"page"},{"location":"examples/cherenkov_times/","page":"Cherenkov times","title":"Cherenkov times","text":"(Image: )","category":"page"},{"location":"manual/rootfiles/#ROOT-Files","page":"ROOT Files","title":"ROOT Files","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The two main types of ROOT files in KM3NeT are the online and offline files, however, both types can be mixed together as the data is stored in distinct ROOT trees. UnROOT has a single ROOTFile type to represent a KM3NeT ROOT file which can be used to access both the online and offline information. This section describes what kind of data is stored in each tree and how to access them.","category":"page"},{"location":"manual/rootfiles/#offline-dataformat","page":"ROOT Files","title":"Offline Dataformat","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The offline dataformat is used to store Monte Carlo (MC) simulations and reconstruction results. The OfflineTree type represents an actual offline file and it is essentially a vector of events (Vector{Evt}) with some fancy caching, lazy access and slicing magic. The offline tree is accessible via the .offline field of the ROOTFile type.","category":"page"},{"location":"manual/rootfiles/#MC-Header","page":"ROOT Files","title":"MC Header","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The MC header stores metadata related to the simulation chain. The individual entries can be accessed as properties, as shown below.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"offline\", \"numucc.root\"))\nROOTFile{OnlineTree (0 events, 0 summaryslices), OfflineTree (10 events)}\n\njulia> f.offline\nOfflineTree (10 events)\n\njulia> f.offline.header\nMCHeader\n  DAQ => (livetime = 394,)\n  PDF => (i1 = 4, i2 = 58)\n  XSecFile => Any[]\n  can => (zmin = 0, zmax = 1027, r = 888.4)\n  can_user => [0.0, 1027.0, 888.4]\n  coord_origin => (x = 0, y = 0, z = 0)\n  cut_in => (Emin = 0, Emax = 0, cosTmin = 0, cosTmax = 0)\n  cut_nu => (Emin = 100, Emax = 1.0e8, cosTmin = -1, cosTmax = 1)\n  cut_primary => (Emin = 0, Emax = 0, cosTmin = 0, cosTmax = 0)\n  cut_seamuon => (Emin = 0, Emax = 0, cosTmin = 0, cosTmax = 0)\n  decay => [\"doesnt\", \"happen\"]\n  detector => NOT\n  drawing => Volume\n  end_event => Any[]\n  genhencut => (gDir = 2000, Emin = 0)\n  genvol => (zmin = 0, zmax = 1027, r = 888.4, volume = 2.649e9, numberOfEvents = 100000)\n  kcut => 2\n  livetime => (numberOfSeconds = 0, errorOfSeconds = 0)\n  model => (interaction = 1, muon = 2, scattering = 0, numberOfEnergyBins = 1, field_4 = 12)\n  muon_desc_file => Any[]\n  ngen => 100000.0\n  norma => (primaryFlux = 0, numberOfPrimaries = 0)\n  nuflux => Real[0, 3, 0, 0.5, 0.0, 1.0, 3.0]\n  physics => (program = \"GENHEN\", version = \"7.2-220514\", date = 181116, time = 1138)\n  seed => (program = \"GENHEN\", level = 3, iseed = 305765867, field_3 = 0, field_4 = 0)\n  simul => (program = \"JSirene\", version = 11012, date = \"11/17/18\", time = 7)\n  sourcemode => diffuse\n  spectrum => (alpha = -1.4,)\n  start_run => 1\n  target => isoscalar\n  usedetfile => false\n  xlat_user => 0.63297\n  xparam => OFF\n  zed_user => [0.0, 3450.0]\n\n\njulia> f.offline.header.genvol\n(zmin = 0, zmax = 1027, r = 888.4, volume = 2.649e9, numberOfEvents = 100000)\n\njulia> f.offline.header.genvol.volume\n2.649e9","category":"page"},{"location":"manual/rootfiles/#Event-data","page":"ROOT Files","title":"Event data","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The following REPL session shows how to open a file, access individual events or slices of events, loop through events and access e.g. the tracks which are stored in the events.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"offline\", \"km3net_offline.root\"))\nROOTFile{OfflineTree (10 events)}\n\njulia> f.offline[5]\nKM3io.Evt (83 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n\njulia> f.offline[3:5]\n3-element Vector{KM3io.Evt}:\n KM3io.Evt (318 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n KM3io.Evt (157 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n KM3io.Evt (83 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n\njulia> event = f.offline[1]\nKM3io.Evt (176 hits, 0 MC hits, 56 tracks, 0 MC tracks)\n\njulia> event.trks[1:4]\n4-element Vector{KM3io.Trk}:\n KM3io.Trk(1, [445.835395997812, ... , 294.6407542676734, 4000)\n KM3io.Trk(2, [445.835395997812, ... , 294.6407542676734, 4000)\n KM3io.Trk(3, [448.136188112227, ... , 294.6407542676734, 4000)\n KM3io.Trk(4, [448.258348900570, ... , 291.64653112688273, 4000)\n\njulia> for event in f.offline\n           @show event\n       end\nevent = KM3io.Evt (176 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (125 hits, 0 MC hits, 55 tracks, 0 MC tracks)\nevent = KM3io.Evt (318 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (157 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (83 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (60 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (71 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (84 hits, 0 MC hits, 56 tracks, 0 MC tracks)\nevent = KM3io.Evt (255 hits, 0 MC hits, 54 tracks, 0 MC tracks)\nevent = KM3io.Evt (105 hits, 0 MC hits, 56 tracks, 0 MC tracks)","category":"page"},{"location":"manual/rootfiles/#online_dataformat","page":"ROOT Files","title":"Online Dataformat","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The online dataformat refers to the dataformat which is written by the data acquisition system (DAQ) of the KM3NeT detectors, more precisely, the ROOT files produced by the JDataFilter which is part of the Jpp framework. The very same format is used in run-by-run (RBR) Monte Carlo (MC) productions, which mimic the detector response and therefore produce similarly structured data. The online data can be accessed via the .online field of the ROOTFile type.","category":"page"},{"location":"manual/rootfiles/#Event-data-2","page":"ROOT Files","title":"Event data","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The events are accessible via ROOTFile(filename).online.events which supports indexing, slicing and iteration, just like the we have seen above, in case of the offline events. Notice however that the online format also contains other types of trees, that's why the explicit .events field is needed. Everything is lazily loaded so that the data is only occupying memory when it's actually accessed, similar to the offline access. In the examples below, we use KM3NeTTestdata to get access to small sample files.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"online\", \"km3net_online.root\"))\nROOTFile{OnlineTree (3 events, 3 summaryslices), OfflineTree (0 events)}\n\njulia> event = f.online.events[1]\nKM3io.DAQEvent with 96 snapshot and 18 triggered hits\n\njulia> event.triggered_hits[4:8]\n5-element Vector{KM3io.TriggeredHit}:\n KM3io.TriggeredHit(808447186, 0x00, 30733214, 0x19, 0x0000000000000016)\n KM3io.TriggeredHit(808447186, 0x01, 30733214, 0x15, 0x0000000000000016)\n KM3io.TriggeredHit(808447186, 0x02, 30733215, 0x15, 0x0000000000000016)\n KM3io.TriggeredHit(808447186, 0x03, 30733214, 0x1c, 0x0000000000000016)\n KM3io.TriggeredHit(808451907, 0x07, 30733441, 0x1e, 0x0000000000000004)\n\njulia> for event ∈ f.online.events\n           @show event.header.frame_index length(event.snapshot_hits)\n       end\nevent.header.frame_index = 127\nlength(event.snapshot_hits) = 96\nevent.header.frame_index = 127\nlength(event.snapshot_hits) = 124\nevent.header.frame_index = 129\nlength(event.snapshot_hits) = 78","category":"page"},{"location":"manual/rootfiles/#Summaryslices-and-Summary-Frames","page":"ROOT Files","title":"Summaryslices and Summary Frames","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Summaryslices are generated from timeslices (raw hit data) and are produced by the DataFilter. A slice contains the data of 100ms and is divided into so-called frames, each corresponding to the data of a single optical module. Due to the high amount of data, the storage of timeslices is usually reduced by a factor of 10-100 after the event triggering stage. However, summaryslices are covering the full data taking period. They however do not contain hit data but only the rates of the PMTs encoded into a single byte, which therefore is only capable to store 256 different values. The actual rate is calcuated by the helper functions pmtrate() and pmtrates() which take a SummaryFrame and optionally a PMT channel ID as arguments.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The summaryslices are accessible using the .summaryslices attribute of the OnlineTree instance, which again is hidden behind the .online field of a ROOTFile:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"online\", \"km3net_online.root\"))\nROOTFile{OnlineTree (3 events, 3 summaryslices), OfflineTree (0 events)}\n\njulia> f.online.summaryslices\nKM3io.SummarysliceContainer with 3 summaryslices\n\njulia> for s ∈ f.online.summaryslices\n           @show s.header\n       end\ns.header = KM3io.SummarysliceHeader(44, 6633, 126, KM3io.UTCExtended(0x5dc6018c, 0x23c34600, false))\ns.header = KM3io.SummarysliceHeader(44, 6633, 127, KM3io.UTCExtended(0x5dc6018c, 0x29b92700, false))\ns.header = KM3io.SummarysliceHeader(44, 6633, 128, KM3io.UTCExtended(0x5dc6018c, 0x2faf0800, false))","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Each summaryslice consists of multiple frames, one for every optical module which has sent data during the recording time of the corresponding timeslice.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"note: Note\nDuring run transistions, the number of summaryframes in a summaryslice is fluctuating a lot until it eventually saturates, usually within a few seconds or minutes. Therefore, it is expected that the number of summaryframes (i.e. active DOMs) is low at the beginning of the file and stabilises after a few summaryslices.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"To access the actual PMT rates and flags (e.g. for high-rate veto or FIFO status) of a summaryframe, several helper functions exist. Let's grab a summaryslice:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"online\", \"km3net_online.root\"))\n\ns = f.online.summaryslices[1]","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"and have a look at one of the frames, the 23rd of the first summaryslice:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"frame = s.frames[23]","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The White Rabbit status:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"wrstatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Checking if any of the PMTs is in high rate veto:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"hrvstatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The number of PMTs in high rate veto:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"count_hrvstatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Checking if any of the TDC FIFOs were almost full:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"fifostatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Counting the number of TDCs which had FIFO almost full:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"count_fifostatus(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The rates of each individual PMT channel ordered by increasing channel ID:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"pmtrates(frame)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Individual PMT parameters can be accessed as well, by passing the summaryframe and the PMT ID (DAQ channel ID):","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"pmtrate(frame, 3)","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Here is an example of a simple summary output:","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"for pmt in 0:30\n    println(\"PMT $(pmt): HRV($(hrvstatus(frame, pmt))) FIFO($(fifostatus(frame, pmt)))\")\nend","category":"page"},{"location":"manual/rootfiles/#xrootd-access","page":"ROOT Files","title":"xrootd access","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"You can access files directly via xrootd by providing the URL on e.g. HPSS. Be aware that URL has to be typed correctly, / instead of // results in an error!), so it should always start with something like root://ccxroot:1999//hpss/....","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io\n\njulia> f = ROOTFile(\"root://ccxroot:1999//hpss/in2p3.fr/group/km3net/data/raw/sea/KM3NeT_00000132/14/KM3NeT_00000132_00014481.root\")\nROOTFile{OnlineTree (136335 events, 107632 summaryslices)}","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"Now you can use it as if it was on your local filesystem. UnROOT.jl will take care of loading only the needed data from the server.","category":"page"},{"location":"manual/rootfiles/#oscillations-dataformat","page":"ROOT Files","title":"Oscillations Open Dataformat","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The oscillations dataformat is used to store the responses from a particular oscillations analysis data release. The OSCFile type represents an actual ROOT file and it is essentially a vector of Response like entries (Vector{ResponseMatrixBin}) . Depending on what is stored in the initial ROOT file, neutrinos, data and muons response trees are accessible via the .osc_opendata_nu, .osc_opendata_data and .osc_opendata_muons  fields of the ROOTFile type respectively.","category":"page"},{"location":"manual/rootfiles/#ResponseMatrixBin","page":"ROOT Files","title":"ResponseMatrixBin","text":"","category":"section"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"The ResponseMatrixBin stores individual directions of a bin in order to fill a histogram.","category":"page"},{"location":"manual/rootfiles/","page":"ROOT Files","title":"ROOT Files","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = OSCFile(datapath(\"oscillations\", \"ORCA6_433kt-y_opendata_v0.4_testdata.root\"))\nOSCFile{OscOpenDataTree of Neutrinos (59301 events), OscOpenDataTree of Data (106 events), OscOpenDataTree of Muons (99 events)}\n\njulia> f.osc_opendata_nu\nOscOpenDataTree (59301 events)\n\njulia> f.osc_opendata_nu[1]\nKM3io.ResponseMatrixBinNeutrinos(10, 1, 30, 18, -12, 1, 1, 52.25311519561337, 2730.388047646041)\n\njulia> dump(f.osc_opendata_nu[1])\nKM3io.ResponseMatrixBinNeutrinos\n  E_reco_bin: Int64 10\n  Ct_reco_bin: Int64 1\n  E_true_bin: Int64 30\n  Ct_true_bin: Int64 18\n  Flav: Int16 -12\n  IsCC: Int16 1\n  AnaClass: Int16 1\n  W: Float64 52.25311519561337\n  Werr: Float64 2730.388047646041\n\njulia> f.osc_opendata_data[1]\nKM3io.ResponseMatrixBinData(2, 6, 1, 2.0)\n","category":"page"},{"location":"examples/hdf5/#HDF5","page":"HDF5","title":"HDF5","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Plain ASCII (CSV) files are often perfectly fine for small, tabular datasets but when dealing with larger amounts of data, HDF5 comes in handy with compression, metadata and hierachical datasets. KM3NeT uses HDF5 in many analysis chains, often to store intermediate or end results.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"This example shows how to create an HDF5 file and write some vectors of structs into different datasets.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"using KM3io\nusing Random\n\nRandom.seed!(23)  # to make things reproducible ;)\n\nf = H5File(\"foo.h5\", \"w\")","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"We now have an H5File instance which we can use to store datasets.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Let's say we have our custom data type (struct) like","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"struct Particle\n    x::Float32\n    y::Float32\n    E::Int64\nend","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"and we generate instances of Particle in a loop which we want to dump directly into an HDF5 file to the dataset stored at simulation/particles, meaning that simulation is the group name and particles the dataset name.","category":"page"},{"location":"examples/hdf5/#Creating-datasets","page":"HDF5","title":"Creating datasets","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"First, we create our dataset with our type Particle. This is a so called H5CompoundDataset and resembles a dataset wich has a compound type (struct) associated with it:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"dset = create_dataset(f, \"simulation/particles\", Particle)","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"We fill some random particles using the dummy loop:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"for i in 1:1000\n    # creates some random particle\n    particle = Particle(rand(), rand(), rand(1:1000))\n    # we push to the dataset, just like if it was an Array\n    push!(dset, particle)\nend","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"note: Note\nTo avoid excessive I/O, KM3io uses a cache for each H5CompoundDataset. If you don't close the H5File properly, you might lose data which is still sitting in the cache. Therefore, always use close(f) to make sure that all the caches are dumped to the HDF5 file. The methods flush(d::H5CompoundDataset) and flush(f::H5File) can be used to manually to prematurely flush the cache of a dataset or all caches of an HDF5 file respectively.","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Let's close the file","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"close(f)","category":"page"},{"location":"examples/hdf5/#Reading-datasets","page":"HDF5","title":"Reading datasets","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"We open the file from the previous example with HDF5.jl, just to demonstrate that we can read it without any KM3NeT related libraries:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"using HDF5\n\nf = h5open(\"foo.h5\")\nparticles = f[\"simulation/particles\"]\n\n@show particles[1:5]","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Notice that HDF5.jl automatically created NamedTuple instances with the same fieldnames as our own struct definition of Particle. This means that the elements behave just like the original one regarding the field access:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"particles[2].E","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"The whole vector can also be reinterpreted to the original struct definition with zero-cost. This can be mandatory if the data is then passed to other methods which require a specific type (in this case Particle). The following line will only work if Particle is already defined (i.e. the correspoinding module has been loaded). It is also mandatory to pass a slice (here, we pass the full slice by using [:]) to reinterpret and not the dataset itself:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"reinterpreted_particles = reinterpret(Particle, particles[:])","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Each element is now a proper Particle instance:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"reinterpreted_particles[4]","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"KM3io also writes the name of the struct into the attributes of the dataset:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"attrs(particles)[\"struct_name\"]","category":"page"},{"location":"examples/hdf5/#Adding-metadata","page":"HDF5","title":"Adding metadata","text":"","category":"section"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"Sometimes it's useful to keep track of additional metadata, e.g. a given set of parameters for a specific dataset. The addmeta() function can be used to attach key-value-pairs from a struct to a variety of HDF5 structures, like files, datasets or groups. The following example demonstrates it:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"using KM3io\nusing HDF5\n\nstruct SimulationParameters\n    can_height::Int32\n    can_radius::Int32\n    minimum_energy::Float64\n    maximum_energy::Float64\nend\n\nsimparams = SimulationParameters(800, 200, 1e3, 1e7)\n\nf = h5open(\"simulation.h5\", \"w\")\naddmeta(f, simparams)\n\nattributes(f)","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"To access individual attributes, use HDF5.read_attribute:","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"read_attribute(f, \"can_radius\")","category":"page"},{"location":"examples/hdf5/","page":"HDF5","title":"HDF5","text":"note: Note\nIt is possible to add metadata to datasets and groups too. Make sure that the struct you pass to addmeta() only contains primitive types or strings in their fields. Arrays and other nested or compound fieldtypes are not supported by HDF5.","category":"page"},{"location":"examples/offline_data/#Offline-data","page":"Offline data","title":"Offline data","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Let's use the KM3NeTTestData Julia package which contains all kinds of KM3NeT related sample files. The datapath() function can be used to get a path to such a file. In the following, we will discover the numucc.root file which contains 10 muon neutrino charged current interaction events.","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"offline\", \"numucc.root\"))","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"The ROOTFile is the container object which gives access to both the online and offline tree. In this case, the online tree is empty","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"f.online","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"and the offline tree holds our 10 MC events:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"f.offline","category":"page"},{"location":"examples/offline_data/#Events","page":"Offline data","title":"Events","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"To access a single event, you can use the usual indexing syntax:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"some_event = f.offline[5]","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"or ranges of events:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"events = f.offline[6:9]","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Another way to access events is given by getter function getevent() (which also works for online trees). If a single number if passed, it will be treated as a regular index, just like above:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"event = getevent(f.offline, 3)","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"when two numbers are passed, the first one is interpreted as frame_index and the second one as trigger_counter:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"event = getevent(f.offline, 87, 2)","category":"page"},{"location":"examples/offline_data/#Hits","page":"Offline data","title":"Hits","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Each event consists of a vector of hits, MC hits, tracks and MC tracks. Depending on the file, they may be empty. They are accessible via the fields .hit, .mc_hits, .trks and .mc_trks.","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Let's grab an event:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"evt = f.offline[3]","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"and have a look at its contents:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"evt.hits","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Let's close this file properly:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"close(f)","category":"page"},{"location":"examples/offline_data/#Usr-data","page":"Offline data","title":"Usr data","text":"","category":"section"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"You can also access \"usr\"-data, which is a dynamic placeholder (Dict{String, Float64}) to store arbitrary data. Some software store values here which are only losely defined. Ideally, if these fields are used regulary by a software, a proper definition in the KM3NeT dataformat should be created and added to the according Struct as a field.","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"Here is an example how to access the \"usr\"-data of a single event:","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"f = ROOTFile(datapath(\"offline\", \"usr-sample.root\"))\n\nf.offline[1].usr","category":"page"},{"location":"examples/offline_data/","page":"Offline data","title":"Offline data","text":"close(f)","category":"page"},{"location":"examples/orientations/#Orientations","page":"Orientations","title":"Orientations","text":"","category":"section"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"The following example shows how to read orientations from a calibration output (ROOT file) and plot the yaw, pitch and roll values for an optical module.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"The data used in this example is provided by KM3NeTTestData.jl.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"using KM3io\nusing KM3NeTTestData\nusing CairoMakie\nusing Dates","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"We use Makie for plotting:","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"fig = Figure(size=(900, 400), fontsize=16)\nax_yaw =  Axis(fig[1, 1])\nax_pitch_and_roll =  Axis(fig[1, 2])","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"We load the orientations data and extract the quaternions including the corresponding times from it:","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"o = read(datapath(\"calib\", \"KM3NeT_00000049_0.0.0_00007631_00007676_1.orientations.root\"), Orientations)\nqdata = o(808972593)","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"The times are converted to DateTime objects, which Makie will understand and display them in a human readable way.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"times = unix2datetime.(qdata.t)","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"We convert the Quaternions to Compasses to be able to access the yaw, pitch and roll values.","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"compasses = Compass.(qdata.q)\nyaws = [c.yaw for c in compasses]\npitches = [c.pitch for c in compasses]\nrolls = [c.roll for c in compasses]","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"...and we populate the plots:","category":"page"},{"location":"examples/orientations/","page":"Orientations","title":"Orientations","text":"scatter!(ax_yaw, times, yaws, label=\"yaw\")\naxislegend(ax_yaw, position = :rb)\n\nscatter!(ax_pitch_and_roll, times, pitches, label=\"pitch\")\nscatter!(ax_pitch_and_roll, times, rolls, label=\"roll\")\naxislegend(ax_pitch_and_roll, position = :rt)\n\nfig","category":"page"},{"location":"manual/hdf5/#HDF5-Files","page":"HDF5 Files","title":"HDF5 Files","text":"","category":"section"},{"location":"manual/hdf5/","page":"HDF5 Files","title":"HDF5 Files","text":"...","category":"page"},{"location":"#KM3io.jl","page":"Home","title":"KM3io.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"KM3io.jl is a Julia library which implements high-performance I/O functions and additional utilities to deal with dataformats used in KM3NeT, e.g. ROOT (online/offline files), DETX (detector geometry and calibrations) and acoustics (waveforms and hardware). In contrast to Python, you are free to utilise as many (nested) for-loops as you like while still being as fast as in e.g. in C++.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Apropos ROOT and C++, the KM3NeT Dataformat is defined in C++ and uses the I/O functionality of the ROOT framework to create the online and offline ROOT files. Luckily, there is a pure Julia library named UnROOT.jl that provides access the the ROOT files without the need to install ROOT or the corresponding C++ library. This allows KM3io.jl to be completely free from these external dependencies.","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Note\nThe library is still under development so that the API might slightly change. Feedback and contributions are highly welcome!","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"KM3io.jl is not an officially registered Julia package but it's available via the KM3NeT Julia registry. To add the KM3NeT Julia registry to your local Julia registry list, follow the instructions in its README or simply do","category":"page"},{"location":"","page":"Home","title":"Home","text":"git clone https://git.km3net.de/common/julia-registry ~/.julia/registries/KM3NeT","category":"page"},{"location":"","page":"Home","title":"Home","text":"After that, you can instal KM3io.jl just like any other Julia package:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> import Pkg; Pkg.add(\"KM3io\")","category":"page"},{"location":"#Quickstart","page":"Home","title":"Quickstart","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"julia> using KM3io, KM3NeTTestData\n\njulia> f = ROOTFile(datapath(\"offline\", \"numucc.root\"))\nROOTFile{OnlineTree (0 events, 0 summaryslices), OfflineTree (10 events)}\n\njulia> f.offline\nOfflineTree (10 events)\n\njulia> some_event = f.offline[3]\nKM3io.Evt (3680 hits, 28 MC hits, 38 tracks, 12 MC tracks)","category":"page"},{"location":"#Acknowledgements","page":"Home","title":"Acknowledgements","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Thanks to Johannes Schumann for providing the awesome project logo!","category":"page"},{"location":"examples/online_data/#Online-data","page":"Online data","title":"Online data","text":"","category":"section"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"Let's use the KM3NeTTestData Julia package which contains all kinds of KM3NeT related sample files. The datapath() function can be used to get a path to such a file. In the following, we will discover the numucc.root file which contains 10 muon neutrino charged current interaction events.","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"online\", \"km3net_online.root\"))","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"The ROOTFile is the container object which gives access to both the online and offline tree. In this case, the online tree is empty","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"f.offline","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"and the online tree holds 3 events and 3 summaryslices:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"f.online","category":"page"},{"location":"examples/online_data/#Events","page":"Online data","title":"Events","text":"","category":"section"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"To access a single event, you can use the usual indexing syntax:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"some_event = f.online.events[2]","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"note: Note\nWhile both the offline and online tree contain events which are essentially an array of events (Vector{Evt} respectively Vector{DAQEvent}), the online tree also contains summaryslices and timeslices (timeslices are not implemented yet). For simplicity, indexing into an OfflineTree is directly indexing into events by default, while in case of the OfflineTree the field .events is necessary.","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"or ranges of events:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"events = f.online.events[2:3]","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"Another way to access events is given by getter function getevent() (which also works for online trees). If a single number if passed, it will be treated as a regular index, just like above:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"event = getevent(f.online, 2)","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"when two numbers are passed, the first one is interpreted as frame_index and the second one as trigger_counter:","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"event = getevent(f.online, 127, 1)","category":"page"},{"location":"examples/online_data/","page":"Online data","title":"Online data","text":"note: Note\nEvents in a ROOT tree are not strictly ordered by time or frame_index and trigger_counter, therefore accessing an event via these two parameters needs a traverse through the tree. The indices are cached for future access but you may experience some delays especially dependening on the location of the event in the tree. In future, a fuzzy binary search might be implemented to speed up this process signifficantly.","category":"page"},{"location":"manual/tools/#Tools","page":"Tools","title":"Tools","text":"","category":"section"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"There are many commonly used routines to find for example the best reconstructed muon track or find out if a given hit was flagged by a specific trigger algorithm. This section will show some helper functions available in KM3io.jl.","category":"page"},{"location":"manual/tools/#Best-track/shower","page":"Tools","title":"Best track/shower","text":"","category":"section"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"In KM3NeT, the best reconstructed track or shower of a given set of tracks respectively showers is the one with the highest value of the likelihood parameter (lik) and the longest reconstruction history (rec_stages) which is a record of reconstruction stages performed during the whole fitting procedure.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The offline dataformat, which is used to store reconstruction information, has only a single Vector{Trk} per event which is a flat list of reconstructed tracks and showers. This vector can be a mix of different reconstruction algorithms (JGandalf, aashower, FibonacciFit, ...) and different stages of each, like prefit candidates, intermediate fits and final results. Therefore it is necessary to take the reconstruction type (rec_type) and also the values of the reconstruction stages (rec_stages) into account. Each reconstruction algorithm and each of their reconstruction stages have their own unique identifiers, which are stored in these two fields.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"note: Note\nBoth tracks and showers are stored as Trk. This comes from the fact that the original KM3NeT dataformat defintion for offline files uses the same C++ class (named Trk).","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The helper functions in KM3io.jl to pick the best track/shower always start with the prefix best, followed by the common name of the reconstruction routine, like jppmuon, or aashower. For example bestjppmuon(), bestjppshower() or besttrack(), latter being a more general function which gives the possibility to fine tune the selection criteria.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The API documentation of all related functions can be found in the Reconstruction section.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"The input can be an event (Evt) or a vector of reconstructed tracks (Vector{Trk}). If no track/shower could be found, missing is returned instead.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Below are some examples of how to use these functions.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"using KM3io, KM3NeTTestData\n\nf = ROOTFile(datapath(\"offline\", \"km3net_offline.root\"))","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"event = f.offline[1]","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppmuon(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppshower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestaashower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppshower(event.trks)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestaashower(event.trks)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Additonally, there are helper functions which can be used to check if a specific reconstruction stage or result is present in an event or a given set of tracks/showers.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"track = event.trks |> first","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuonprefit(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuonsimplex(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuongandalf(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasjppmuonfit(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasaashowerfit(track)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasreconstructedjppmuon(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasreconstructedjppshower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"hasreconstructedaashower(event)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"note: Note\nTo check multiple events in one go, use the Broadcasting feature of the Julia language by putting a dot (.) at the end of the function name, e.g. bestjppmuon.(f.offline) which will find the best Jpp muon reconstruction result for each event in the offline tree.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"bestjppmuon.(f.offline[2:5])","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Let's close our file ;)","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"close(f)","category":"page"},{"location":"manual/tools/#Trigger-masks/flags","page":"Tools","title":"Trigger masks/flags","text":"","category":"section"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"KM3NeT uses a 64bit integer type to store information about which triggers have fired for a given event or hit. The index of the bit which indicates if a specific trigger has fired is defined in the KM3NeT Dataformat specification which is used in KM3io.jl.","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"Functions to check if a trigger has fired are for example","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"is3dmuon()\nis3dshower()\nismxshower()\nisnb()","category":"page"},{"location":"manual/tools/","page":"Tools","title":"Tools","text":"which all accept either an event is input or something which has a .trigger_mask field, like a triggered hit.","category":"page"}]
 }
-- 
GitLab