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} <: 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<:AbstractFloat} <: StaticArraysCore.FieldVector{3, T<: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'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 <: 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 <: 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 <: 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'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 "track", 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 "MC") 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 <: 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 <: 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 <: 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 <: 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} <: 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<:AbstractFloat} <: StaticArraysCore.FieldVector{3, T<: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'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 <: 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 <: 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 <: 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'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 "track", 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 "MC") 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 <: 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 <: 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 <: 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 <: 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 <: 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 <: 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 <: 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} <: 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... ) -> 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) -> 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 "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 <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 "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 <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 "PMT files", 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> f = read("path/to/pmt.txt", 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) -> 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) -> 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) -> 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 "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 <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 "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 <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 "PMT files", 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> f = read("path/to/pmt.txt", 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) -> 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) -> 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 ) -> 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<:Integer, T<:Integer} ) -> 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) -> 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) -> 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) -> 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) -> 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 ) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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'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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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'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} ) -> 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} ) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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} ) -> 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} ) -> 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} ) -> AcousticsTriggerParameter -</code></pre><pre><code class="nohighlight hljs">function read(filename::AbstractString, T::Type{AcousticsTriggerParameter})</code></pre><p>Reads the 'acoustics<em>trigger</em>parameters.txt' 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) -> 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 'acoustics<em>trigger</em>parameters.txt' 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) -> 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<:SnapshotHit, 1} ) -> 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<:TriggeredHit, 1} ) -> 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} ) -> 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} <: 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} <: 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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} <: 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} <: 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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<:AbstractCalibratedHit, 1} ) -> 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) -> Vector{T} where T<: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) -> 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) -> 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) -> 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) -> 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> 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) -> Vector{T} where T<: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) -> 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) -> 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) -> 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) -> 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> using KM3io julia> c = CHClient{DAQEvent}(ip"127.0.0.1", 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> f = ROOTFile("KM3NeT_00000133_00014728.root") +...</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> f = ROOTFile("KM3NeT_00000133_00014728.root") ROOTFile{OnlineTree (83509 events, 106969 summaryslices)} julia> 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 ) -> 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 ) -> Dict{_A, Vector{_A1}} where {_A, _A1} @@ -156,41 +156,41 @@ julia> pmts = [PMT(2, 10.4), PMT(4, 23.5), PMT(2, 42.0)]; julia> categorize(:dom_id, pmts) Dict{Any, Vector{PMT}} with 2 entries: 4 => [PMT(4, 23.5)] - 2 => [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) -> 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) -> 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) -> 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) -> 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 => [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) -> 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) -> 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) -> 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) -> 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 ) -> 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 ) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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) -> 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 ) -> 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) -> 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}) -> 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) -> Union{Missing, Trk} -</code></pre><p>Returns the best reconstructed JShower "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#LL97">source</a></section><section><div><pre><code class="language-julia hljs">bestjppshower(trks::Vector{Trk}) -> Union{Missing, Trk} -</code></pre><p>Returns the best reconstructed JShower "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#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) -> Union{Missing, Trk} -</code></pre><p>Returns the best reconstructed aashower "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#LL105">source</a></section><section><div><pre><code class="language-julia hljs">bestaashower(trks::Vector{Trk}) -> Union{Missing, Trk} -</code></pre><p>Returns the best reconstructed aashower "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#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<: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> 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) -> 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}) -> 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) -> Union{Missing, Trk} +</code></pre><p>Returns the best reconstructed JShower "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#LL97">source</a></section><section><div><pre><code class="language-julia hljs">bestjppshower(trks::Vector{Trk}) -> Union{Missing, Trk} +</code></pre><p>Returns the best reconstructed JShower "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#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) -> Union{Missing, Trk} +</code></pre><p>Returns the best reconstructed aashower "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#LL105">source</a></section><section><div><pre><code class="language-julia hljs">bestaashower(trks::Vector{Trk}) -> Union{Missing, Trk} +</code></pre><p>Returns the best reconstructed aashower "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#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<: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> using KM3io julia> rsr = RecStageRange(KM3io.RECONSTRUCTION.JMUONBEGIN, KM3io.RECONSTRUCTION.JMUONEND) RecStageRange{Int64}(0, 99) @@ -205,16 +205,16 @@ julia> 23 ∈ rsr true julia> 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 ) -> 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 ) -> 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) -> 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) -> 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) -> 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) -> 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"\closedcycle") ) -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("foo.h5", "w")</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's say we have our custom data type (<code>struct</code>) like</p><pre><code class="language-julia hljs">struct Particle +f = H5File("foo.h5", "w")</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'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, "simulation/particles", 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, "simulation/particles", 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, "can_radius")</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, "can_radius")</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= "RecoNDF" => 37.0 "FirstPartPosZ" => 135.295 "CoC" => 118.63 - "ChargeAbove" => 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> + "ChargeAbove" => 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("online", "km3net_online.root"))</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="pitch") scatter!(ax_pitch_and_roll, times, rolls, label="roll") 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> f.offline OfflineTree (10 events) julia> 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("pmt", "calibration_00000117_H_1.0.0_00013757_00013826_1.txt"), 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> 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> using KM3io, KM3NeTTestData julia> f = ROOTFile(datapath("offline", "numucc.root")) 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> using KM3io julia> f = ROOTFile("root://ccxroot:1999//hpss/in2p3.fr/group/km3net/data/raw/sea/KM3NeT_00000132/14/KM3NeT_00000132_00014481.root") -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> using KM3io, KM3NeTTestData + +julia> f = OSCFile(datapath("oscillations", "ORCA6_433kt-y_opendata_v0.4_testdata.root")) +OSCFile{OscOpenDataTree of Neutrinos (59301 events), OscOpenDataTree of Data (106 events), OscOpenDataTree of Muons (99 events)} + +julia> f.osc_opendata_nu +OscOpenDataTree (59301 events) + +julia> f.osc_opendata_nu[1] +KM3io.ResponseMatrixBinNeutrinos(10, 1, 30, 18, -12, 1, 1, 52.25311519561337, 2730.388047646041) + +julia> 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> 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("offline", "km3net_offline.root"))</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'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'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