From 1f7346b36d4f2c61e9cb52eb75ccbcd35138a1a4 Mon Sep 17 00:00:00 2001 From: Noah Biederbeck Date: Thu, 19 Jan 2023 13:16:26 +0100 Subject: [PATCH 001/264] run test only if labels don't contain 'documentation' --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bdf51cf3ac..a86806dd9df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ env: jobs: tests: + if: ${{ ! contains(github.event.pull_request.labels.*.name, 'documentation') }} runs-on: ${{ matrix.os }} strategy: matrix: From 108c8a97d7d14d1a1898358f4ffe45c92f568116 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 2 Jun 2023 10:42:34 +0200 Subject: [PATCH 002/264] Drop support for python 3.8, update env file --- .github/workflows/ci.yml | 16 ++++++---------- .readthedocs.yml | 2 +- ctapipe/core/provenance.py | 12 +++--------- ctapipe/tools/info.py | 6 +----- docs/changes/2342.maintenance.rst | 1 + docs/conf.py | 2 +- environment.yml | 6 +++--- setup.cfg | 4 ++-- 8 files changed, 18 insertions(+), 31 deletions(-) create mode 100644 docs/changes/2342.maintenance.rst diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 21f36406c45..f4a04165d9d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.9" - uses: pre-commit/action@v3.0.0 with: extra_args: --files $(git diff origin/main --name-only) @@ -33,10 +33,6 @@ jobs: strategy: matrix: include: - - os: ubuntu-latest - python-version: "3.8" - install-method: mamba - - os: ubuntu-latest python-version: "3.9" install-method: mamba @@ -48,18 +44,18 @@ jobs: - os: ubuntu-latest python-version: "3.11" - install-method: pip + install-method: mamba - os: ubuntu-latest - python-version: "3.10" + python-version: "3.11" install-method: pip - os: macos-latest - python-version: "3.10" + python-version: "3.11" install-method: mamba - os: macos-latest - python-version: "3.8" + python-version: "3.9" install-method: pip defaults: @@ -147,7 +143,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.8" + python-version: "3.9" - name: Install doc dependencies run: | diff --git a/.readthedocs.yml b/.readthedocs.yml index 0de487589c2..4d14f8280e3 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,7 +5,7 @@ build: apt_packages: - ffmpeg tools: - python: "3.8" + python: "3.9" python: install: diff --git a/ctapipe/core/provenance.py b/ctapipe/core/provenance.py index 312f43884ee..93b41f1879b 100644 --- a/ctapipe/core/provenance.py +++ b/ctapipe/core/provenance.py @@ -4,7 +4,6 @@ TODO: have this register whenever ctapipe is loaded """ - import json import logging import os @@ -14,21 +13,16 @@ from collections import UserList from contextlib import contextmanager from importlib import import_module +from importlib.metadata import distributions, version from os.path import abspath from pathlib import Path import psutil from astropy.time import Time -import ctapipe - +from ..version import __version__ from .support import Singleton -if sys.version_info < (3, 9): - from importlib_metadata import distributions, version -else: - from importlib.metadata import distributions, version - log = logging.getLogger(__name__) __all__ = ["Provenance"] @@ -318,7 +312,7 @@ def _get_system_provenance(): bits, linkage = platform.architecture() return dict( - ctapipe_version=ctapipe.__version__, + ctapipe_version=__version__, ctapipe_resources_version=get_module_version("ctapipe_resources"), eventio_version=get_module_version("eventio"), ctapipe_svc_path=os.getenv("CTAPIPE_SVC_PATH"), diff --git a/ctapipe/tools/info.py b/ctapipe/tools/info.py index 66b28ba97c8..8ded56de360 100644 --- a/ctapipe/tools/info.py +++ b/ctapipe/tools/info.py @@ -3,17 +3,13 @@ import logging import os import sys +from importlib.resources import files from ..core import Provenance, get_module_version from ..core.plugins import detect_and_import_plugins from ..utils import datasets from .utils import get_parser -if sys.version_info < (3, 9): - from importlib_resources import files -else: - from importlib.resources import files - __all__ = ["info"] # TODO: this list should be global (or generated at install time) diff --git a/docs/changes/2342.maintenance.rst b/docs/changes/2342.maintenance.rst new file mode 100644 index 00000000000..df37bb4ebba --- /dev/null +++ b/docs/changes/2342.maintenance.rst @@ -0,0 +1 @@ +Drop support for python 3.8 in accordance with the NEP 29 schedule. diff --git a/docs/conf.py b/docs/conf.py index f2cb9a72486..23cec2e883b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -266,7 +266,7 @@ def setup(app): # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - "python": ("https://docs.python.org/3.8", None), + "python": ("https://docs.python.org/3.9", None), "numpy": ("https://numpy.org/doc/stable/", None), "scipy": ("https://docs.scipy.org/doc/scipy/", None), "astropy": ("https://docs.astropy.org/en/latest/", None), diff --git a/environment.yml b/environment.yml index e2d90f14896..60a30afa2a4 100644 --- a/environment.yml +++ b/environment.yml @@ -4,7 +4,7 @@ channels: - conda-forge - default dependencies: - - python=3.9 + - python=3.11 - pip - astropy=5 - black @@ -19,8 +19,8 @@ dependencies: - joblib - jupyter - matplotlib - - numba=0.56 - - numpy>=1.17 + - numba>=0.56 + - numpy>=1.22 - numpydoc - pandas - pre-commit diff --git a/setup.cfg b/setup.cfg index ea77a987f48..c1306501603 100644 --- a/setup.cfg +++ b/setup.cfg @@ -11,9 +11,9 @@ classifiers = Intended Audience :: Science/Research License :: OSI Approved :: BSD License Programming Language :: Python :: 3 - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 Programming Language :: Python :: Implementation :: CPython Topic :: Scientific/Engineering :: Astronomy Development Status :: 3 - Alpha @@ -21,7 +21,7 @@ classifiers = [options] packages = find: -python_requires = >=3.8 +python_requires = >=3.9 zip_safe = False install_requires= astropy ~=5.0 From 4fc533d5e8812accb5562a9d2b039be2a3e6ebdc Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 2 Jun 2023 14:41:35 +0200 Subject: [PATCH 003/264] Remove SimulationConfigContainer.injection_height, add SimulatedShowercontainer.starting_grammage --- ctapipe/containers.py | 10 +++++----- ctapipe/io/simteleventsource.py | 9 ++++++--- ctapipe/io/tests/test_simteleventsource.py | 8 ++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index bcccaef7f40..ba8bddf8fe2 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -586,8 +586,11 @@ class SimulatedShowerContainer(Container): core_x = Field(nan * u.m, "Simulated core position (x)", unit=u.m) core_y = Field(nan * u.m, "Simulated core position (y)", unit=u.m) h_first_int = Field(nan * u.m, "Height of first interaction", unit=u.m) - x_max = Field( - nan * u.g / (u.cm**2), "Simulated Xmax value", unit=u.g / (u.cm**2) + x_max = Field(nan * u.g / u.cm**2, "Simulated Xmax value", unit=u.g / u.cm**2) + starting_grammage = Field( + nan * u.g / u.cm**2, + "Grammage (mass overburden) where the particle was injected into the atmosphere", + unit=u.g / u.cm**2, ) shower_primary_id = Field( np.int16(np.iinfo(np.int16).max), @@ -692,9 +695,6 @@ class SimulationConfigContainer(Container): core_pos_mode = Field( nan, description="Core Position Mode (0=Circular, 1=Rectangular)" ) - injection_height = Field( - nan * u.m, description="Height of particle injection", unit=u.m - ) atmosphere = Field(nan * u.m, description="Atmospheric model number") corsika_iact_options = Field( nan, description="CORSIKA simulation options for IACTs" diff --git a/ctapipe/io/simteleventsource.py b/ctapipe/io/simteleventsource.py index 5dd00a226e7..235f8edd737 100644 --- a/ctapipe/io/simteleventsource.py +++ b/ctapipe/io/simteleventsource.py @@ -88,6 +88,7 @@ _half_pi = 0.5 * np.pi _half_pi_maxval = (1 + 1e-6) * _half_pi +_float32_nan = np.float32(np.nan) def _clip_altitude_if_close(altitude): @@ -117,7 +118,7 @@ class MirrorClass(enum.Enum): DUAL_MIRROR = 2 -X_MAX_UNIT = u.g / (u.cm**2) +GRAMMAGE_UNIT = u.g / (u.cm**2) NANOSECONDS_PER_DAY = (1 * u.day).to_value(u.ns) @@ -990,7 +991,6 @@ def _parse_simulation_header(self): max_scatter_range=mc_run_head["core_range"][1] * u.m, min_scatter_range=mc_run_head["core_range"][0] * u.m, core_pos_mode=mc_run_head["core_pos_mode"], - injection_height=mc_run_head["injection_height"] * u.m, atmosphere=mc_run_head["atmosphere"], corsika_iact_options=mc_run_head["corsika_iact_options"], corsika_low_E_model=mc_run_head["corsika_low_E_model"], @@ -1053,6 +1053,9 @@ def _fill_simulated_event_information(array_event): core_x=u.Quantity(mc_event["xcore"], u.m), core_y=u.Quantity(mc_event["ycore"], u.m), h_first_int=u.Quantity(mc_shower["h_first_int"], u.m), - x_max=u.Quantity(mc_shower["xmax"], X_MAX_UNIT), + x_max=u.Quantity(mc_shower["xmax"], GRAMMAGE_UNIT), shower_primary_id=mc_shower["primary_id"], + starting_grammage=u.Quantity( + mc_shower.get("depth_start", _float32_nan), GRAMMAGE_UNIT + ), ) diff --git a/ctapipe/io/tests/test_simteleventsource.py b/ctapipe/io/tests/test_simteleventsource.py index 04cf133d414..e9e7ea31f9a 100644 --- a/ctapipe/io/tests/test_simteleventsource.py +++ b/ctapipe/io/tests/test_simteleventsource.py @@ -591,3 +591,11 @@ def test_float32_pihalf(sign): assert shower.alt.value == sign * np.pi / 2 # check we cana create a Latitude: Latitude(shower.alt.value, u.rad) + + +def test_starting_grammage(): + path = "dataset://lst_muons.simtel.zst" + + with SimTelEventSource(path, focal_length_choice="EQUIVALENT") as source: + e = next(iter(source)) + assert e.simulation.shower.starting_grammage == 580 * u.g / u.cm**2 From ac72d5aad131fc470165ae0f5dbeeda758e80461 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 2 Jun 2023 15:38:46 +0200 Subject: [PATCH 004/264] Add changelog entry --- docs/changes/2343.feature.rst | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changes/2343.feature.rst diff --git a/docs/changes/2343.feature.rst b/docs/changes/2343.feature.rst new file mode 100644 index 00000000000..6367e808206 --- /dev/null +++ b/docs/changes/2343.feature.rst @@ -0,0 +1,5 @@ +Remove the ``injection_height`` field from the ``SimulationConfigContainer``, +this field was always empty and is never filled by ``sim_telarray``. + +Add the corresponding ``starting_grammage`` field to the ``SimulatedShowerContainer``, +where it is actually available. From 0c130269ea3019db666b50364546621a648d5be2 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:29:27 +0200 Subject: [PATCH 005/264] Update environment.yml and setup.cfg to latest version of sphinx --- environment.yml | 5 ++--- setup.cfg | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/environment.yml b/environment.yml index e2d90f14896..a45df14902b 100644 --- a/environment.yml +++ b/environment.yml @@ -9,7 +9,7 @@ dependencies: - astropy=5 - black - bokeh=2 - - nbsphinx >=0.8.12,<0.9 + - nbsphinx - cython - graphviz - h5py @@ -34,7 +34,7 @@ dependencies: - scikit-learn - scipy - setuptools - - sphinx=3.5 + - sphinx - sphinx-automodapi - sphinx_rtd_theme - tomli @@ -47,5 +47,4 @@ dependencies: - zlib - zstandard - eventio>=1.9.1 - - jinja2=3.0 # for sphinx 3.5, remove when updating to 4.x - ffmpeg # for making movies in the documentation diff --git a/setup.cfg b/setup.cfg index 8085914b2d9..303997ce672 100644 --- a/setup.cfg +++ b/setup.cfg @@ -56,11 +56,10 @@ tests = docs = - sphinx ~=3.5 - jinja2 ~=3.0.2 # for sphinx 3.5, remove when upgrading sphinx + sphinx sphinx_rtd_theme sphinx_automodapi - nbsphinx ~=0.8.12 + nbsphinx numpydoc jupyter notebook From 501f2a9218982ee2f922337f9cc3873047cb9e16 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:31:02 +0200 Subject: [PATCH 006/264] Moved docs/_static/theme_overrides.css to docs/_static/ctapipe.css --- docs/_static/ctapipe.css | 47 ++++++++++++++++++++++++++++++++ docs/_static/theme_overrides.css | 13 --------- 2 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 docs/_static/ctapipe.css delete mode 100644 docs/_static/theme_overrides.css diff --git a/docs/_static/ctapipe.css b/docs/_static/ctapipe.css new file mode 100644 index 00000000000..243e4af60cd --- /dev/null +++ b/docs/_static/ctapipe.css @@ -0,0 +1,47 @@ +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} + +/* sphinx-design */ +.sd-card { + border-radius: 5px; + padding: 30px 10px 20px 10px; + margin: 10px 0px; +} + +.sd-card .sd-card-header .sd-card-text { + margin: 0px; +} + +.sd-card .sd-card-header { + border: none; + text-align: center; + font-size: var(--pst-font-size-h4); + font-weight: bold; + padding: 0.5rem 0rem 0.5rem 0rem; +} + +.sd-card .sd-card-footer { + border: none; +} + +.sd-card .sd-card-footer .sd-card-text { + max-width: 220px; + margin-left: auto; + margin-right: auto; +} + +html[data-theme="dark"] .sd-shadow-sm { + --sd-color-shadow: #6e6e6e; +} + diff --git a/docs/_static/theme_overrides.css b/docs/_static/theme_overrides.css deleted file mode 100644 index 63ee6cc74ce..00000000000 --- a/docs/_static/theme_overrides.css +++ /dev/null @@ -1,13 +0,0 @@ -/* override table width restrictions */ -@media screen and (min-width: 767px) { - - .wy-table-responsive table td { - /* !important prevents the common CSS stylesheets from overriding - this as on RTD they are loaded after this stylesheet */ - white-space: normal !important; - } - - .wy-table-responsive { - overflow: visible !important; - } -} From 135df800ae5a7701d2002b3ab5101b3c86759125 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:33:22 +0200 Subject: [PATCH 007/264] Added logos dark/light --- docs/ctapipe_logo.webp | Bin 0 -> 108648 bytes docs/ctapipe_logo_dark.webp | Bin 0 -> 99660 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/ctapipe_logo.webp create mode 100644 docs/ctapipe_logo_dark.webp diff --git a/docs/ctapipe_logo.webp b/docs/ctapipe_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..bde5a0c7d4f69dc9ae46a2ba887e4b03f569b524 GIT binary patch literal 108648 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 z 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" + ], + "text/plain": [ + "<__main__.MyComponent at 0x7fa1066e5eb0>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "MyComponent()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Outfile was changed to '{'name': 'outfile', 'old': None, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.foo'), 'owner': <__main__.AdvancedComponent object at 0x7fa105f4fe20>, 'type': 'change'}'\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "AdvancedComponent\n", + "

\n", + "

An advanced technique

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
infile/home/aknierim/dev/ctapipe/docs/examples/test.fooinput file name (default: traitlets.Undefined)
outfile/home/aknierim/dev/ctapipe/docs/examples/out.foooutput file name (default: traitlets.Undefined)
value1-1Value to use (default: -1)
\n", + "
" + ], + "text/plain": [ + "<__main__.AdvancedComponent at 0x7fa105f4fe20>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "AdvancedComponent(infile=\"test.foo\", outfile=\"out.foo\")" ] @@ -138,9 +215,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subarray : MonteCarloArray\n", + "Num Tels : 180\n", + "Footprint: 4.92 km2\n", + "\n", + " Type Count Tel IDs \n", + "----------------- ----- ---------------\n", + " SST_ASTRI_CHEC 120 30-99,131-180 \n", + " LST_LST_LSTCam 4 1-4 \n", + "MST_MST_NectarCam 28 100-124,128-130\n", + " MST_MST_FlashCam 28 5-29,125-127 \n" + ] + } + ], "source": [ "from ctapipe.instrument import SubarrayDescription, TelescopeDescription\n", "\n", @@ -150,9 +244,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "TelescopeWiseComponent\n", + "

\n", + "

a component that contains parameters that are per-telescope configurable

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
param[('type', '*', 5.0)]Something configurable with telescope patterns. (default: traitlets.Undefined)
\n", + "
" + ], + "text/plain": [ + "<__main__.TelescopeWiseComponent at 0x7fa1704b9280>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "TelescopeWiseComponent(subarray=subarray)" ] @@ -186,7 +312,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -244,9 +370,128 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "MyTool\n", + "

\n", + "

do some things and stuff

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
config_files[] (default: traitlets.Undefined)
iterations5Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format[%(name)s]%(highlevel)s %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level30Set the log level by value or name. (default: 30)
logging_config{}\n", + " Configure additional log handlers.\n", + "\n", + " The default stderr logs handler is configured by the\n", + " log_level, log_datefmt and log_format settings.\n", + "\n", + " This configuration can be used to configure additional handlers\n", + " (e.g. to output the log to a file) or for finer control over the\n", + " default handlers.\n", + "\n", + " If provided this should be a logging configuration dictionary, for\n", + " more information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", + "\n", + " This dictionary is merged with the base logging configuration which\n", + " defines the following:\n", + "\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + "\n", + " This example adds a new handler that writes to a file:\n", + "\n", + " .. code-block:: python\n", + "\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + "\n", + " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", + "

Components:\n", + "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", + "

\n", + "" + ], + "text/plain": [ + "<__main__.MyTool at 0x7fa170490cd0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool = MyTool()\n", "tool" @@ -254,9 +499,78 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "do some things and stuff\n", + "\n", + "Options\n", + "=======\n", + "The options below are convenience aliases to configurable class-options,\n", + "as listed in the \"Equivalent to\" description-line of the aliases.\n", + "To see all configurable class-options for some , use:\n", + " --help-all\n", + "\n", + "-q, --quiet\n", + " Disable console logging.\n", + " Equivalent to: [--Tool.quiet=True]\n", + "-v, --verbose\n", + " Set log level to DEBUG\n", + " Equivalent to: [--Tool.log_level=DEBUG]\n", + "--overwrite\n", + " Overwrite existing output files without asking\n", + " Equivalent to: [--Tool.overwrite=True]\n", + "--debug\n", + " Set log-level to debug, for the most verbose logging.\n", + " Equivalent to: [--Application.log_level=10]\n", + "--show-config\n", + " Show the application's configuration (human-readable format)\n", + " Equivalent to: [--Application.show_config=True]\n", + "--show-config-json\n", + " Show the application's configuration (json format)\n", + " Equivalent to: [--Application.show_config_json=True]\n", + "-c, --config=...\n", + " Default: []\n", + " Equivalent to: [--Tool.config_files]\n", + "--log-level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + " Equivalent to: [--Tool.log_level]\n", + "-l, --log-file=\n", + " Filename for the log\n", + " Default: None\n", + " Equivalent to: [--Tool.log_file]\n", + "--log-file-level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + " Equivalent to: [--Tool.log_file_level]\n", + "--provenance-log=\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--Tool.provenance_log]\n", + "--infile=\n", + " input file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.infile]\n", + "--outfile=\n", + " output file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.outfile]\n", + "--iterations=\n", + " Number of times to run\n", + " Default: 5\n", + " Equivalent to: [--MyTool.iterations]\n", + "\n", + "To see all available configurables, use `--help-all`.\n", + "\n" + ] + } + ], "source": [ "tool.print_help()" ] @@ -270,9 +584,322 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "do some things and stuff\n", + "\n", + "Options\n", + "=======\n", + "The options below are convenience aliases to configurable class-options,\n", + "as listed in the \"Equivalent to\" description-line of the aliases.\n", + "To see all configurable class-options for some , use:\n", + " --help-all\n", + "\n", + "-q, --quiet\n", + " Disable console logging.\n", + " Equivalent to: [--Tool.quiet=True]\n", + "-v, --verbose\n", + " Set log level to DEBUG\n", + " Equivalent to: [--Tool.log_level=DEBUG]\n", + "--overwrite\n", + " Overwrite existing output files without asking\n", + " Equivalent to: [--Tool.overwrite=True]\n", + "--debug\n", + " Set log-level to debug, for the most verbose logging.\n", + " Equivalent to: [--Application.log_level=10]\n", + "--show-config\n", + " Show the application's configuration (human-readable format)\n", + " Equivalent to: [--Application.show_config=True]\n", + "--show-config-json\n", + " Show the application's configuration (json format)\n", + " Equivalent to: [--Application.show_config_json=True]\n", + "-c, --config=...\n", + " Default: []\n", + " Equivalent to: [--Tool.config_files]\n", + "--log-level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + " Equivalent to: [--Tool.log_level]\n", + "-l, --log-file=\n", + " Filename for the log\n", + " Default: None\n", + " Equivalent to: [--Tool.log_file]\n", + "--log-file-level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + " Equivalent to: [--Tool.log_file_level]\n", + "--provenance-log=\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--Tool.provenance_log]\n", + "--infile=\n", + " input file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.infile]\n", + "--outfile=\n", + " output file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.outfile]\n", + "--iterations=\n", + " Number of times to run\n", + " Default: 5\n", + " Equivalent to: [--MyTool.iterations]\n", + "\n", + "Class options\n", + "=============\n", + "The command-line option below sets the respective configurable class-parameter:\n", + " --Class.parameter=value\n", + "This line is evaluated in Python, so simple expressions are allowed.\n", + "For instance, to set `C.a=[0,1,2]`, you may type this:\n", + " --C.a='range(3)'\n", + "\n", + "Application(SingletonConfigurable) options\n", + "------------------------------------------\n", + "--Application.log_datefmt=\n", + " The date format used by logging formatters for %(asctime)s\n", + " Default: '%Y-%m-%d %H:%M:%S'\n", + "--Application.log_format=\n", + " The Logging format template\n", + " Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "--Application.log_level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + "--Application.logging_config==...\n", + " Configure additional log handlers.\n", + " The default stderr logs handler is configured by the log_level, log_datefmt\n", + " and log_format settings.\n", + " This configuration can be used to configure additional handlers (e.g. to\n", + " output the log to a file) or for finer control over the default handlers.\n", + " If provided this should be a logging configuration dictionary, for more\n", + " information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-\n", + " dictschema\n", + " This dictionary is merged with the base logging configuration which defines\n", + " the following:\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + " This example adds a new handler that writes to a file:\n", + " .. code-block:: python\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + " Default: {}\n", + "--Application.show_config=\n", + " Instead of starting the Application, dump configuration to stdout\n", + " Default: False\n", + "--Application.show_config_json=\n", + " Instead of starting the Application, dump configuration to stdout (as JSON)\n", + " Default: False\n", + "\n", + "Tool(Application) options\n", + "-------------------------\n", + "--Tool.config_files=...\n", + " Default: []\n", + "--Tool.log_config==...\n", + " Default: {}\n", + "--Tool.log_datefmt=\n", + " The date format used by logging formatters for %(asctime)s\n", + " Default: '%Y-%m-%d %H:%M:%S'\n", + "--Tool.log_file=\n", + " Filename for the log\n", + " Default: None\n", + "--Tool.log_file_level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + "--Tool.log_format=\n", + " The Logging format template\n", + " Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "--Tool.log_level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + "--Tool.logging_config==...\n", + " Configure additional log handlers.\n", + " The default stderr logs handler is configured by the log_level, log_datefmt\n", + " and log_format settings.\n", + " This configuration can be used to configure additional handlers (e.g. to\n", + " output the log to a file) or for finer control over the default handlers.\n", + " If provided this should be a logging configuration dictionary, for more\n", + " information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-\n", + " dictschema\n", + " This dictionary is merged with the base logging configuration which defines\n", + " the following:\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + " This example adds a new handler that writes to a file:\n", + " .. code-block:: python\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + " Default: {}\n", + "--Tool.overwrite=\n", + " Default: False\n", + "--Tool.provenance_log=\n", + " Default: traitlets.Undefined\n", + "--Tool.quiet=\n", + " Default: False\n", + "--Tool.show_config=\n", + " Instead of starting the Application, dump configuration to stdout\n", + " Default: False\n", + "--Tool.show_config_json=\n", + " Instead of starting the Application, dump configuration to stdout (as JSON)\n", + " Default: False\n", + "\n", + "MyTool(Tool) options\n", + "--------------------\n", + "--MyTool.config_files=...\n", + " Default: []\n", + "--MyTool.iterations=\n", + " Number of times to run\n", + " Default: 5\n", + "--MyTool.log_config==...\n", + " Default: {}\n", + "--MyTool.log_datefmt=\n", + " The date format used by logging formatters for %(asctime)s\n", + " Default: '%Y-%m-%d %H:%M:%S'\n", + "--MyTool.log_file=\n", + " Filename for the log\n", + " Default: None\n", + "--MyTool.log_file_level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + "--MyTool.log_format=\n", + " The Logging format template\n", + " Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "--MyTool.log_level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + "--MyTool.logging_config==...\n", + " Configure additional log handlers.\n", + " The default stderr logs handler is configured by the log_level, log_datefmt\n", + " and log_format settings.\n", + " This configuration can be used to configure additional handlers (e.g. to\n", + " output the log to a file) or for finer control over the default handlers.\n", + " If provided this should be a logging configuration dictionary, for more\n", + " information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-\n", + " dictschema\n", + " This dictionary is merged with the base logging configuration which defines\n", + " the following:\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + " This example adds a new handler that writes to a file:\n", + " .. code-block:: python\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + " Default: {}\n", + "--MyTool.overwrite=\n", + " Default: False\n", + "--MyTool.provenance_log=\n", + " Default: traitlets.Undefined\n", + "--MyTool.quiet=\n", + " Default: False\n", + "--MyTool.show_config=\n", + " Instead of starting the Application, dump configuration to stdout\n", + " Default: False\n", + "--MyTool.show_config_json=\n", + " Instead of starting the Application, dump configuration to stdout (as JSON)\n", + " Default: False\n", + "\n", + "MyComponent(Component) options\n", + "------------------------------\n", + "--MyComponent.value=\n", + " Value to use\n", + " Default: -1\n", + "\n", + "AdvancedComponent(Component) options\n", + "------------------------------------\n", + "--AdvancedComponent.infile=\n", + " input file name\n", + " Default: traitlets.Undefined\n", + "--AdvancedComponent.outfile=\n", + " output file name\n", + " Default: traitlets.Undefined\n", + "--AdvancedComponent.value1=\n", + " Value to use\n", + " Default: -1\n", + "\n", + "SecondaryMyComponent(MyComponent) options\n", + "-----------------------------------------\n", + "--SecondaryMyComponent.value=\n", + " Value to use\n", + " Default: -1\n", + "\n", + "TelescopeWiseComponent(TelescopeComponent) options\n", + "--------------------------------------------------\n", + "--TelescopeWiseComponent.param=...\n", + " Something configurable with telescope patterns.\n", + " Default: [('type', '*', 5.0)]\n", + "\n" + ] + } + ], "source": [ "tool.print_help(classes=True)" ] @@ -295,9 +922,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:52,057 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170483f40>, 'type': 'change'}'\n", + "2023-07-03 17:24:52,559 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n" + ] + } + ], "source": [ "try:\n", " tool.run(argv=[\"--infile\", str(GAMMA_FILE), \"--outfile\", \"out.csv\"])\n", @@ -307,9 +943,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:52,798 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): Loading config from '[]'\n", + "2023-07-03 17:24:52,800 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", + "2023-07-03 17:24:52,802 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170483520>, 'type': 'change'}'\n", + "2023-07-03 17:24:52,803 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 3 iterations...\n", + "2023-07-03 17:24:52,803 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", + "2023-07-03 17:24:52,903 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", + "2023-07-03 17:24:53,005 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", + "2023-07-03 17:24:53,106 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", + "2023-07-03 17:24:53,108 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", + "2023-07-03 17:24:53,114 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,116 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n" + ] + } + ], "source": [ "tool.log_format = \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\"\n", "\n", @@ -340,9 +994,2637 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:53,149 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Starting: mytool\n", + "2023-07-03 17:24:53,325 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): Loading config from '[]'\n", + "2023-07-03 17:24:53,327 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", + "2023-07-03 17:24:53,329 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486340>, 'type': 'change'}'\n", + "2023-07-03 17:24:53,330 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.run): CONFIG: {'MyTool': {'config_files': [], 'iterations': 3, 'log_config': {}, 'log_datefmt': '%Y-%m-%d %H:%M:%S', 'log_file': None, 'log_file_level': 'INFO', 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s', 'log_level': 10, 'logging_config': {}, 'overwrite': False, 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'), 'quiet': False, 'show_config': False, 'show_config_json': False, 'MyComponent': {'value': -1}, 'SecondaryMyComponent': {'value': -1}, 'TelescopeWiseComponent': {'param': [('type', '*', 5.0)]}, 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'), 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'value1': -1, 'MyComponent': {'value': -1}}}}\n", + "2023-07-03 17:24:53,330 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 3 iterations...\n", + "2023-07-03 17:24:53,330 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", + "2023-07-03 17:24:53,331 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,331 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,432 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", + "2023-07-03 17:24:53,433 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,435 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,537 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", + "2023-07-03 17:24:53,538 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,539 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,640 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", + "2023-07-03 17:24:53,642 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", + "2023-07-03 17:24:53,649 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,651 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,653 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,668 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.write_provenance): PROVENANCE: '[\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"c2c31b3c-b5cd-4c46-8581-e0cf17c94af0\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:51.880\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.561\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.052\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 5,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", + " \"log_level\": 30,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.011350000000014404\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"9a689c40-0157-4ee0-88f4-fb8125ef689c\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.601\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.110\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.794\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 20,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.008483333333408893\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"a237bc8b-cb43-456b-a3d2-3f1ad096fbeb\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.153\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.644\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:53.322\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 10,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.00818333333336696\n", + " }\n", + "]'\n", + "2023-07-03 17:24:53,683 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (application.exit): Exiting application: mytool\n" + ] + } + ], "source": [ "try:\n", " tool.run(\n", @@ -368,9 +3650,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:53,720 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Starting: mytool\n", + "2023-07-03 17:24:53,931 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486880>, 'type': 'change'}'\n", + "2023-07-03 17:24:54,032 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n" + ] + } + ], "source": [ "tool.iterations = 1\n", "tool.log_level = 0\n", @@ -390,9 +3682,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bad value: The 'iterations' trait of a MyTool instance expected an int, not the str 'badval'.\n" + ] + } + ], "source": [ "try:\n", " tool.iterations = \"badval\"\n", @@ -411,9 +3711,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:54,141 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/Another.txt'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486880>, 'type': 'change'}'\n" + ] + } + ], "source": [ "tool.advanced.outfile = \"Another.txt\"" ] @@ -434,7 +3742,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -443,9 +3751,4382 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:54,332 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", + "2023-07-03 17:24:54,334 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/foo.txt'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486e20>, 'type': 'change'}'\n", + "2023-07-03 17:24:54,335 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.run): CONFIG: {'MyTool': {'config_files': [PosixPath('/home/aknierim/dev/ctapipe/docs/examples/Tools.json')], 'iterations': 5, 'log_config': {}, 'log_datefmt': '%Y-%m-%d %H:%M:%S', 'log_file': None, 'log_file_level': 'INFO', 'log_format': '[%(name)s]%(highlevel)s %(message)s', 'log_level': 10, 'logging_config': {}, 'overwrite': False, 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'), 'quiet': False, 'show_config': False, 'show_config_json': False, 'MyComponent': {'value': -1}, 'SecondaryMyComponent': {'value': -1}, 'TelescopeWiseComponent': {'param': [('type', '*', 5.0)]}, 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/something.txt'), 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/foo.txt'), 'value1': -1, 'MyComponent': {'value': -1}}}}\n", + "2023-07-03 17:24:54,336 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 5 iterations...\n", + "2023-07-03 17:24:54,336 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", + "2023-07-03 17:24:54,336 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,337 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,437 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", + "2023-07-03 17:24:54,439 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,441 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,542 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", + "2023-07-03 17:24:54,543 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,543 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,644 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 3\n", + "2023-07-03 17:24:54,645 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,647 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,748 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 4\n", + "2023-07-03 17:24:54,749 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,749 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,850 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", + "2023-07-03 17:24:54,852 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", + "2023-07-03 17:24:54,858 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,859 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,861 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,862 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,864 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,887 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.write_provenance): PROVENANCE: '[\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"c2c31b3c-b5cd-4c46-8581-e0cf17c94af0\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:51.880\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.561\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.052\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 5,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", + " \"log_level\": 30,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.011350000000014404\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"9a689c40-0157-4ee0-88f4-fb8125ef689c\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.601\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.110\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.794\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 20,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.008483333333408893\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"a237bc8b-cb43-456b-a3d2-3f1ad096fbeb\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.153\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.644\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:53.322\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 10,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.00818333333336696\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"b0ef6627-d00f-4fd8-bf9a-7631e890715b\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.722\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:54.034\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:53.927\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 1,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 0,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.005199999999874194\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"837610ed-009c-4e8f-9770-cfb76ab71239\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:54.154\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:54.854\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:54.328\"\n", + " },\n", + " \"input\": [\n", + " {\n", + " \"url\": \"/home/aknierim/dev/ctapipe/docs/examples/Tools.json\",\n", + " \"role\": \"Tool Configuration\"\n", + " }\n", + " ],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [\n", + " \"/home/aknierim/dev/ctapipe/docs/examples/Tools.json\"\n", + " ],\n", + " \"iterations\": 5,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", + " \"log_level\": 10,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/dev/ctapipe/docs/examples/something.txt\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/foo.txt\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.01166666666650329\n", + " }\n", + "]'\n", + "2023-07-03 17:24:54,902 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (application.exit): Exiting application: mytool\n" + ] + } + ], "source": [ "try:\n", " tool2.run(argv=[\"--config\", \"Tools.json\"])\n", @@ -455,34 +8136,61 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/aknierim/dev/ctapipe/docs/examples/something.txt\n" + ] + } + ], "source": [ "print(tool2.advanced.infile)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'MyTool': {'config_files': ['Tools.json'], 'log_level': 'DEBUG'}, 'AdvancedComponent': {'infile': 'something.txt', 'outfile': 'foo.txt'}}\n" + ] + } + ], "source": [ "print(tool2.config)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool2.is_setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -491,16 +8199,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool3.is_setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -509,27 +8228,283 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool3.is_setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "MyTool\n", + "

\n", + "

do some things and stuff

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
config_files[] (default: traitlets.Undefined)
iterations5Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format[%(name)s]%(highlevel)s %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level30Set the log level by value or name. (default: 30)
logging_config{}\n", + " Configure additional log handlers.\n", + "\n", + " The default stderr logs handler is configured by the\n", + " log_level, log_datefmt and log_format settings.\n", + "\n", + " This configuration can be used to configure additional handlers\n", + " (e.g. to output the log to a file) or for finer control over the\n", + " default handlers.\n", + "\n", + " If provided this should be a logging configuration dictionary, for\n", + " more information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", + "\n", + " This dictionary is merged with the base logging configuration which\n", + " defines the following:\n", + "\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + "\n", + " This example adds a new handler that writes to a file:\n", + "\n", + " .. code-block:: python\n", + "\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + "\n", + " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", + "

Components:\n", + "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", + "

\n", + "" + ], + "text/plain": [ + "<__main__.MyTool at 0x7fa1985c6610>" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool3" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:55,026 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa1704f4250>, 'type': 'change'}'\n" + ] + }, + { + "data": { + "text/html": [ + "MyTool\n", + "

\n", + "

do some things and stuff

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
config_files[] (default: traitlets.Undefined)
iterations1Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level0Set the log level by value or name. (default: 30)
logging_config{}\n", + " Configure additional log handlers.\n", + "\n", + " The default stderr logs handler is configured by the\n", + " log_level, log_datefmt and log_format settings.\n", + "\n", + " This configuration can be used to configure additional handlers\n", + " (e.g. to output the log to a file) or for finer control over the\n", + " default handlers.\n", + "\n", + " If provided this should be a logging configuration dictionary, for\n", + " more information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", + "\n", + " This dictionary is merged with the base logging configuration which\n", + " defines the following:\n", + "\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + "\n", + " This example adds a new handler that writes to a file:\n", + "\n", + " .. code-block:: python\n", + "\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + "\n", + " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", + "

Components:\n", + "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", + "

\n", + "" + ], + "text/plain": [ + "<__main__.MyTool at 0x7fa170490cd0>" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.setup()\n", "tool" @@ -537,9 +8512,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "SecondaryMyComponent\n", + "

\n", + "

A second component

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
value-1Value to use (default: -1)
\n", + "
" + ], + "text/plain": [ + "<__main__.SecondaryMyComponent at 0x7fa1704f4a00>" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.comp2" ] @@ -553,18 +8560,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'MyTool': {'config_files': [],\n", + " 'iterations': 1,\n", + " 'log_config': {},\n", + " 'log_datefmt': '%Y-%m-%d %H:%M:%S',\n", + " 'log_file': None,\n", + " 'log_file_level': 'INFO',\n", + " 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s',\n", + " 'log_level': 0,\n", + " 'logging_config': {},\n", + " 'overwrite': False,\n", + " 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'),\n", + " 'quiet': False,\n", + " 'show_config': False,\n", + " 'show_config_json': False,\n", + " 'MyComponent': {'value': -1},\n", + " 'SecondaryMyComponent': {'value': -1},\n", + " 'TelescopeWiseComponent': {'param': TelescopePatternList([('type',\n", + " '*',\n", + " 5.0)])},\n", + " 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'),\n", + " 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'),\n", + " 'value1': -1,\n", + " 'MyComponent': {'value': -1}}}}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.get_current_config()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'MyTool': {'config_files': [],\n", + " 'iterations': 12,\n", + " 'log_config': {},\n", + " 'log_datefmt': '%Y-%m-%d %H:%M:%S',\n", + " 'log_file': None,\n", + " 'log_file_level': 'INFO',\n", + " 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s',\n", + " 'log_level': 0,\n", + " 'logging_config': {},\n", + " 'overwrite': False,\n", + " 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'),\n", + " 'quiet': False,\n", + " 'show_config': False,\n", + " 'show_config_json': False,\n", + " 'MyComponent': {'value': -1},\n", + " 'SecondaryMyComponent': {'value': -1},\n", + " 'TelescopeWiseComponent': {'param': TelescopePatternList([('type',\n", + " '*',\n", + " 5.0)])},\n", + " 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'),\n", + " 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'),\n", + " 'value1': -1,\n", + " 'MyComponent': {'value': -1}}}}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.iterations = 12\n", "tool.get_current_config()" @@ -579,9 +8652,244 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Configuration file for mytool.\n", + "\n", + "c = get_config() #noqa\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# Application(SingletonConfigurable) configuration\n", + "#------------------------------------------------------------------------------\n", + "## This is an application.\n", + "\n", + "## The date format used by logging formatters for %(asctime)s\n", + "# Default: '%Y-%m-%d %H:%M:%S'\n", + "# c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", + "\n", + "## The Logging format template\n", + "# Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "# c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", + "\n", + "## Set the log level by value or name.\n", + "# Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + "# Default: 30\n", + "# c.Application.log_level = 30\n", + "\n", + "## Configure additional log handlers.\n", + "# \n", + "# The default stderr logs handler is configured by the log_level, log_datefmt\n", + "# and log_format settings.\n", + "# \n", + "# This configuration can be used to configure additional handlers (e.g. to\n", + "# output the log to a file) or for finer control over the default handlers.\n", + "# \n", + "# If provided this should be a logging configuration dictionary, for more\n", + "# information see:\n", + "# https://docs.python.org/3/library/logging.config.html#logging-config-\n", + "# dictschema\n", + "# \n", + "# This dictionary is merged with the base logging configuration which defines\n", + "# the following:\n", + "# \n", + "# * A logging formatter intended for interactive use called\n", + "# ``console``.\n", + "# * A logging handler that writes to stderr called\n", + "# ``console`` which uses the formatter ``console``.\n", + "# * A logger with the name of this application set to ``DEBUG``\n", + "# level.\n", + "# \n", + "# This example adds a new handler that writes to a file:\n", + "# \n", + "# .. code-block:: python\n", + "# \n", + "# c.Application.logging_config = {\n", + "# 'handlers': {\n", + "# 'file': {\n", + "# 'class': 'logging.FileHandler',\n", + "# 'level': 'DEBUG',\n", + "# 'filename': '',\n", + "# }\n", + "# },\n", + "# 'loggers': {\n", + "# '': {\n", + "# 'level': 'DEBUG',\n", + "# # NOTE: if you don't list the default \"console\"\n", + "# # handler here then it will be disabled\n", + "# 'handlers': ['console', 'file'],\n", + "# },\n", + "# }\n", + "# }\n", + "# Default: {}\n", + "# c.Application.logging_config = {}\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout\n", + "# Default: False\n", + "# c.Application.show_config = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", + "# Default: False\n", + "# c.Application.show_config_json = False\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# Tool(Application) configuration\n", + "#------------------------------------------------------------------------------\n", + "## This is an application.\n", + "\n", + "# Default: []\n", + "# c.Tool.config_files = []\n", + "\n", + "# Default: {}\n", + "# c.Tool.log_config = {}\n", + "\n", + "## The date format used by logging formatters for %(asctime)s\n", + "# See also: Application.log_datefmt\n", + "# c.Tool.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", + "\n", + "## Filename for the log\n", + "# Default: None\n", + "# c.Tool.log_file = None\n", + "\n", + "## Logging Level for File Logging\n", + "# Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + "# Default: 'INFO'\n", + "# c.Tool.log_file_level = 'INFO'\n", + "\n", + "## The Logging format template\n", + "# See also: Application.log_format\n", + "# c.Tool.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", + "\n", + "## Set the log level by value or name.\n", + "# See also: Application.log_level\n", + "# c.Tool.log_level = 30\n", + "\n", + "## \n", + "# See also: Application.logging_config\n", + "# c.Tool.logging_config = {}\n", + "\n", + "# Default: False\n", + "# c.Tool.overwrite = False\n", + "\n", + "# Default: traitlets.Undefined\n", + "# c.Tool.provenance_log = traitlets.Undefined\n", + "\n", + "# Default: False\n", + "# c.Tool.quiet = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout\n", + "# See also: Application.show_config\n", + "# c.Tool.show_config = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", + "# See also: Application.show_config_json\n", + "# c.Tool.show_config_json = False\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# MyTool(Tool) configuration\n", + "#------------------------------------------------------------------------------\n", + "# See also: Tool.config_files\n", + "# c.MyTool.config_files = []\n", + "\n", + "## Number of times to run\n", + "# Default: 5\n", + "# c.MyTool.iterations = 5\n", + "\n", + "# See also: Tool.log_config\n", + "# c.MyTool.log_config = {}\n", + "\n", + "## The date format used by logging formatters for %(asctime)s\n", + "# See also: Application.log_datefmt\n", + "# c.MyTool.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", + "\n", + "## Filename for the log\n", + "# See also: Tool.log_file\n", + "# c.MyTool.log_file = None\n", + "\n", + "## Logging Level for File Logging\n", + "# See also: Tool.log_file_level\n", + "# c.MyTool.log_file_level = 'INFO'\n", + "\n", + "## The Logging format template\n", + "# See also: Application.log_format\n", + "# c.MyTool.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", + "\n", + "## Set the log level by value or name.\n", + "# See also: Application.log_level\n", + "# c.MyTool.log_level = 30\n", + "\n", + "## \n", + "# See also: Application.logging_config\n", + "# c.MyTool.logging_config = {}\n", + "\n", + "# See also: Tool.overwrite\n", + "# c.MyTool.overwrite = False\n", + "\n", + "# See also: Tool.provenance_log\n", + "# c.MyTool.provenance_log = traitlets.Undefined\n", + "\n", + "# See also: Tool.quiet\n", + "# c.MyTool.quiet = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout\n", + "# See also: Application.show_config\n", + "# c.MyTool.show_config = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", + "# See also: Application.show_config_json\n", + "# c.MyTool.show_config_json = False\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# MyComponent(Component) configuration\n", + "#------------------------------------------------------------------------------\n", + "## A Component that does stuff\n", + "\n", + "## Value to use\n", + "# Default: -1\n", + "# c.MyComponent.value = -1\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# AdvancedComponent(Component) configuration\n", + "#------------------------------------------------------------------------------\n", + "## An advanced technique\n", + "\n", + "## input file name\n", + "# Default: traitlets.Undefined\n", + "# c.AdvancedComponent.infile = traitlets.Undefined\n", + "\n", + "## output file name\n", + "# Default: traitlets.Undefined\n", + "# c.AdvancedComponent.outfile = traitlets.Undefined\n", + "\n", + "## Value to use\n", + "# Default: -1\n", + "# c.AdvancedComponent.value1 = -1\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# SecondaryMyComponent(MyComponent) configuration\n", + "#------------------------------------------------------------------------------\n", + "## A second component\n", + "\n", + "## Value to use\n", + "# See also: MyComponent.value\n", + "# c.SecondaryMyComponent.value = -1\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# TelescopeWiseComponent(TelescopeComponent) configuration\n", + "#------------------------------------------------------------------------------\n", + "## a component that contains parameters that are per-telescope configurable\n", + "\n", + "## Something configurable with telescope patterns.\n", + "# Default: [('type', '*', 5.0)]\n", + "# c.TelescopeWiseComponent.param = [('type', '*', 5.0)]\n", + "\n" + ] + } + ], "source": [ "print(tool.generate_config_file())" ] @@ -595,14 +8903,22 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { "codemirror_mode": { - "name": "ipython" + "name": "ipython", + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", - "nbconvert_exporter": "python" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index 497847c8796..2fffa42a874 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -1,3 +1,4 @@ + .. _getting_started: ****************************** @@ -77,7 +78,6 @@ Change to the directory where you cloned ``ctapipe``, and type: .. code-block:: console - $ conda env create -n cta-dev -f environment.yml @@ -238,11 +238,11 @@ You can do this at any time and more than once. It just moves the changes from your local branch on your development machine to your fork on github. -++++++++++++++++++++++++ -4. make a *Pull Request* -++++++++++++++++++++++++ +++++++++++++++++++++++++++ +4. Create a *Pull Request* +++++++++++++++++++++++++++ -When you're happy, you make PR on on your github fork page by clicking +When you're happy, you create PR on on your github fork page by clicking "pull request". You can also do this via *GitHub Desktop* if you have that installed, by pushing the pull-request button in the upper-right-hand corner. @@ -279,7 +279,7 @@ When the PR is accepted, the reviewer will merge your branch into the *master* repo on cta-observatory's account. +++++++++++++++++++++++++++++ -6. delete your feature branch +6. Delete your feature branch +++++++++++++++++++++++++++++ since it is no longer needed (assuming it was accepted and merged in): diff --git a/docs/index.rst b/docs/index.rst index 04226dff2b9..f788f9ad5d1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,7 @@ .. include:: references.txt +:html_theme.sidebar_secondary.remove: true + .. _ctapipe: ============================================== @@ -8,11 +10,19 @@ Prototype CTA Pipeline Framework (``ctapipe``) .. currentmodule:: ctapipe -**version**: |version| +**Version**: |version| + +.. image:: ctapipe_logo.webp + :class: only-light + :align: center + :width: 90% + :alt: The ctapipe logo. -.. image:: ctapipe_logo.png +.. image:: ctapipe_logo_dark.webp + :class: only-dark :align: center :width: 90% + :alt: The ctapipe logo. What is ctapipe? ================ @@ -33,25 +43,150 @@ What is ctapipe? .. _ctapipe_docs: -General documentation -===================== +.. General documentation +.. ===================== .. toctree:: :maxdepth: 1 - :glob: + :hidden: - getting_started_users/index - getting_started/index + User Guide + Developer Guide + ctapipe_api/index development/index tutorials/index examples/index tools/index FAQ data_models/index - ctapipe_api/index bibliography changelog + + +.. grid:: 3 + + .. grid-item-card:: + + :octicon:`book;40px` + + User Guide + ^^^^^^^^^^ + + Learn how to get started as a user. This guide + will help you install ctapipe. + + +++ + + .. button-ref:: getting_started_users/index + :expand: + :color: primary + :click-parent: + + To the user guide + + + .. grid-item-card:: + + :octicon:`person-add;40px` + + Developer Guide + ^^^^^^^^^^^^^^^ + + Learn how to get started as a developer. + This guide will help you install ctapipe for development + and explains how to contribute. + + +++ + + .. button-ref:: getting_started/index + :expand: + :color: primary + :click-parent: + + To the developer guide + + + .. grid-item-card:: + + :octicon:`git-pull-request;40px` + + Development Guidelines + ^^^^^^^^^^^^^^^^^^^^^^ + + These guidelines explain the coding style and the workflow. The ctapipe + enhancement proposals (CEPs) can also be found here. + + +++ + + .. button-ref:: development/index + :expand: + :color: primary + :click-parent: + + To the development guidelines + + + .. grid-item-card:: + + :octicon:`code;40px` + + API Docs + ^^^^^^^^ + + The API docs contain detailed descriptions of + of the various modules and functions included + in ctapipe. + + +++ + + .. button-ref:: ctapipe_api/index + :expand: + :color: primary + :click-parent: + + To API docs + + + .. grid-item-card:: + + :octicon:`mortar-board;40px` + + Tutorials + ^^^^^^^^^ + + A collection of tutorials aimed at new users + and developers to familiarize with ctapipe. + + +++ + + .. button-ref:: tutorials/index + :expand: + :color: primary + :click-parent: + + To the tutorials + + + .. grid-item-card:: + + :octicon:`light-bulb;40px` + + Examples + ^^^^^^^^ + + Some lower-level examples of features included in the ctapipe API. + + +++ + + .. button-ref:: examples/index + :expand: + :color: primary + :click-parent: + + To the examples + + Module API Status (relative to next release) ============================================ @@ -65,3 +200,7 @@ Development Help * Development workflow examples from AstroPy: https://astropy.readthedocs.org/en/latest/development/workflow/development_workflow.html * GIT tutorial: https://www.atlassian.com/git/tutorials/syncing/git-pull * Code distribution and Packaging https://packaging.python.org/en/latest/ + + + + diff --git a/docs/versions.json b/docs/versions.json new file mode 100644 index 00000000000..325cfcaf9eb --- /dev/null +++ b/docs/versions.json @@ -0,0 +1,12 @@ +[ + { + "name": "latest", + "version": "latest", + "url": "https://ctapipe.readthedocs.io/en/latest/" + }, + { + "name": "stable", + "version": "stable", + "url": "https://ctapipe.readthedocs.io/en/stable/" + }, +] From c1eef15eae0d1fe0038ff2c9439f896b9a90282e Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:53:33 +0200 Subject: [PATCH 009/264] Update setup.cfg pydata dependency --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 303997ce672..c26a1969475 100644 --- a/setup.cfg +++ b/setup.cfg @@ -57,7 +57,7 @@ tests = docs = sphinx - sphinx_rtd_theme + pydata_sphinx_theme sphinx_automodapi nbsphinx numpydoc From a76a43d94d6ffa0c555e369f8ce14c9d9b148928 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 16:00:11 +0200 Subject: [PATCH 010/264] Added sphinx-design --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index c26a1969475..67d11b36c1f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -61,6 +61,7 @@ docs = sphinx_automodapi nbsphinx numpydoc + sphinx-design jupyter notebook graphviz From c60a81e0a56f769ffa1c9a3da9db3a5cbb2c9b76 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 16:51:56 +0200 Subject: [PATCH 011/264] Update environment.yml and setup.cfg to latest version of sphinx --- environment.yml | 5 ++--- setup.cfg | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/environment.yml b/environment.yml index e2d90f14896..a45df14902b 100644 --- a/environment.yml +++ b/environment.yml @@ -9,7 +9,7 @@ dependencies: - astropy=5 - black - bokeh=2 - - nbsphinx >=0.8.12,<0.9 + - nbsphinx - cython - graphviz - h5py @@ -34,7 +34,7 @@ dependencies: - scikit-learn - scipy - setuptools - - sphinx=3.5 + - sphinx - sphinx-automodapi - sphinx_rtd_theme - tomli @@ -47,5 +47,4 @@ dependencies: - zlib - zstandard - eventio>=1.9.1 - - jinja2=3.0 # for sphinx 3.5, remove when updating to 4.x - ffmpeg # for making movies in the documentation diff --git a/setup.cfg b/setup.cfg index 5092c8e6292..d3e867f8638 100644 --- a/setup.cfg +++ b/setup.cfg @@ -56,12 +56,11 @@ tests = docs = - sphinx ~=3.5 - jinja2 ~=3.0.2 # for sphinx 3.5, remove when upgrading sphinx + sphinx sphinx_rtd_theme sphinx_automodapi - nbsphinx ~=0.8.12 - numpydoc ~=1.4.0 + nbsphinx + numpydoc jupyter notebook graphviz From 658fb6a8617340150e5f18343761329e10098812 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:31:02 +0200 Subject: [PATCH 012/264] Moved docs/_static/theme_overrides.css to docs/_static/ctapipe.css --- docs/_static/ctapipe.css | 47 ++++++++++++++++++++++++++++++++ docs/_static/theme_overrides.css | 13 --------- 2 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 docs/_static/ctapipe.css delete mode 100644 docs/_static/theme_overrides.css diff --git a/docs/_static/ctapipe.css b/docs/_static/ctapipe.css new file mode 100644 index 00000000000..243e4af60cd --- /dev/null +++ b/docs/_static/ctapipe.css @@ -0,0 +1,47 @@ +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} + +/* sphinx-design */ +.sd-card { + border-radius: 5px; + padding: 30px 10px 20px 10px; + margin: 10px 0px; +} + +.sd-card .sd-card-header .sd-card-text { + margin: 0px; +} + +.sd-card .sd-card-header { + border: none; + text-align: center; + font-size: var(--pst-font-size-h4); + font-weight: bold; + padding: 0.5rem 0rem 0.5rem 0rem; +} + +.sd-card .sd-card-footer { + border: none; +} + +.sd-card .sd-card-footer .sd-card-text { + max-width: 220px; + margin-left: auto; + margin-right: auto; +} + +html[data-theme="dark"] .sd-shadow-sm { + --sd-color-shadow: #6e6e6e; +} + diff --git a/docs/_static/theme_overrides.css b/docs/_static/theme_overrides.css deleted file mode 100644 index 63ee6cc74ce..00000000000 --- a/docs/_static/theme_overrides.css +++ /dev/null @@ -1,13 +0,0 @@ -/* override table width restrictions */ -@media screen and (min-width: 767px) { - - .wy-table-responsive table td { - /* !important prevents the common CSS stylesheets from overriding - this as on RTD they are loaded after this stylesheet */ - white-space: normal !important; - } - - .wy-table-responsive { - overflow: visible !important; - } -} From d2a6d54270d3884fedf9b5d03abc1a39187a6227 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:33:22 +0200 Subject: [PATCH 013/264] Added logos dark/light --- docs/ctapipe_logo.webp | Bin 0 -> 108648 bytes docs/ctapipe_logo_dark.webp | Bin 0 -> 99660 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/ctapipe_logo.webp create mode 100644 docs/ctapipe_logo_dark.webp diff --git a/docs/ctapipe_logo.webp b/docs/ctapipe_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..bde5a0c7d4f69dc9ae46a2ba887e4b03f569b524 GIT binary patch literal 108648 zcmeENRa=x_w0}V)m6k4PNdc8^q`Nz$yK_hZDQN-e?(S}p9;BtEJBN47!dweP=E`g-+ zdJAg_?w+t|(H@{breR<(KE2XUJD1?mIQF}O!omY=4VJRhHkGc zvo-B&*atNYcS2Zfz*_zeY~TAXI(Ar?qQ+j0b~wIqa4aMEEpJq9d8&*J2NsOw6h1cg zJuG!XhfF_HG}=P4B6;S(p_DlC9Tzh%XE061_}Ggk`#}boCQm_jp=bYYCyBPPDx2}k zOD~Is-|(d-`=w8FO`Vn&)f^aloOfSSx7mf#SuAalT zZ=XHgi~AKNojHGxIxaQ&-5OTs-%y?zo~r#vy@@wGI@LHKhA+CYJ*%B!Vz<8R`lK<| z&T+|KI>9ZBrhbuRsp&Xh2XZsiqv?9Haq$EA`gAa;_iyne*tcJ}kMD$L)QAR6`2nlc_HGNC2`knf7F~eJ4 zi^t%as~a);We&Rz>pdrf%rNG`PwZVX1Sh{@o3fu?{okmoT)7PPHgKM}YiJ20b0cRsl zw*eevkad*wjEi55*aO;2k$#^|XxIAW`1hA<>h1uoDs%vqj6XfYUqS-apYQIk<4g9| zLl%JLRaNH$sn$0Gal>$3j8q#zH8eS-kE$e=Q6(z!kQe5_5Op1sp^-HZqh7_%_SLr7 zQ&sq$0V||)>mmCTL4TzNK9D`0uarS@qNKUvXL2_`Yu(Oey2Eeu@AotA?P*p(rmtZi zsfAeL`cR58cUDnK0s;VtKGdWXxrKD%*~blk_thr7ERi`BhNI#hCr`;PX1x&sHnw z54(?PdS^$fU(=;Nx50`#@8%d86OPBXn*D_ZWi_USYth4^MeHFvZ$1glJfC*KFuljM z{id?^e;;dKG#BGyVF26|({jUsR86Y}3GV;UHz%bMQw#}%UWzzoEI*Ye^&NBh1gaFC z>Ft;wdPhquI#xWwcO6XK3j~E_8+G-LB6`OnB%bmgM ztozY;f!zLC9WdU#%}FeY*r(V9a(;7gDb*gvuo!CGqs0L-p|d6RGRs z#?bxbNo^FXDo{dW$P)ouyTh&cdS7bpi=o?z^Z7;jBqMTL5z|2KwE?vWDvQhsb&7}J1#)u(L?EuGcKF*qvw8Ox zT5Vjzr+yO9az=;8iZU~E!~*>WQPX>VfFJd!&$WB)|8abT>H%>04g-9--AMb0FHKgT zbxf?orTQX%l+-4tAvS;BFbeSnFw1v`lAX5j5Td=jF;9}LW)nVg>RZf{X#eX<#gpXW zXj&g)1)tVho6u`8UCRHcrhzE_Ydp_{Iy@(viOg(f0f$#$S6;GDEScK-P6RHGrW*31 z<)va)^anx*1RyY&rsIi%;z?hWa1u+4^6s=Ag6Rg0>t)VfP%&gg0DigE5YG{%e(Bw+ z+b&>_Zfz(|&)Io{TUbx}12pZfMM2IobFrsk7f+Xm_bAGlMBLXdN>xo$tj;$+4KDmD z(cCG58)M{v{SA@`d@tzmc;23}q$9;Km7*+o?a{;eot6@*IDK}~r5R4;xVH$)#foqmKom{lnXh#)S!9FR@$ z6pT$VLSX@bvaptiF3$~_{+npZYN4|=iyPm=M92sRXySoEQ)2XW1!95iqCqio$xsoS z81<%LTtH-c6uU3_pl|jhx!5t2uaoosG0ZjSWzX-RT44^(B&+k`Wm2uiOBBl5K^p3F zAJRHB#8Lz=x@$}gXu0PlO0KKIQ8s1AqY+bhlw!c`z)wrzf$6Zt=V8m(>*-WHVuSRh zrX7|Y)FwTluc)-|c%<_Zq`m*h;ZHNk>?+4H_f1$ zFdbJ)f^Hf>@P9ahVKb@->mDg;#&SAuFHHZ7)=P~Q_yV1{) z5HwPO$PE5+5%^NrT`2aK#u)fibbq4MGTS-L?z{|EWx#!9z8-rz9&)upWLdCS7yuMe zW;lHe&&6Z@PJ1Yi9EJ%5Qm-qJ$uNXCy;lZ+6MvpsTr$5Ip7Wn{3#d7(glm3smkbfE z0>IxT^bV}`=V5VG^2b$n zy^J$WybdkU4A0vW&t{FZ+~3dga4*33^h~yNBl*qasOUu2&Sd{yHk{ni!r{>cNl_>sEmT=> zlK0vrDs6*m{(F|6OG9Jm=qYj^VEmM<<&Pb@1BHCsg)hU!yX##Dfxs_#ly61yF3|_1 z>xOM+sOkW-D4FT;nm)x}q)VdKv>yZOrEF^-7NahPvN^Cmi#^u1(cBRl)mWnSM5Cm} z3V)OinH(#e`hDuxlZ8@N%p%aPfGg(lk@bV3k&1`VqISzoL~m*O!3kNscW?yu7uN*K z0Q>HJ;v2C`?&?!=#+H*zB|~jEEbdO&`$VmqB&O3}Xp2BEyCOp8KI$r8z?D*<7rV_r zB4%2@Mb?&p00`9dv2g4YIZ}P!+HySOSoMRVjJ&nLT}nn7i5lbn1$(DiNtLumbZh;{ zbaq2k$F`0PqSL0q?!J;aXD}2lwiz6(w&p+?$3lOhGQbX8l9{qrY)9dQP2l74DRRY| zfOz(LwIlKFPrl#^9+#0%?{)g_Mi&ip zZp+AZSmk4C0)=&b?8lf+p5{9$6JJ^4f*;dttbzVj;#v@mr*f%*?Cx_Y)D!RH{B~l> zoD5ccfKS!=mHa)+SQoXY-mzK{B0!|!65II{s=|gU79v@a8*2Wqpr)SI>9rIFcyW}h z*8$B0>>);EvLH?bAUsO+=xhdxLaOw*NHI)5NmaH={Ii~_J?ro)*h_C3G5&yYfo@wc zyS}Pxdj=BW==4A%wL-+|?`uM&)2-2ZtjE4wKlSr%U0ZshJua#!-GZ#1?58xvqGJpE z^ny{Dab^IxMLfJ3QFFXPe2cVk2xS%4@Mn{c6VL+BQWBjMo#kA?FT=9M*6}*fQvi?n zF2@CejX$|R;TY9a8G(^BG9F`w`}V(>s`_y`o=^#8l1ZQxm32}4O`G4(lxJw?&K`Sb zt83c~s$lo-h)citMs}9ookv=xWZH#A!-M9IDY*%tx>DqGtSy7KRP22leBiS6I0UU{iPG*BvZ2q% zMD3a)cCBj%H-{%Px<)g>CuaT)a`A*A_Q=)At>w)YSAEEnVlIaY+iFu*+m=M|*5HZX z_Qc~!waHnk^M#dTrDo%ZN^V^2^$Hoz(F3nxx+oraBqNRHr_LjW@B3R@2U~h!?Lb}r z8{2;?t)WsBQWcTQhyY??Xc~!-VOuex2L^n(NZaiz)&M`ourZ zh_xR_Tpa9&FW4Uq1H8Y8wsk)+50r&<2tN^r%NfCULI`yq4Ceazz{E%7#OuBa8H~Zr z`E6QY7RS2uYP|@nyL%a5lQN=vm#d zdrGdXzdgwg?L31pNcNYw?seQ*T0#R%=pk+NXz_d6J2QHGI33T!!{wBgb2rh)S)ZDT zGA3=ad4$dzPu_wy?HWe9ScUN3TkTf%XK|(oIwBbp&6ke&4VcU4nHUg*6Uso58y2=?J2~Un5^S>;Koc&l@kL11LleEzsy?+aSfgu{hh1R z>*Y=Y`97Ov1*F7u<>32eBp?zEe#XAhEfqY`E_9Kk)g(Cf^mwy6j>$fcxdXqS&r(vN zQ;4P4OeXedjOZv%i6D{ss6rLedEZys{S;@0$Ap%J>w;H~4O)(wufjni5TbbRR~)eQ zY8jX212Y(t1FxZ0r}@!$#g>=S{0}3`1CAMg#K#5n+s>q7GoM3g60z7B(Q_l?E2SDs zuhuOk*#qLdACj+XEv3%i-|bd+Z3?>^IUR3w@iQ+elDS_Rfc7RbDPu!+R)!xroNNTD z=cgQGNfhm05(WlP43TrZ-hnR%be&v`=?hz9qGo^ zHPxq~5L0oH>+-NNys*oeE1lur<#g95s`y(ST@~o8R9|?> z!{2*c9ST3PHPx+n?I#gV2vt1o!v-HdH`gzGv#rx&Vokn8;0*ChtoB-07#)H)e zWWt6fEHu{IQAuYe;K`{r82I5C#jgrqaeBO8;AgnjMZzrzD#G=spO3Y0nRay%sFT7& zU4B|nJ^%d6`z_EiVloX{7MVAe6YUZDJ z<8qAMS)J5nx=(bCjxNuaEap#Kjtm!+E#Ef-U=^#Lfpox_U{R zUy~=F%`pT2?choY>Xrrfqk38dGLTb>l+Ju)o9A#7yi>V(k(BM{aX)ADc zO3mzijnQs+UmRP)NlbBrn7Ir;;bQ3aDsgHeur{BW3Mzl4x*e<(!{$fZL}BbeuExyB zlH(ClxZ0{GhY~&^ofztES+5F)zoZ!E5Y~@@g55|pKN^T?7(Uo{Pitc9#duahurgx>Z7Zw`R>e+0t>OF_F*d-R z`L2E)sa4V1OEZKyPfZu(p^CtznaW2Hu_8H)_U-b_%Lhtfht;R`;Y>&X3|eDq^l%*) zR-N7Le{uXPCF+rqyWw{gZadpM6~4GX?TQFG3Q4+sPt_WFp44lo ze6%byGBx5cafAj%tZ1ylxO~ljr{>#M%DYfSn(&p$e z&bP+Y7dY`W=WwgOGK&a%|DkLc(_J9C2Zp< zXbmYgr1~je89uK+AG$TT9wu#U2AmX!l?w}co+sI9Wggr2k5?S%HjuNY(pI9hwro2z zgp1Biet8}lAMjI8*fJKoGM1P&6UZH#NdBQm3d+7{k~)4W4Goc4Lsn9w-ts@BgZ^@P z6*MVEJF*W_?^=`X%isqVJZXki~(GHcnKmn2%PGhYIYA&I*HHJ@=~ zSu5`VeHS)(j(Y3egFb>lqsL0Er^d_&_()iGT7@^Pd~z-e5jflFoVpS0+@V!zDWXeZ z5uD24QJym7`$<*vZMvjxTOn&4pWw5#Lg|rYO`K2VLE(}%gQ@tB3Y)hdKo-Z&|?48_%jW$=Y{7Y7DpZxAxd_;Zjmy{^-{Qd8z=24!UZ+8CWYb`mMF(YED zHY`sy32U`^e^>eSX^u_c8LR_jwQ^$=28P@-ewz zm#nbg&$aLxY8sgNLj8^>RGTMt+27JER&btsao1DBsN*nn*N6@&yn@HGs@Z0Y;tSvD zJLCs{lbi+`8Cx2VG2n6MKoD}gSgS_}HTd3j_swD((Kybw((rw)11PcCHv{#pbI>6n z3UKL>9g?LXQ>b``zjnuMaL;s{`wxwL$jZA1*Ks$6c0%{v>@Lm-Pvsbl4oE$wuG0B1a$@Jra}g z;%8Q-X#w1dN(L1?4bVSWpVZx@49Wv3?0MJmm{+4 zs8<&NKlPXEun#4b{2R55t4Y6%JB<-9d;>I$G3)c2%(--5oIaCxVI%!zM|aEkl4!PX zhx`!$7HF45L$U2j9}h>X@escy3fwDS-iMI{9=%(Oi1j_FjrJ9c`0zcIISJ$W9x2`n zg_*mWPDy~K?`@2Mrh`EgKwY23f~^gpzIC$5l|(ZRY}|KT(&o9Sa(tH4o*moA0d#cg zMurT@*961&4a5(@=R^w^GP&ri5`3DC@E-hJh*V z0p7OSKW$enz5jLx=dXo*i&f6g9UZ-I@1~!fH+I!dKlWX-vn^MgVjuv@(dhkcxS0}2 zwXP>34Qs>lpT5R3AZaSC{o^G80?lyE_pE5yzKYBdHp}~aDN+Hzm)Fk!egJ%*UgY4% zXEMC1FXR$KJ=nu^=Zt1~kyA!XKp))a^qng1MQ7X^d~Ag>lmC3dFS1+!p5EL6XQxE% z(D!XMiG!py-yG>qTX#UksJUg!*>LoswG3Vg-4-^yG-EC=gz_mU2r;cDt zSF$S^0E8&0pUZtG(tO{#ncpjXKgNDH&wrYhU0uqx+sNH8@)u}<#BsPvi zNXbbg-1vA_qnzFsyp_xF(S|%Z^b(M;#Ch%H<}09lXNimSJ3u~$nu0WROA1l~da~Hw z`J+inEB>bN0e1dT+h283I+m^7Iw`?(xw9aD@9y|5*D7GLww^H3=oR@RLha(DBPj|X z5Sv=#ysQkA`g^Ua55*t?KzkOk_m|jlTUepn(I`oCc3Hu4RFHQUy>P}T5>wA6M}kH> zY1xBE+_5w`rK{L2gvJ{9448+(IzCuTFa$0 zHl`zh2b_du-7ma=yA-Wfy7%{uH-6s)x$gNPD}h2&Si4`>7EP8504&i`D|JX`*~vz* z*c<=6*-E-aDr8TrXQdlmnMmj9*t95pbG*TT@hSdDtw} zbqtm7pPFX(gDJycgzN#X&}Z$o6%G-^YYZ{I7GLM}Mx)g_r{zd;6g3n>4GmP2HG8XI z96&?`6WS&R=;FM38cW>f4UB(ZMq~ffS(0w;k9&C^RHB2}`v>_r&CL_6?*T;J>BY$F zifq3imV}0ky&E<_l&UU*D263;e)Y|C-L?nq01B_b{c~# z0POr~z01U#^w>Gl!ZcUp{^D-V6UEkbQn41L%ifjaAU7GUxG`=EtSer?p10ghKe#ye z6}?k1&(F*$NVVdlq^&E7=LUeLjz!9*)4R!Dtqs# zR-5h@KYoTxe%ny0lKzD7H()o_wc8_>Deq#)2fp$O1ZThRQ?W|gr-R=8XSPw~<70>! z9x&ij%-$jH3>Futc&+E(D8?n)^gw=*Q3fMp0}@sBGTJVnCa#L6-8DupS@f^A_hWpvq(U2; zVaOKpv=4AF;H{9y&m^}5aRe$R0Y`#mYf41rNMk;|11P>^5zCLS4|23A2{gjd4Hmyu zB)MlV1`_s~K?4w|)W7fjooJLL{Iq%n2 zJEZfdq2762%O5s-I_RW=(f~pROqAh~Du<4w8qty%8cvIu z1YYo8Ye!vHg{|A?C=AeypBVwRwswmcM_65**)xZ3vO8`$prL zpq|p{RoJN+K!uI=?*@5s&=Le)#$ptQ`KWuI)?X)J_kq~a+$|aYrO%Im>$k#M5`0?S zFs=-uI^1>1s{6@(IYQ0n`#Zh0fV9(@UB@hM#=E;=sczWhJZZaHnIVo8C7@<~sPdYs zND$e@ytCKuy}r>ReMnr7*@9k+`-#+yxHE&7D?S7~Ard>OQTRmtq?rmxT2>#Ri7f;CqV&7ANx z4U1^ViLB$Sn3)n@+3KY?T1hnV2x1eb_6?UA7M2jv5}mgl-f%n5Ydc2VR6I( zp)>UiRm)n<7Vqsag4j@v%U)>cyyVhq7K=zE_YLW{NJV#);`U7KI9l@4{>jqgg0p+$ zC|YGX7HSw7D**i-aP8h3dETTT%G9&5Mr>S}?zs3m1d!??SMM5U*Lr}XQ3GLc31 zij{wt&5FPt0-OK#PQ9B{T-bLOoSL%g&K8wAqoj#Fr^bh!>&)=gcDo(h8k|ND!h_UF| zY^}(!93vL3a=X=Dv5+E`1fd@1mSJMJ9J1<^5(7{{)W(%Zq9c}~;%Vye?#C&_`{=sn zym*(&Z8QG#sC(Of{xJC?pcAF2gJwnx`bM(iC30faYzS`}pnrR4dwMs^Dp{bA)wBvL z$EbeVPDp0}Y;r(tv{+xxaaRjGF)yhfo39KjWeQ%)c{(PrAWuuwp#g!38;=jWa1hoa z`SvN%!;03^dX8(ikm(KZaUk`HxxWkf5A}`hwj8_ymW0^p)Q?(c{6X$Mk#R+ZV1oH@ zEkHywLS?)p>pg5NNa)|z-?nWszhAPRKist5g)4rBVrQ3f=B8OpAetaxmm}TX-7xZq zTEB+y0zVqp{|(kLz>z;|Y-DE79zF#rKQTu#10ga1&>(5*>Pw^UzsYp2)Wt#mc*|~i zMakyxA4)y35sa zQu}zCn4u*$MyC2Q$2xrmrkj4X6C!Glwv9Qas>Qc(j6AG(!JWb#n$^YrUaU# z)oelUqw(IpD`%P-;E#m*$w{4@%8>4G!<%$WzA%dTMssUBOi?qtOOr=Zsz7P|nfy}eJP&}+nJq8i$HpJMAk@Y({%d2W3OHtmF@Ofgte{UP^x_IPl& ziwWu2WHjI6M_&+s^@Ahb-7RzGQU8j3(Q$ z>wbu^n>_0aCr}1TGRD@lyi-5Q{_qZo~UN^1)U3Rg0`BpEXQDw7WGO-i~Vy^=q=^CPH=Wn;JcRIZY*D6UG};z zXny>|1bSeH@C79ZP-quUWm%<>BDIPKt~_7>EB$L4JTON(G#bwfN7zP$nO+%05ex2q z2NQPMyj^3)2G!nkBFQ+n*XkNUh&2*$a5S45_APr&F}wO^#V+8ci;Wrxo(hL{n9PEr ziL*;MrBgbpie~y!uAA`r3-dq{I%qeewO$zeip`qKir|{9NLSO!9W>`=!53$R6D#Mz z&&O(%Wf?qp6$P_f6SI`J7QR+=nK-J_^aw;h7P&D!$*Y^PN(@Gk4SUI-&K9|DE`Ddr zJ5tqEI$?xSvN%M%(p=70$-x^4Vj>fc-C#X_EVcm>dS*fq12ZMI`GZF?gAye=P0lW| z4IyjQ>=GopCM#ZR)e{DfQKoZNh(Hcs1W_i!nd<39w(rhx_j8(b@q0B=1Cp_)*mekb z+%JZgC*1-T>Iv(zC(uyVbS(BCPl&lO)bEYsLTnTr6VR{$^x=!nK?z4=xk|&-7cKrj zArq-FTa436N7@0K_<%I7Mlo*#(B#N}dZ+t2fl=TSZ0!Z^;T?Rd|jLjul6i0Xs$hA4hyL9SwAdHvd$FRpyAf zyz9_xR*vM~cbkDFMHSm-{fGL+R1;~O+Sb$T1{Y#!C|PsfnO&u(FD%b4$a_+4QGZpK zim6{w6AEw~baB0mDQv94W0ma8*7f=~eN=3{Rie)KNB|H`8wv`{Qk#1 zdI8Q~c-(+TY88R;i5CF(HQUp9an`+5^|Vc^YbI1m$?)NKFe_lfPHZKvt<9CYoSN}? zohp30*7Djc-!z9;O>>p6?-DC%|SH?qgm8;1|i=dOcB0{D-QmQRc6 zg!D^M4|D(NhW6!>cI;X^^_@(kuJo2@IV1KE6}vP+#XPmhTjAb8`c6Zk7d3k22ty;z zg~ovp2IgT~=&alN&7h~R(p7251yqWeQoHq<*H3HI;zEbP_bNdIsQ8W^;N>}=C`VdM zCQAv?JADw%U4pv>^btm>a3<__kmz7A3-aOC0cO zAIGPA<%*2yGZiGW$VA+QVVo>4v^S}AH94tE@NAhL=-Mhcl-4Zbn{FKlA-19 zH6|>q0YD9XqTKVnni9O9+iHLodt{WmLTa5)2d7GlrpmmR&>;{^S%Sv&lhvK#(lAwLn1Uwy6+2miwer*TeCEgPp}g-FHH@NGLo zdD8=C{%ETV%t)Z?f`2jH{iT4gN6Y8C+2eaX0O5BGcy1k~!$J`5E->l_{kw#GDcZ1vPzHBxMYiZS!`Z zUqsKSRb@l(=J1E!G-jnRycSgFv48cniNRXwYg~@*oYG;L)d-@Z zC3jAC<+pXrvTLwS22rk6uhD}K(xi)?osbsfuW?37OV#j3CuC1_;AM)*{+a~lRt|#s2L!1Ll zgrR^}Rs317ZrWRHE~e7)@7!rf$mx_=F@k!sjU3*kwO7z2mFgEYSJ!khOc+Y+v;_IEnxODKXe=9RcL!^`Au4ypV8Gp~6UyK-vr^*5@5-(BDwzMS%Tp8s98xxz zPM;3?8kQEAnUJ*GYOkT~#hUX32PT-tZ};uKfzjT`n4bwB*4w2;6&DqIL}Q8)h~~5H z62)?MZYeq36D6PAAmTa=>Oth#;O_$7Ae1gt5f?2%g^9{IFFLuI_ECB`Q~jBEvR%S# zPFrPr3CP%zQ@lnMDZfz~a)bMsJ!EVx+V)kZkFBfKwNzf5V*r=F3c_AJ?yg-pA*R-7 zRaYbL*!?GN0-g!S_QHI#v)PUIVXq;sb`5SWr{rp?SbzvB#}DLus{^vc(R5LWCa;g+ zR5yU`Ip?>d2ZWM8Z`0eyMAWBU+1N}Dmitu0Owa*gWrb?Y-}z17jmd0i_FEec_RZo zpREZBRRdhyy$OR*A1WM#1tbC8TAQK{de(WDaoMNeyt4bK%vh z@Z$CfWj{T&UHpnjz3A)$Mp~5o{55_U>2pdotRN@t=p`K=TO!hakjLp!SGE7nYoIPd z=xWUu3(Rfd$~wXySU49Fla^C;P4iy@Ia1&5*9pJoCs}dNr`c5Nk6-P4%_;kW!T))^ zZF~2P2@~`PAHa^}+B8?XLVo_He&eY6MCKbKR-i*X&Zu~omPy?i)YK87`O zKv0>diNe3+MVPRkO=5CA7}7cV%oB2nfm6PATs^4|dkeGNZC(z%Yq+DKv zEO~xW#npY8kVGl){^%x8frCgA2vTJ8-~7e(eD;Y|S#d^hz6)aVG-q};BX{yy3LIky z#*>ocPHs|`3H5C_eIvUdLcfn@n+Hyve0II{Q94Pxn*)((KUZ|`>7$IM|?V*b}PeT~Z2VdVC+(C%I+P66g1PBVMC+DX!gZz+vRv?x-c<}G&Og= zTBn-rM9uCZexdf1TsUuWuXbed#-QVR<#F;@jpkYL8hid^S<-qQ}x2S;rHr-qh# z^UF@+0VLP%+l1)sEawM7qZc`iD=*@D3f5ZP8bX~yu%QRJLwgBaB&g{`8u9#hLNXG7 zKL={V?yDwnhfAq$*5(UJDm44`?cbH%ZQ%T2&L>;XmHFEnZXg6Zw`w*M%s|>+XuRFH z&vJyj5uMF2M5RV8k8)UXM;MdI&d^Y`6uRFO##${P(4s;vK!RyPWI`jar=k)X3$=6-Y9}|00BI zp6$3F-==9*__WHNfo~rSmn!V8D$Vd4Orvil8$YG;Qt%eIuX=&Q%<;E%8D zs3V4yq;lKLqjhU!Hm_45YxhG(Q4oqY8(S1LQ;2aXsjWm}YE#`!RjcHy`#+BEiXHHodl)xI zkAGI8f*AAwwm|!s<91|-kB00|)JSd04wh6l^$BFCKwzZaU27<}pOZ(0);OJ1uxVy5 zmOuInaZm?0Lw`Y4zJ=}!7JXXMmn+Q+9~SzO(Z zU&pgE_w1@mJ!s|Y?qP*eU3CnrwO_~&|BmX>Ps^pRg4H>2)3^NlB5Q~R5%`lVsLAy< z?nf}w>$*v~#lF#+iy1zbenlc-0E`W-INV|@8gcl^vm#15IW zU4c-F2tQ(KnT2a}s<4D3mm=m2fv;$wzyDl6ln-bty4N^e^dFPxwL5(*`n^ za^29Wdb0X){=a9Fh2M)3Kkh{KihAGo%gs+fUy~4se9Fde#&47c9#s%}_&AJ*42&X( zEvZ<+v^RWoJtkY|8KW!UVyNAMp|3PiaMg-jQtO1MF&^xsS%*Y>ninfqKu!ghBE5zq z3T4V`*p6nFX%FZk|HxEiv{-|^LDWs96T63XF04?S-&_59McIFAZ+hth*Rdr^ePm#8 zEzN-2tW--w0-G5#DJ~mV5vw=Mel{n62~Vt+yP9Ap?;=WC1+5&g=-Jf8;uCa61wZ*3 zUm0$(vGbHKePUm6_B=)veJw>GjFuV6xNoSiBaka?OilS=7y-Ck9vi^$eEipafP~*L{PagpmSk zYjAunQOx**eWQfaf2LOxkx@i7U=C;*(Y_P6V$T)+9q~GKh#IXTjt-!5L^Wn6OEcv&v8)0@Ub%&i6UAHb=f!2DI+zfr(kQQ@pg zZYF7!27bK!w5kg`IdW(uw+gI}No*t2w!vT9*Zf&p|3rf=%O58=>J_r*+;#l&WIo1l zGgO+MBhRcw(`z%8P$pCiwU(I2jqztmsa5z_h94Ca?q=_5Hn?@!c{2^~CeO7bXZ72X zJD%TJ-blB5Xpzz)QdQEMt1V;`8Flf&x-c?Jn^L~#d1mhWnnL8b=IW|~$KN2<%Wj{9 zRhq^o_eGD*nDWcUI+XkRey&cbIH%H8x}?JWtmKj0(O3Vw@=9w>&3B7;0miK}9gkz) z!J_;loLw^#>y+n#nceF6)k)WM`KrTzW!csj$%K(dyvF9|9bGq=`hB#L{v9RUx&qlJ zZ5hI=76W=uV8CvsE-6|TjjAA+X4+6kUAx-!rdBXf*zc9`kAGJ;KW+p_-=P
(=B=trifenm;SA{OD*L|^pqEt|@>DM~9bSHm4 zX_Uvv+~g${@GKNxO`B=iwv7W4?U%Eu+mdFLz^;l6Cw~Xa+F%0mYq7K(Dq=gY^6T}L z{C%FM`kMk8mxLjg3XaVpq6#C5VCO|dlL|SSR-^|fCDtZ-41Db-U8Vz#%rDpsmB8nO z{_-`q;C<)zRt}%=e3Cg+YbD)~_>@YRe&bKNydH`_9X6t|wHMtTj4MF_IMOchl;qN5 zZZGE#|C8~C2&TW-x@-+dQ^h0Kchc5?x6PvFn3CPE|J1|q5>HDwr`*iq?d@NT#76St z9mSnFHFlhs^)Vp+GZYVa@(O{x54Qr^4t^KQK7Tn~P5MeQH?8oct}(VX;qnK@4A#!W z`KE=$_!F<-Tn3r9a;mCzejADUvSkUuL0D~2^82*&89+||+&Kw34J z#9)Sf2qrzGG?WRUpRl#Ax^$y4NP@0_e25SQjS{IdT}Nsd3hdBF%Uw1kFAUXfjAlZ8+MlG zg<=7%`V_e-8-!*(JHE+_6XI{A6P<(CpDNIs$_s<0hQ5ggI^+y&ho{L?Y($l_-_Au( zonKoye^f?_$%+(ul>05W9nT#pcte5$Ku?6P58%t^ny0DTZxrY#g}t{6J9#_Jy$5O9 za16Y6Y)7J7r=L)Srg`Iky)!iY>FqOr(hj~)^R>598HnZwd0FYiuw4rnoPn+3mZjhu zp>exhFRPH@=#{1Ri?(Q>qO)Vqt&%%l=)Y}G8?La>g(NvnDgK6a-zE$q* z#h19i0zIB-gGA7Q`VCj9jD+N#SopCTM)or|{5uW*t_wFi83fj~h%#T*y~_XeMMiVu zGO92~o)(u`27HeR1g^iT6EQ{r;>wUGS0)DdiMb~b)E)g&uvs;|&G!v5vwi3PodsQ% za)*$%&*bdn;mQ$#oLIylwEnVtw+yCW2R<`arty417I6;m}K^?$E4Yl}5A zIVdWY$&Rp`7eyBz*CyO#1NpMTNi zUeki*%~6Ld!Y2gmFW+vdB$SyB*Sw|9YnNQGR=!00NPgTj4@!Bdn=>3Ub=atTqi5?W zr}R96Ij&_vS*8E9+Niwmdj<(Gdmb@p$9PCHe5dQ#b-&CO2i{*XqQ3ReH}aN7nxG6h z6&>fRfez>MnCizV?#JzbYe!rH6s!z6VXI8t+7mYe}{L|8`CLOj1NCnc{CA72(dYbcRwjrlk zLC(u0%UX2s} z?l=t!J~)7C?I8-*V*rUuwE3={*Q=0d@xZg^*B+!9!HB9unWepi=)X4-X3Fdr5hi{} zyQ?4RYHnnz#g&d?k7*#i_}u&(56S>55(tCtP34m2wq zXX76KPFLSy^xu%fxC=$S{Th*??w7PEiEKCvl1U00S!&n53bN!9A@wW1In40In>!U%;Q2rZ8XWOozRii7s8|BfwfLK4WOek6J6n9aB(`_h7DaJS`3X!WJ+ zIsgph6nW%mg~#aFExqD9dI)BYzs0yeKVdQ?A7z*@=R%KI%` zsq0&74Y&gY0#+*aI~E08mki5TxFHygs9zupdpi!roICl+-!HR&==qwr6=acNO4Y#> zH>z4U!W4xKP-mliLR&*qv6pEr|8J!=?BYY$+ zjl06PSITYu6tsL-e?H0|4>S<*$(kh>W=7zLUwIVcl7_IKA|arCn|r#HvoL%}5rVlV6y8-Cl{}CG3;CSb}aEI6UN} znkZ25VQGezfc4#fS#wF@z6t5;e1E9q6qg>pb2=mUCu#9;-binquNuhS&JwExJ7v*GACXQp4k-0Kw`V0i3kVkR*uz$ysA; z6`1YoOJ)<+Dd6?+t$V5~X<04nm5*`?)DIssmk|Ey*<8@^2a!&Jh_b;kt|BLlG!bD* zGl^F{9~V*QG-(QaxYP;~hX>F-1+BlR7$5Eq<_ze1uzgs`$n<*0M^qQIT5}#8s|iwz zHsk?4CaYX@LM6Q?b$bnO0k4><#2cZ>3|q`ZrlKUnuB~J2Y-fDzpF^+vnjeR$MfDA= z^`5#Oi)PK(mg%Eu(2ATLS!!flS|M*$?rzhQBr5(aY!CVdoEHr#Epb%r0I|aY6ZUf4 zqSX8{im1lkMpWe^lfAW6t+YuoJY&$2otFti{Os%4Ly@cAa;PZ5E9$x5*>=IAR_dz# zs|=NI#_Ln~+|58jR#?LV*z+-d&C@PQY~W2ZE@$KPwjL}w0H-q^hoQb5c%8p(?!yYn%|B7vdrWx2p1M3smXu*h6$C2T=@_uzNsba>G`+Ie+uTe++#wbA%B!?u-V zo<7t>^$M(v(_+sOxehG`F%Zy{spW2bNa{WRCuu(f<$EdazMW!&6$Ov^Z6H{$4&56p zVY!i@;Sd{N(>LbL9g%gx1s+4L1y$vZ21Kb?9f=0}Wob}VjlV_a>v6He!^K~I*{Gxl zwESeA?d@?=Tb<**l5L0pe5b6Au|N)V{KPP7O>@6Z)N~t5HD~ehBJ6)8^*sIWP}q*J z>u!Cw-+**MK^Xa8jSzzFS+8v4;QmCpxWZJ)uDmfJfYO;W4NmzJo{SVVk4vaVYS9JH ziR-l_2wNareJ-uzVrITiH8~nit6p;3dFUUGK)|5Obe2p7SI8$BC3PuaEWgN*<9+40@fFY(#_82n{{i2WFR&e@K+t z!ji5$XTWxqiXY2l13~E8ht|`!9YSe!_=Ej|N5`k;I1%6TW`|}!Vvq4={)dC6Ck_Hs zIKYY7pj|DE_Nyq3QuR9@mf(pDzXDQ8uK{^5TpD(1m}$VfZg= z3n%5e55KW^lJu;aBYIJc_&tKZwi~ukfuuFk9dcoZW3U#~z2jt^RD`v!ERA#;|9N0ElKOZ2l$;LLyx4(phMqPVZ9Z{PCx( zddcM`Z0tLJ3HKbso><2g@v*cf6Acu^{Tj^)G(YX13<+J?ihnL}GT!dpan!myLu13( zG@(^}U7!sQ7`ZXURDd9p3#`EGc^`*qIj$_! z`&(_>>UYH|u2xOb=Ctjv>(_zjBcszN25G#y! zpH}-UJ^P>EK2chR-DGcm^eRhQ8>euO zPX!w;7N^%RRVwEqH3Vrh6;>ANYt`z%`s(J|v{z}DwPg1;AyJqP%o|O-V}MQP@Ym83@oBijbW#5AqcRVZn=SZn`wU@W#&1Gq2oFe+Dh{x?o&L5~ayqkm)L>3T@ z-1hehQ6Y}={EOKy;`@BW>eII+Mf za6*~E+syzCpkJy{40!&zUyh9#C%}=N$qc(-dQ^YYevLzJ>805E`5Xs;B_#gTKGMQ8 zt0^_srEdL(ujjLtIy|blRjj%BEZOe;_x9s)5V4|fe9Ip0=Pp!2ocNGDclcYd0R(hX zzUX?xdb6+_WT_{!5tJ)5QD?6=K;8f_@@cHHMN*nRBDoSx=St>l-rFp`tyA^A^XT=1 zc&-_#mk-ZkOwp1(9_;a$zn!p;YK(o>z!!O^Gg{5M@_k?SwNs$p`vp`R@T)MaZ8=Nf z^bCH$G1HSPfx%5*sd&us3J2mC^oT|BaF|j*jkv1ge(nOE4%N)d8iTxfny1U7@$6Ta zuMFFF2j854{Km<#&V^O5Lttc1a|q;esyR520x(&Qc4D*ajEDhII)1vUrxw>7ZjwrJ zEzgJ0NhMbQ{hWaPe;3Wm+Dj;+{*?W30z4^9Km$R@PGp1$4%-_|tA`&F+|n9m5WnhF z5=7N%u6$z-c_d~4FS#%Y1mQH_xES7*8k>X;!VU{K8H8JpR>)?*aO}l44X7g0gK;){ zI^BqGoCG8q&+sMXaNbc>XlrigSo>wqba|NzaQ85-XqT3eO}kB4eG%$RPMb~&^I$tJ zb91Et&j-Aa@uzdE&9@SMdxvkxQ;qSuJq9stZra8W;uRX4o`jFZa$tOC(&-A11w0Mi z7nH@*Ja{>eSTrpXsDD~TRPPG9%|B?#Wb@)2kHP_)^;Gj~rJsT#w5QPaaE-a&V%>c1eQ2sB49FkE7%izfNJB zA(CqT@-7+VkcKB4OtZka(}s~%$XdifDyjG!s%>Ve_5}T)0eG%~8uo*RbG$%u?Hfh% zcxgdRQz|m1_Uyar|5H*?>G!7?P$%12HQOxwtZY)o{@D(ttZuLuE6D`*Q5F<~tlC_i zAA-&XJ%e}q7N%T2;K$TCGYurFVIa(zK^-bDU12e=6$QNyKW$Hx=7StV${S>Fq}=sX zz~!!&2pyreoy3=irnRp??RXAu+%HeFL8BN~%s=0MM`KUF(zUiJS>Q9@&6a<&Vdp>k z*nlh}{#MtVZf zG1YOavAJC5nff{HT^jnE1>DRbW^bCSbDqAF6p5fda+#mKr?r|l}8pSkrx&qZ>DMV5B~O_MdF;U>v&R|Z6hqv zIP^$c#I>f8XYv^XY|)m;S}hxTUk zMtY5xghCO0C{B1$X%+$|{5ZbaM1ZXEUA4je_JE`ND|7@@_Ka(fFQDkxoCHTi89|_n zGW@@U42(oo;ZiR!It*0b`>vh0KMkxeq(w?KR`eqKpIa!WBE2h{#f6?j??D|lIhZY3 zsIP5=wDk`1Pus;tlRobom4WWvQ0QT5Uh5i7+^h3Xy*^KLNl6P`wp-xB94FG{ZT zH;T94(pS{o;i)4(pQNd=EQV7`Q+V}>sHcMK{zhCI!QGbWJsa;i-ka1gN6F*vkpB>) zm9sv&kWx=6@>iY(L{o1)M~shv>4`%MCQ7y%6CyHV9hqj8|H)EBYO~plTy2W`GtaVDP5rW=-^aR4Z!Npy+BKj5-; zIt2IFY{i?NxI$u)PXs$X!**|r0lpKn;#sK~{aJuI;zi?9Y5JvyeQFdDY_&(+JxJ&OUrP@@o<%ZkvaB^U+Z0!FdB`a}!n)?e!J#^OtnzwMD(Smy5RH33 zXv53*3U3A%@Fwo+)Hw|SZXI8KHw(F34g0>F{%_tNTo0mnnmcUmP0IvS5fwd9M9#;H z4y2Mt@}}*_3VR_{3=W9{=0+f{6V(6O_xF1`)|-k+St!`Z5?hMHO!G6jS6&@kb|qSI zx>@!hD)!KPw1#JY7c-HNP^H-QG)x}trRwRCg*?A|7vXX?%u*9hpComYjSBVq8dMmZ zOJWOQ(2Vh|e(Z3ob1SZEYI!4ZU~+~Z*0jp!>12!clLfuYD`@S77%8{ROK!W=^~Cpv z1$s@v(jXgmZ0o4MaCes~o)iWE1hb1uq=<>#o-AofZ3dtd5N)1t7&*noB`3HDvPnuV z6{DIiiX{B0AV$~tTjxiR3OWNqV3*GPt7bSlfUgxt?$R?~8ZWU&(+_ zhv$akDX_K9E{^G-Hv1exL*z2@!l6PsbDzn^OjCcKB<32s35h5+Osc1P%b-eOwyhMg z5~{^h;)O2i+5EZN9VL*fJ7@3T%EaJ$>x*)jhyqj@q1yr>B(L;K)?d^iM@cE)>qi=S zZcIRd2ZcQui&%0IwoC6)2pa!WP?lF;11R=v_!-0Dp`7#@-WplsdCs_viCw04msrA{ zVYc#}=Pbw6U+0VUs@k@Ks#6{hTWU(B$|gcmS_OKgO1lQNqjdvw)9<*bF#7qG*OGRx z1Otup^aPk?Ab+`b&iZ0V+Nr-e(GHbw*%)lB`weaRWmt0ofzL~c?&9{`REfVQ&fUs% z$}kIGbBo=3ZQ8;CLB`)?_Y2tQy8-Fx@`RZ7+PI)JOS0@$BNohloME?HevFlG~ zBiMpRcjHL6Gv$^1p5b?CxM{&N?bvO)p657TAijOsb6D?r)b$it14xf%n^4s$Wj9ju?`98>Q1uz|Z1u@&RX{t$AVx{Q%9!ryTs~vb^KQQd1@;moO z`A*cA@aRN%Sa;WPHm!5HNm1c!iWy+F(QjydqLO@H_0(5Xnlqd=UAPf+9JRKeV)>-@ zYVgWrNOwLq1?Ht8f2G?V1s1CV`;T+#@8JQ6L$0|{n8NI?rrhcU8#Fb8UOkbL*rYab z5t^P60upUM1-Df@!G^C@Y%48T{ zh+h?eoa=epO#WB;;(`)Co|raR>nW!;oyg629h72b#o+Ei`RrI96yPi84!g%obPvmPDe3X>g}? z0}(=j6BA@6L#sOnF%ySLBhbia&jyJq_;_UitJdm11a{lBppQu_Zo0VM&o0gdQ$bkhaTcZmwS=i_z_f8T{fG3F>PsZO}7JEJ3-jJRfA&1|$Q`W;9Z zfq>Fi!4?*9S~{)EY<|bvDSh|F_~dTFDNY0zgBpP?9EqF4IuenSb? zWBZ_oqiXmtx&2GS^i^P+@Sz&Uc_kQh0tvCT+N+?mjMvDvL@XC)&}q4Aj$;lum$s?I zv))mJUd3i%r#3YQB&<`dxR^AmwN675Amrc&RjzG3g}(`0v`Lqw@YjN{FCx3nGrEGq zVLr=!li5;bVBL5!9toJ2NL!BCqkNOGVCZwVmJzN5%uon+uP)jhJ`C=x!W;FD{+;d4 z$K*%MClDKS=MViv7t@hJe+*?bZ2v%f33jih3P?l1<>E6%-95ef=)g3w0*+BNqrxwb zyZbi-0#2kvWz#=7q}((TK&Ic6OW^c6v->8jAri?*i2<1KD2&8z@yFt*lNvf?T74R! zb8LOUuH+s;Q;0GWcl8r;kBgmyQ(~~l6G8y0HRpSgi+~xX)A1>3@DyGlM#&Lq-T`X-&ihG)m%EoI zPT7Y_2JX=;{}cK05}a_`Z&}XU^*l{kyO*OZ*gcBh$`Mam*h!=FGj5Wz5U{9rqB9F{ z0p`njP{>QdBL!^5A#b7lvR$>ae;#cX+A`$du7Yv%6>9`YLQCiS2mQ}>yPwNMUS1v* z9G^N*NTs6y-31fl(RVa=_tl*&epCFO4`n@nUJGH(WIUi2s@ZfbEFKA@2tOzIiU@K) z%{7(vdl0|2J)ZaXoz=}asdkU8=#0@_>Y421f}faDs_eW^qs{SCv9qSHZK^pv$M6v0 zO>MpFGUW-#*dSaQ&DNE3G-i5G>U7<^d0v~XVI$~+$icn_tG<$Dh(p%U19zf^_TW!J zGa4N1i?qqSkrD`?05+$k+uddAV6rdnt)I3)m=J_uxdWCW0=n2-L@*8(HJSwqAG6b7 zH=?LTU43Y;{Q4jMzQLqX6FU7tQYqWw0Jl~w))E23c!Bhh!2M)gvHS4GpwnZ2jSWNC zbNZ=-2Zk+?E03#O8jk42Wgh={u|ig4=pLJ%pyvkJZP62k36D=<0)30=+6u>6wZw`H z1o93X2gGEGbI8uCd!ISCk|%=B zV>1Vwyg`Wg3hGQ}NEL~6G;MiVp6;qLROCzRd!M5%}wm*<&tAaGyOA3iN1hWdyzm2d8f+L(MUhMNV{C83{e&?Ugq(Y2Ps$J z*zJwyy+ONrS=Y2qEj8r0hP_`n%(+y{Ei(X#xw}&l`8a3MzX5Qy11X5HWJuQ z+MX7;Z1-cfSHIajQLMjTU{Ga9eMh;f>37Q)k=(io)9;gV(0+j7_dtB!hf@fqTxM!y z)5gQFs}f8oPENlPxZ1tb8qoe;r zMjM4JU)~7pUzSC^F!vqc1Rn+vWS`hCFpCrjiVs4fl?gM7F%wTpw=eS8;b0>|yPYQ^ z7{`foCz}g-pWE0r#lgiwENMRTlF!n_Cu>-HFV+`CXJAN` z`YOwjygOxmB9t>`x8yYF8^I3d{ubyyRQwKf9p0e-mB#&(Are%iCc`TM!LzLXCzXlv z+;Wj9=MxqM!gk&x_?vFbEymI150q&)Q}WgQEybNWsz-@^`iJ}V&4*}ZL?+}w@q9#` zRZ`$-f9Yy^cI1ta`{TY6`O9X?rYh^qh~PDbuLiVfin8mAm07=XNAm4LH@xVss?XCZ ze8=0y6|Ki!g@bA#Iy?CIsIdy(W?Y#;-kiG@qM9mY3;u7|hC^m%4+2}M_49W&eG!vm2TK5dC-Da6vv$?wx^ zq`U7&&C?f+_e9pZAO6ZmUbLZ&v@|R*KKWjG|YXXk~GtH0S@rT`KS$PVa4MBD_ z-Zk3e-$|OypcO05mbX|bz*B9d64&yN=`(ErzR;0D7g)E7#w@cokZ&N&)LDu z@w6t=Yyp^96mE6aO5Q-oj5{jVS$p>#_w4NDaE5?^@AhI+Xoi7d2PKLcu!;0%~Z+L^!z?Q*}S)s?5$>5iKWmBd5&Edx=DehH2 zWNtJeuaI0!qUF+*MJtw<5j22dJYeJH+CBQ#qg{0Y0k$0XOdgj&wq`@#3*t=y4Dd2^d zodN|csj{1UkHJzKSZkff?Od^s=v$S7tZheW2nK`f@JtEk!f?xQT$!&&9gQJ>lx233no>bVJfFkWByu2ApNE#(h1J~x zI)bysdS%Hqxb^_O_vWw0ub@QVj*7a^K{*!pk#8x6>6>&e=bKjD*p)5TC-iDxmJ`zq@IH!`8L(o(0b! zZH&(%79F1L#*e*Aa_+JA?j5Odj5`cYuqAY$1{J!4S^D3-ZB~!lOX?I4CNf^)8-0dK zTT70Z8-9}_Ef<#j+UvAUo$NY5Y>shpTR>7bTQxV>D%eJSymc;*(&*7 z`;k?G2c5v2)f4CvRHP-* z{II5xSgclVY-G*uY7zbw!UYnN#ys%gek(-pymi#tle1O9y)WwS_EEtd=-q?Ld8yXr^)gt24>bNF^>WRWu-tepo(HW} z^)?yvsEHC4RFV-W@JK62l>BV^e!ix#>EtzhkW_OjX&d<5B+;^_4of=v-)V7%HW_W` z0vS%Kt}ciBTyFqr`U%3HyUmJ+cc+w(fgrE%pKk3$bHL7R)mST=x963r!R6HOP&U)! zKoN#*Qcui=D(8D28cu`WSTE!>LhOQoA3xyXWbU!QGf-(3mhxcARTa9?|0IR;>`KZVX9!v(}$=aRg^mH zR&6gY!jY=mEdKfEY;3y8G4`Eq_1X@t`oq*8C6UIuT{QR;XDJk=jn5_q+?ba}%E#PorhCd-jtQ zB>=aNbTm!w1z{pxh4;acL7Rmcny~dm257zhCi_o;00dpx<=m?|@Hv9_Rr+><3Xb-S z$kXToF_7~D0KprDrt`rceLnsDk&YAGNCxdI8|y%;VvSbpo@;&>gJu?apDb1{&tozO zvW1{46{CNBxex6ohE6P!FQ}8e+sjqO0qOU7iIMfAVwLLd@9=J|?t342PUIj6`gE}> zf-%t36%$cH?9B7-?hxy#MS0B`8h7gtE!mAvSJy8%|dW0My7iH#CRR2`rZtqbl%Lc z64*d zerlq4`W(u%Jn3a$V{Wez*&p2fxcb=jq^4Vy({6mSnWE&sgFh+;TAF{v&K3ttIUVOT zG*v7bm~3^f;I*g1g(O=oPA64+t-%a|(_`!v_brC3vih0Y64^+GZHmDxuQhj_E4t%D zSMV!vB11SYZbd#_V4Jf&3e_yqQ!b=vm0exyg7$JxN5Y5J6vyZ+IN9~7Xt9z{6Fo4r zp`Jt?@QZL+Zga{%pBh0cKk)GX<;v9v;#Na&Bzfv>EoXlF*Nn@Zke9z;w|S0?jKE`v5Ofd00%GUP$FSr{=1GY$nEB!BlfXJ@fu)-&TPX+#keA%7Mx#kA;=chm9mO~!w z^#OUtGGNA^OFF&Xq(gxY*EEQEx2u?vw0EQV4b<$%5ualj`sA(rP!jKcJr$kJ|5iwL zPDX@Ly?_K1Fr1TTdU?8Sx?5|l&l)vx%|-q8V>C>$>Xz#&m!wIrH^RQfdH!en*vpe$8Z6s#`}KTej_RV{%+(a9*PCQQFPR5G6)_v?~t# z%%w*dtmtZUM$L1Cg2kMn(rA5;#wLYC+=}^F+V52QuIu7Y^Nga9p$r>Y!q)`tm*#r< z?n=*7sSxKt<+&|-7Jx@!qT?p+o!+z5_usTp)l1Ghj@@RU&@#K|X7G1Zauj`nhZ#X}~(y z1SM1EgJ*(r;*p3FYb@gN{~!Y5u3t*uas><20}y{69vk_=C!iJ>_qOPO}7*1wiR_=Q3F7M4YQyDj$~`Cr^~@VMAnYE)W=1rJDtem%>5}n@0ta*dJC5V z&f`)t4-H%6^$P2?NeIHOT;%(#%boN@iM+3KRU>eKGZeaFp%g{+rZXJeI-ub(#(}g==PEoX=4x*iw)exO>P3@zo$FX*A&UwPeQxKL`&P zO^T{++Ge$g71Ae;#=gBi31@!xyo_5ZN)y?n*90GWX;b{-xtn?6*;7r>eht5Q`RUpp z6cXz@dT1K!SQ8zYmrRfuXLU1w1?qi!w5R%3UOl}0C8}*qn$ZpI%>(mMoH&Lk%`x>) zTLv58AOOT6M`#f4NwnehUL%w#qIako3t0ru@ddNMC$4H0vPhC~G?P_;ZLG z0O&77evTC%qJ94L7f^1v83@L1*?(X1TTZ{927aPiXv$t;{(ljF`8IuT!<|Vmdoye=afwlUvC=fFwRZ@@ z0t<_AaXa4L9Ja+2J*g%B6t{J`X*s<%7-8;BJvroUsZp>-wAeZRQqq`g4g~WLUYm$e!)GAqx9HfZTb+x5Tc>fiSvvqmB5B zkc{3aBb%l4`?L4%$GGD0444q7-sd5yo{gY65`E%f$VW)Vx}AOHW}I12Ys$qOzSm8v zoG+Py`H<@*B0#k-RT+_+<~KMKdixLuFrxphK75&Sl{i* zTF@ah^%4cdFbjW}dnmb`|KD|S1>{06)3k2fCmgKL&-|0I70Z$%FaJ$G#syIREakQ| z=s38lUlld;A!Lr`=1#|YCv)*7oCjusKVUiVq@{(2M z(^UlAD_>}Z)AOo~<4*o_&fl$<-g?8c5zcE{XpF%;f{{`z96&HgscJ6nL6`?P8U}>E zHZ%DAdK5hq2^PTMD!wafLwR^sg@PAgx zx32Ym&!`4IGcoGHs;^_4Lvz+vB#pC;^J!XGwH?QWy?a#M9vqN4AF#Qu0SB_?67_b? z%YP|A<;1Yjw*b+4*qPm1Lf`xl`N_mq7RT-6>x2+zpGi=XGc=ww@&hXBLWacOJIRr9 zUPfTg$?a~66`+<0pNTbU*}m1|KlyGY!s@+&5zKh_w~xc z%}~Z2h0z(FSWTT*I)z2#&?R(C(uZFwUo}NANn=PBSqd*wK4dd4V7!_E-?v{(%xsn4 zR%K7?-_ahI+`-KRPDNjO*5l8N-=ix|8u35XMP#Av1ZjG0eBs8_Tcuj>+)mldl7pmP zWnvJmLgpdwwKK8}rS*NyKDbr+L#@~49rn_`QZU+_X09hgql`}&e8NNszaaoxbHSc6 znaVxnMN*!SndT232y@_Z<cCis7&)rfnKuYO7FI|zbX)Fn$MMX2TH zf|`OtyvCRNPcJn3$amYVdRwNyPbsA}Usxayz>0C>z*E(E zP>He~X0=z>uBR5{`kBv_^D)HxyDmKbwj%yziUPN_kR6Q*d5gIB#U=#>pvXiTqz?dVF-d*oLbsqPrD!6G&z;)?M~Zxjl%;qaw^$6fa5ipqh2em zUB{N)mR8&OUNIB1VaCT{(ZU~$M5u7YnYCsNfbjuNHj0yR zbC-@fmDFVM`9wN&+l7LhftaPGEwjZ1s#*D%Ma%4qfny>FS#75X2_lh$B}e0K8Ag&D zm&|P937`M=zu%nAl&A-rd86xj_Cmkg$m1^AYT9PnICqXk@Gym#Gy#|Fzo3d8wM6rK zPunYR9|hNY+Q8tLi43T_`B{YQo~l@)q}?4^WZdK8C3b+B(`67<>+fv6QvHWnd7%d) zm}-Wf-Pl#P_t$~PIT-fn)Zzo!7dLRbSR>E-x%Zi1Xri}Jv@7_U(Dp~TU^&i!qUq3M zV?Q`21Sn(Vc!)K_*JMh5h6{{)0*7AYymYtRdM4P@y?sg2duW|oAL>}+wsjfK&Vs`U zADQUR@O1yyeILK0Gbp~-W7%zu^E&)+Fiq3{7WC%PO}EM z{T`JBFtnnA??Sl(H8l>HyBqv;8`=2RO58J6Ly&lb;qR!{7&YW^4~0?IX48F7Na$7V zB=8eR6=>gezu2vF95P?8LoMy$xU&!ZHMRt!qk6$`Cy)CyU^V{D;J^90Xu$YtI8vWtKX>c(aI~-F|W?QvUz3XS{{+E;a^m^=1oKRv`#13tDxgJ zY)4+jXc{2kq(!I1vKFnj_KNy2`HE}ifSu90-IXz(M2xgPHpZl=pmzeW#uIe(@`rzF zoy%h_FiFP~*Rm_kA|+xUGu~P$L55ddr^|AyxQt+WVd>(jc!J>cfE1X?qgBow{@e4L zG(u;Bxc>ID_)!m0*IWL*;n-^VHwG?EI)`$(ZBI9u0o&bnMlV6c&>SLovwI`C_0R<;o>F`dj40d*3xN3d+QO?8oc_;@g*Wi5DYTt}aynYd^w+$T8gzmOPbH!Cn64{ z;5{moa6#+7*bhyc9MI-J{=}eSWlNO^rYpGy7Aw)sT(GRO6pFLzttkm=?Ms~#Xz51Z z#0+CI-)JMAJ;6t<(oga8dT`(8TRf^;`^DyKuz-CbUw*JWTw>~Xc?t%0Q*}I0#JS)^NfA z?D_pFv%Anu9T_lEAJZ4{{0)vU)VsA3r8?in&NH-i%NM#%~zRK<6DRE@30ZI7N14-m0#Y?R&h zuv7;@dS~cA91x7Os+ahj<=VPk&Zl!ssC=;lC<5(QCu(2RsL#sP9WVw*YaUa*uR{iy zU0)P37OPFD(jF{Vd>-8)CHO~Kelpf>e+C4Oz2bERH%6+#Vir9xagNBaBCyD(W`Nv3 z^P{1=!>jY2DBJCRZ2Ja->^*V!4t$7V@nHLE)v+6V={*u!jbh_;sJJs(HV8`BZoYU- z=A-Ua7NSlFg+0ztOs?>7B>ll#2|*5c4?dQ%VC4~o zb2OY0CFZvSOPd^DiVb|7!XcGK82HP=hWfUaotV^Pl?yAIuG$u;eTfy0bUSAWN{isM!yAFNU z`f~66&xqrXBL38~;ZE1gp^HBg{{OQv3y6mZGBC?wx^d={oF}`vL?ijBqhk}8kVVaW z74~o}ahnF$B9bsz*QozSuYP$YOMhe$L!#@>Ig`ppp3QJ$=1sOWTGEt>t)t!1 zunTff445Uc3+SU$V6HnFz&XL2u7_bSca#If6p=@za|-lr5fCco$md4=`nhFIA>19y$zhoguqX`rirM^pSW2TTl;Bb zfzsGM6&}9E8=K`hwQ|lShVbF-zhG)B64TbKhw<(>@5ouQr9T-l$ZRm$kRy*26p|1D zMoH(>MFOk7+q)&$rB&xEAbrlW*^YCzrnSXAQ(L^AzG0E<@xwPwqLl8t*V+sKU_D#w zljPyP=JD_fn3k;Fc)ebV)!Sz~k$)RzA~%NC{L0$+H=AVVlN8=)j*~mqvGD9+>F`O- zAZCKRfzY4Z5FCJd}k(UVJ2x) zC{B+^_2#5lNBm8?3BS(vBjFRf-H+UBN&EK(V1DF80%@34Lk>iwKNss`gKMz)6RO5} zHi=Pa#2#~{x9b6}ZN%NcBhp>DX9;wj4L!t0`|Q`iJM}M~x5uP1a`WjhcdCe7_CEFZ zIMB$vSGl6lJpjpZdw=>t%zLJ~!=`TCg~6#2_%*pD*}80Sz#Lx_HUWs0$yvsaVb>&) zN5r3}=i}nnI0Cdn=SVHPZb~Q@+7D0>Kk4!Fw1bGaPgwc$owm?C@*Z~jr8vAH%Z$uA(NedVd{_%u1tXN$sM z%a#++?fdZuoU!#oa$xAxW1dZPKEWg{0te0W)FZCRIJ!Oi8yRsz)&-LTH#G9w3t9*d`o&I7SQ(^sEeg}DvFuG3PJ8o$dV%(TLJSp zC$kRjbgTb|BjJCtJYLK(UQnpE=?nmW1Hir2+AWFvr2~5z{Bnb9enK3b%NFEzq*K%! z+&B0{^s?tTC*=F@K2*R%=_HCPF-A596wgk6Ri3ule~kuerxsn z?f$KeIX7H!#oy-t017BpF&QMY3KqS#Grv%tNJ0~>V09VNu@NGwvYB8^CGJ=@OdxMbz7V;Mrw~wAZB~s^ z;4g57*umqJ=abn2+?>EyYaz}DsL2jQ-7g|G2@#WWeFhH*)E@y$u=kF?MPGH`0S8%L zTX*C|VvgHRkQnMuUK?w)RG{m>UD)bghrVn>324v0h86bR1R{!BRi4MZM6NiX{mjAw z)(fh&^7=#<7;e~G8{Dd}0=`1>Tk5|#*!gWt=4|}Hq_)GV-}Y}$oEP|G+nyL4X1j4X zQtN|fV9YMAjAxh+QKfoIbNVLEnGB@{iy>ogTOAkT)818z70*g8_inhwXO_(whig_b zPN$g3qd@$}rPasy*b=)L+c%rJ7Kner-1Mj0NeCk~FiC z#N=tqIV5F^hgxn`HVLP!_aR@Fj!g@JZSLsJVbG^gicPpc+unP2l-wb+Eh4c`6(+}$MGz$f)sue{@vM3dZ>TsDdwGL8&V&YH*EUTw z%mC(V^J_MlS|Z8@*=iwpcHfKPt43X79VZ)lw++0zSMO$uO;d&c z+#`aCPmrwaJy9{K5}%12PbDu&&u8-wG2mf}o;Rz7T36Nwi{1|oVAB_anHOVj{lB9R zt^feN9SX~y+pCSBV9R;>o69kd4}L&f8)uA)8&Z=Ush2KTfrIzu&fF6F7yti%JrQy+hdS=H^Lg-$&j{z~}f zV)0w-EwMR5iRN1p2@C@ifNELyM_glYno0&^W0`TP2|Ll$vvV{tIY0DVgZ_~2LhjeO zO?))`=e6C)8<-{XqR`QH({#*h7Eiq~nsu0M$>EO){j9eutNLuz+q9{Iy*M794l3xwyjXQYT>#K!LDi62`Ig8a>YhjG80NMZInqYIQn z{~WG3e(?aziaxOhh()sg6el2O6D~%!ee4zXK4IuOh5bJ!mrBF{C%nSS_B_V>I*!oTxtdkZPfHgDf9WqqRbzw|#iI(#1dw|#7X8Y`6QI~veY zu~ap@3Wl=(QFN67Q8iKY(T#M+64E6hC9rg-NOuTGcf*p>ozf*CEfNw^(%s#ugmlCA zzJIX0FXzt8jdRc83hP5PTl!wio$kSlKieij?CZu#QchYlDLksIK7ByQ<&m|`jip7%ltORtV;5-W zh6fHx3n^{CPX3X0@J%A!8PaT-q?QFfa-7(a;|-qsXj)56Q>x;b1-!ZKoeo(Ro?AH@ z(t7~kUgyeVl*a`;0CN2u-dq_s+f+5i!~A6xk<}Sz!Q7VHpx~D>EJ=Hvw7f$lByy(@ zAT7-v`e1D3hpG9>Na6!T$P_P`HyU&?zj_Yr5*^7G<&5I>{bwO`=U*=L0xacZ_etTd8jV#g2 zeDNQiP#nRt<=er(pM6!RbFD*D^-2JmoqvFOdphE#-+xAjNMUPfX*qz)^Fj{A z$noD1cOIB*1;+9;5*y{8uB?aqxbJzEP{T6EeK3_%c8f$7&TU7(T)eLXQX~SMoR~7x z1-w-0g*w5zpg;&hfp2nx@Okmv3=g7i8MWxlbL%t!HV(!SUw!1TCLX49DKhpfQ`lDb*<)Wx)BJIAvJF}5{r$g7Z|a{ zzc61#3+t&;Gv}?Bt|+FwqY3SQo7VBTMU%v1_{K(G#6{8+XuIfoSmn-=Aa1j+ntwKj}CxU9Dc3CWWpZr#R$&;h0~LVH&N?myN=g1wrJ@?XJQM zR*IjFTI3t9Hr9N|;X04clfu-owf>NcVPS<7h#b^9mZx#8TOAu6-Y`_xm0H7GKmG?@~QVWCWJ3%KpZ?3>UPPR zuL8AO+edLjw%c6O6Kqua4B;_m%-V1MlN zVNAko1G%sA*T1~UavgEaaX*S_8T14h7~MFi z_1CrupjZ}cT$90q{8j%4VLysu5PnN!(!bZ;s4nO~=jv5dHw`8*Oc?$i-@k?-aH0U6 z#L)|p=yi$GF6zIUNI!rYrC&yb&zm9WAvi(|{da9Y<){Shxxda%sLhSpgIfR)r+H1r zLqVV7>t>**G<5Z)h5#Iw*3!7gOIF~E#8*5ER&kanh1AGR`kxA5t4^d6yK}6XR3Q^8 zhAK<$2NQgKR?yKW=wr;>8Q2(+d4PogToEe2u4#(a;U~gH4(Cz_3fkIrh6z7zL8Zro`c$#U4&nW%Cpy=~94mvSct7$K^U=lcGiEDe(VKU(Ivp_Lwbd znlW-@cYu~ekdzQB69$z1!Gm&K>UfpKF2S{Epzn#)e@^IQy<3#^`;hQuIoqV*?J$m9 z!!M7s)5oOT5jFW)hs^`OqQ815M%X4C$95=SUalXvDgBcVAWVqpV)HNk@ruV71>9vJ zKGe_BAyrBIf$-4$D$ZXf1|YRrWVu6A+THo-Bf37z_ifhSDElt@#716s%VpSEt0FeW z0nc)W_QD=i!lt_-C;pvr$|Y6(Mq^L$pKGN3{xyD2=gH|e{&{=#_M2%kLqU$;32M-2 zemBn7?^O7%RUU2)>R1>E<2dkWO|CWS@Bj(3rHEa&@KL677?jPHgrU9!^e3I#Jf&Ai z-9O{PoTQ%aDB~tji|3e}R|&~(sC;i+6;`ch$*Z)Aeop)Y*H)l${ODnW`YE9XUwhl6 z5aj5Aj?2*S%S*|R#MfWRY0z#leo=5ki3(+|60fej;n}SNyX=P8X$S|Uz=H=B2m)?M zQ3ce;bjEB@$nQ;~)jk(R%<~B?IkB`<>mPh#rG3YIV?YO@&&(6N4Wx}g z0p;HXe7Z&nBBf?UN?uZyTY`e*-e!_!x6ZbMA-hRKq2EoiFk3kspkx_x7I0>r|H+G` zbnT0p{Lh?kzn=L^RC6?lRpizXp0WZJw%b8;Bp`=)aV9z6qm2`hKuZ=W4zeHcH+YCT zYa8nVwxc4z#cw_TTsj=aS`T~dlS($QTYR;}Wj*Ys#on^t!0h4LJZj{J*Y4P6$BW&5 z%l4ijoX?QnE7r5AmS2%5=wumj(+cnWzfIS*3_#T7@YW7W6tR%aq;Wl$MED&BRc6jz z`D&aB17F{Kw@m^=XHAC1Z6c74CgQUS>lpZQN4~Old03?|KNZQfHsLvT5t~4kqAZV< z%IHr=M*eIS>{yt8^kILq((J_8?`I`T%zf1h5nP}*jIQLZVf+ug`s>~G1lsgCPjIyUr=L(rW8NED(|)v6dOVL!m7J zFlz$a)zy=B-G>W8l%*V%UjYjM^ub`X`=;cw5F{s9zCoio2{;rcapvdGs9@QvihiDl zlR8g5+{%o6em}Lw2cL+t-^bvtsS&U}lXy8aFh0wSMbvN_@QHX8NPmKFVru(05ajv1 z`@TL7O0U%zf~#uRwtvSONIdwv@Zhed?KN)}8-*b=m0|1C zKT73ND5`r?Z{++QdVI>{v96h+nH7)M=Il6|_T;Zeo8trBk{t5jEazkXJOjZWVpSr` z^4fo+|8GF|??*p0d50gF&GoK*eW_~inhry1d}Yb{3p~gfW=&X<5XV-6GvM=s_XU~^ z7QqOz2=;P18bR2Ir|)n6>RJc>8%XorqcS})ckX;1L40+nZTB@>32N{tmIO&$(%BkC zS@Hdp#B~o3=xYO47WS5RsL)bD*X>@)NpHu^;|Cr4;2Col8=28eWB})?$f1%8QPEmS zh2~8|dNllae)^~K&I?aH@J2tKkcP}Tm=oLL6r_F!Sqs6M#n*!|B&csi!@f*0i`~4L z^?}w(6(6v~nM)un!Cc3rPAI`o^peljudEMq?s{ zyToVPyywXmjduazD~Dkfg0@1C?46B*W|#XVcpw64a(VpSxNC#>cem|sWnfx9`V8w0 zZ>E}KUyJao%C-)qzv^cCjb4ABYuL4M!2v2S6{;mdxmn&gDtI?d-QKA1EMMwKJ?2Ce z_|UCCUK6eiKd5XK@}o?KD!k{(pxrt&eD0BhsQ$-S=Gv_K-!`XO-(_ACevjM}4D;L3 zEum5P-8?-{WQY@~Fq6xKh)1Scf0us<+Bk34yYoKtK8IH(4W~egMQN@MFr&=x>Sbwb zPYn874l~^aO~0BY*+VKR%c&fyR;3_43d{uPX-X0K1cx$PmV*#N_(Wm^GFHlu3L|JE zm~5;3L3s5l;3UeQZwO!m2c%&en{`(B3zy|r)EIQ6T)cQZY5E|-oXmXPpd#JEwA_7? z-swx*yPWqP6mS4ZbV>aexCA%eY=(NY9c~jV2Dj6hs?Wy%k8E_?@hl_AR52jQFUoqyHKOnyu;5HS=rCW*@&!r`? zPE>cff2P~~yASMjZ<+QywII`1b;J1*f9}iq;Qvu@JS$)l1Gb1k8Ox761WFuQ9MV6e zX|jM96@FIo+TtQU|D#l}&F~%fYgk9aTnIAkQ&DvziEhyc^+x28WC`nW48PYWz8#z{ z+MHqh!l5Q+PA4TO`$V2&$L>T&6AH@6!>1yqspznMYZQmqo8A7GL`5hb-`c%w^OHX_gEVUA;2}zk!B`nXhB_@^NqUE9}LFG1^Y5)UJY5MoF z#KoInfD6u&pNUXdqEd#|qCVt1qy|U$Sh7AYDaOn}jah*W7jaXok3y-ec*c77;9q8d z>({R=9k|kZtD2xgRqH|@T$aUzXlC=<&MrEJ0}j;RcwNyPg6jbS?wn7Df3c{c2N5{f zOAVRqSi2=>EzPQ||BG>=Wf8B)!~BQ@fB0=>Y>QE&EC4aidK+=`i#KFiY8psW(}Z9REJ$Oi!Y!YSqPILn=c^VdjnL*x4Z|t){L^_dqzqJM_U#k~ zxZUiG%L#{A)D=?aDE?**F_l;)Yc98 z@MK;jYPD+As6?{A6YhGH!tEHT>kC%b)mps*R8}uy0^9!B)PA_cry99-$TQAeeD}O} z*Ys&_m3CEQ$|bDKE3CY*X?GsA;4g-XS+h7K%nlEr32l0-0}k-pU@|B(ITQmK4?XyV zUe*O^vGr*ImmT9Ps6lmS-Ch^XPRYTKxz{gC8(FP)zCb#H3z_Pe9|HXnfCv9>0Ab^s z!jaZK_@BaVp9zkglrUIKE94;)B;7(y!K*3c$Jf-DifaqWovg}_duRDA_jq#1iQjg{HN#FfVX=%-&pp$0@K$pc=EB3)QMv&fIyYhsJVcU z9C3?4jbbw$Ep?|k(|TA<%503TfF^Wn42Z{4= z+ASae!}`?RGK#%8KQ9o!)i$UxJ+IXH|2E)lv&=AJCeaO5b7$2^<4XD#A22-FD(1Aa zeJbp-U%Iox!uYFq5D^NSRBaMydKaM5@O*Gm4$ek^CU|+DC$<9AF-nO%Mn!hHiu8|v zYI?=HpVNN-lk;vck22$^ybNrM5NVw?dn_Z1E`4%*16ci zYv0}9*)Y;YMI`h>dh zPX6|;rsPm2Y?2KXU;Xg@mT} z$qBef0}^hrU97vvq(U60F}-vDqaIHfjEJ~!iZYG_K>Wo2z}@}%@FFN`L6}}M?a>pq zVr|&RHkmJ`o{q0Q?WL;UTeRT`&Z1qHkb|IOWLmMDdSZih+bMv!a)a^*hExYD1cY0Vg_B zMv=sVBm&{O^tQplUe(w{zPIB{|Bnh_A{?AW(s6%j|I+_*_NwwTV&`r&$6eSfQTx{_ z1}h8qMXXep2-FW@uY5ed1#JiK{Z&q)ledr-wUDI8qk*sahkg2wWZoGq{a?UsT4y54 zT>>(01e9rQ18Hqjlw%XmL7VSNZ37FRGy$PJfou>b&V;@bqj%%=+BRzAk(y@h;tv@G1UbUB zE_{$=zLxM7vsaLFbU zsMfgk+vsH=kwSV0E=Z>zKU~nJdSebBNG8v73QkH84Bw!10JwZ34%W)8mvCndv}Yf= zidICVQHz{ARmDME?9!Ay9GHx=;J+ldqE8-ZCxUK}=Zp~{PhIbSTzjSg4S}Zj-y_Bh zd3q>L0ACS@#hTwE7TXTVNN{Y4J>VwBtX+s!%EML#r^R;Z@rMumy)n~#uHSF`mp{J1 zfp4KedxM4;_+wjn}w z$v;7C(c^iGZHe=1)dh{i6s6IW-{_Kj)Dk;h4Q_pl+`J351a{y-$8T6RhrRLOzScNK$5M~?7oGH zKncMvz&iBKi`JVfRbC2X00?BIJ}Cr}a3#nYl2QrN6MFDB`o9?lp67z+PZu~Yu*f1SJ^WZGJVFue5j}X~1SAb%MwMUB z*sa3&mG;iv*?!0HL2}+W?jfcH>hdb+*+08ZYX&dkERrX~i20`BVHWuALfub4LP_1F z;-E*)-S-6Bn>$NGU}&R9kAE17CD;CZWJ?bh6>g)+*?xY<9}_I$+=xpS)6jD9@XIY7 z9C`qzptgbV!Cg$24za(V-C5Jse|zV!DJV51xil$%LPyNqkRouh`L=qSUS$I@7kjuI?VN_6n~si~_H`0%v$QSwD`ym9XCf;n z#PNqTkzPrEH`xLKA*3BCMkw!`nUDwO)Yz-~BEBUW=M}F)7U0B8lwng#TTI-4M#eJq zV^_$fH2|~HiM3o%zYH^F(?h^jm)K)SFFE%IdwHH0W)Y zqV(vUgyAe@cC(gcK(t+bA~#bc64eNgc;SG5!xmg|0uhER00D!N%VS2i2k_D1SC1=t zZX*fm6mBwx^wvPEn5nymSB{~fCkM9!voJAmppt|j<6k4p^9Y9X^t1scsv@v~&C~_o zo537CMePX5dU+);dMgr6L4)#MEI=Nj@m|j|E>Rh~X4Qt;?BS1q^G%91Y1OBaJ>sdg zgS{;fu>#wV62R^uEZ@#odO*S(UaYyZ%7V7D16ceOS`298=TKu6+b0{!r59Q4sHPt>8CUa z(5O&;>m4wZgdH~Qp2$?Kz$e5rD!x+rz3v^w7xA%lUh8jbS#f1f#+AZ~3U>@Vvytx> z(#MPf@)kK|w?6csTZ!UN^8B+>xNyb076b@DC;P+~463^t#s();bXyui!O4fb1Z7}D zP;kFjJ z<@K0g5M$QP2<(a8BWSsi(=~pjnl>yiW4y@?mWHrbtvU@}q2LC2^}scma`mzQ`f@lh zRIA2IY0<~3k_N_D(OtZWh&moL4G)TL*))X*`MV#1jN3z=+|ssNVNTQDM~*kTN*o40 zij9HxEXMNmRpZZ|FEPFt52&VUJ0~@3O7_E=hi(+n$E@S2Lt1K?6v9bJlD=*tpVpdQ zO!hGXZ|goQ7Kw1?hP>)Hm3&1kM67jTFgr|6Qx>bjlr9n@YkG-b(B(FQmh(EFJb-B! zY0j!EI8@qc%T*If=oi$6$`tj2RDz4N5Pzr>v!FmCRk-4Tmesc&GwefYNWu{H^836%{QOa6>p)I{{Td)FYN zv8`fDVyfH+Ns+n1-WnFf4OVCCe$piz*LFLl^%Z%%K}aAWlaR6MXrgC?gih+bciUnG zmk^vhpO*M}&8)ISYi)&qvPcws&{xZ6=_q2hgua_xCHz8H$7PInBP5Z}$fNJlSFRVL z5MFoUX(e%^N1uL{?f)KLO)3dDE^xt=c&2motRgHm`I}(T3W+7HI$BZ|b+SFU|EAH| z`-Fv%1WEM2{)X!T0<%E$j6|G%bXAVFs(fFOw^Kvixj&wd(K!Z4Ig&ofRB7l>4E2tJc9*|5*==Fp{-&Qo z$zp#^4)kT6kKaAVs+QYKRE?}Sth$(95qcz;_R^VJCgqcYXd3_@B-<%NlmL`IhD4xc zU_?Frbl-F6bi0dVcFc5GRn#DkTFOoBA`ZMkxTyeuwELO4Q2p;XkFDcWv(J|pZ@+O5 zwU&L%C%vaLH}#F*jOc@x+LZY$SxkRY5!`~soi9`Ya#CEtIUdt-y-NRwLgXpfD7km0 zNFJTov>?eEXNpsJU&9_3gWBES@IgvD1}aAbi--?sj`=B|f8~l3rh;0*vnr|o`0D)x zam{z&-j}!|)1Rl3$Bhynux9u&>hsq$_DxDXsNe%>aeFhROfWA#J8Lf4)Rt>dS zpDgIxpfq?zE}Qg!8x#N(lA7%+-3S-N6r!l~K^&UfF!eiXZeWoGfihOi;t3MUun1E? zpTe3YG)e?W619FtC|%$dX}u2#CLk=Q*}tLPozgy-DbHh#sV*beOSwor3JmGhtWzZ}l@R3Z(?o5qrD)AqPOF zl{K!H%A|dT0krtdxKu*Hl52&rj+{P#Nzd+!@)a4V)jl;=aj2pP{Ej5oTeXqU=zaHy z=C$#gmL@9ygoV0fM6GP+6E^&{j*ZTU6Zcv;{2ldT^@12X0U)uCy|2Y-ogkaXI5!kM zApgcf5?6~}ERNaf!`uJ8`hA#&)KW32l)^}tHecVRKrqK`tC5Eq)^tL}ni`6sGqzzp zG85KsVZ(k9c2KR!1lAw}Kh$3$57m|+1NjTZ_AHndp56@JMUpPghmJCp2!=}9h=i!U>Dad7aH=T@(=^{gB>i>&US zPyzTzq3d!kZV>`t#8YlTwUEV05z|bafPAPO-=eAriD=$%km+FLe~+;3(_K3j;J8l) zt+bVYYfAsgwvXBXjEmLU5q_VPBeuD4G8FRe?ja~=b}LQX?X4-wp)S?h44=MubLokC0HTM;u>X6 zq(d$I$`=BqPR5!|ZAi2-`Zb%R*vK&-;Zutpl^g<|)uuWB=i#iJRg$hp!~8>Fkwbq^ ziCnq12ILDbo0NN&{{S6VW(sYVYRw4K{+fTu+D0?n$xPV{{NYO{TzB*DS(Pgd0zD_~ zJ2uFvL!^js9aJPDztD@t$Ot3O*lI9P?UUTakoMrF!BJr8*JW*HwP^qq7Yb zW`nK@ac%h?Nn5_FxSpjXsx8XIGeby93lb1r`i*({JK?M?sXr_6k&dyQ0dl$NF>VGE-a6xv>0$3Z2f@6Pu-{9643wb&MO6Se&REaFMu;I?b5 zPt{&3FMiJL2HLI(_|l_Kr2ZkRE6+BVer{Y$SZFaDrv*Q)^AE$l`AC*L&8m03;a~k8 zb?L#*Q-(fqeHnu2N_OV+_ZgybQ^^c(OJeGDNyu2|13d!~P*Dc>$lX$7ZavD#M%@4E z6O-+2?QI>XZoLs9gBE{w1H~=Q7=abLKA~IPXK`g0HeH(}O#=R+TfxD=pwto4#DcId zMs*gl19)dA+VrMg-h(PENrMAFkv5c2ine1n&-zT>HhouzA*Ciq3B}5TDTe&~x#AE- z;LjWnkmzPUE!J6~Hl(HX=l@hSeWcP`p%-mcUBVt?-j&_%kF}j6Ge3}eRxZklcbb#I za)p+@)w=?w)w$J=U~rSatEVV$%U%gLA)hlKi((WPBR2O5WD0BPjGoRx(Jh4A`BN85 zxqa}=3&7aloKikJu0Lz9eDS^9zW?=1_|Efhjk#+Smn#RXWI(s7HWAUa7VB8(9h&wz zOq_RUCVt?RB2HLP4&|4(=->WX{?Ns|F2p;Tmp6>F%=(CGi=&Pqhbbe5iJm{q;AMgp zH9IE!)12{7f1v9)=WyJvHM$_>%|XCtp#`E>ZHlEXnDlHifSWVhh)+|VAWok0o-Au( zxm8@J+54DHkag-vFWI1<8BrmV)bP#QYE(ohAQVZ&L4low-gcr?)KzZsjSxh^J$iO* zdF!>6W8UMMk5V3@fY_+oo_t zJ9Bc2sUkFV)_3w9BPHXqR2CUyQ&P+UmOss6v3?3_0UftY;zG5FK1_j7Wxg&H=sfFM z3Sx%?xs+`gUjY=pr=dhBh*KQwGP*N4_i6}o6!yJskb3tp!y&U@JuTZ$vAxAS=&lbc zbOyK{>!3Ul>1K0CY$;%R#uMV!z*NOaXk43 z7GAOQJyr?d(EMmB6eTxITdK_OP@Uom+sRAN5+syFon@cTac4hs(Ybn+w4Z@&rZNWr zL~~t&y2wA}9s!2?saf(|RMI3t-5R&2JwibtTTl2|>@lydF>uW3!aXF%{x{>Z zd(s0Vs<=`|k^lBz+8mjNH_9au2+A-oLmP9C8W?aZy=8hVY1^pVAe;^1X z5gZvLd#!T|=;ddq!>&}X>+VdD$*x2S-VxC@Fl3O#4(-les$*s)Hb<|}v0rasJl0Ug z{R+GvMgJM+JYycPWo=f11Y_ZYwU~t@Q&59~-T$XxX}ueoNw4a-pCGm`A~ zUdMCb4?RUl;jOo9DIwT1Tk$LAs%<%ni5rGFz$r6~1Xri)YIydMU!_bT$ngbFI>Cq5 z4wJVrpBnTWBNT0@lB=XEc>J9cZLN7<;EZzlU#}s+WT2N6y^Q)O8fqba>n5s zqrO3rMUOy~6E&s5WKFgIj5tC!xjkY)q2;<=4}~C&aeXWaHcVnx|1ce0y7z zQ_pjY@q1}=OvCineUJBC?&p|3VVu^;;P;V4l-`I8UFD`P%w!$r|lkV$xl?|ScJ{pc6Roc6|kU-lVQVv46~5&M&XfRj&yZu-|bL0p*l$poALP<(Z_ zC08B*mAOGp0F5NVkoiqZ#AVuA>v$P@s}YlSWATVwhi9xH?jB6O|JyzhxB`z{MlIOG z4ct`26|=}YW^*Oz5FST@?><4EcCK6y1E3LOCP)uPAts5?v-e7Nr7!h1s;ugan&d?v zqF>^^-v*u3&S9Dljb1&jNl;K)4mcV#c|xI%^ccfc@v|%p1@*RoiNDJhd=SI}LS1{b zOFkCn^MQ2qz!&3<dp(Fp>zLpSKcN$j_&1Hx~y&o-P@mp#$cwAM!HCYoRK$v zx5?cAkKFE?H@Gq^G5{k}34{KB5EzMwbd`0M66%XN10+B}XN&_UiXf zupHWpn#J^{DIhXq`IHtEwxY9qU6w;_CsU`@?O*}nL!wRTq}~DQ$E?3inb7f>{!J+T zX*R_i@RE`y1BB-_P_4OK?IC;0^`n#SS1R&+}lV^ zVoPG5q-FpqCN*5Rv%yr+P-wL*MXwV3p0zI%_LU518z~3zUC{eO3TWAf_Xr3kFGc;K zVd;oII?4XSiYPMQi!{Zc5b-@HsQg%>b8?3O9nt?1$O)ry&^&XyZhJCzG`bQnZ$g=8td{u>X@k_juRJUS2A$a`zF0)^8*K;OG%Q#httdy2hV#CmPfxO3OetCr%4r>hI4 zt(Q>>640fI9y0MGIeXrp{!&6oYId#o9Wp2POuQ`4y1Bpl)3@v8cW88MlCzD!rfE2( z`VXahN#kO*|Cm<)(S}zWK#~3RlmQMj;K9If!s(oVCbFRZe+X7y%y+g_zGr}d8tcO> zW}QZgoaDiXq8qnU?}Eofw<#Nrxx)JoLqHE?QoyUqH2H2`x@C)^GJ3^MBQ+vq_6Lcm zKJKUvh3oJdSQz*~j~I4_AJ?mApI*Z|$gt_c&Hroa)EjZDY$b6sJ-bErbr)au(gm+4 z?H;Sfq-!_AlkWcxTT^!guP`=hu}EejB0UYbm0-sVy*8z=nnM7%mTumdaW2CqA>c{` z{Gcf=$-`lgsDtdI&~xHO=Ycs)BY5=n}PP!6V(R&lfb-RQyg zAxs!%9A%|_pnoFZvf1z;a<@L;rGO82v|`|WaiB=ll($5dqhs%|B=qy+hxaw`B^bjv zDf5b^99s-V8?Qxq z+wi0ySm=eQQTbj(-|#6DDASQ?7(TOd7rJa=WMJg_5p@d_hKB`^*|{y6hv+cj6D}|=Azv^s$^+1J|2AxeW?$bKF6UN zps4`uO4}(a91A0~j!krIKg;3samq76O*&drml88`-hY7GE4}Fjj3#fgP%cOhT+!5^ zR7CxAv2dV26)!s zmE=@-nsczh{w5$4M=AgsF`hty^QB`rwI3pj6R8*0c%J})DQy^Ie9F^kZxyJc#lE`+ zMOR@X5)%S&@H)7?uSEp#ZdKtX29gW0@9vpd1_j`5!%2?nZ`dB-oHlRD_B-;^JW1|6 z5AXQPO~+STP45@QYMLIxuKQFGmk=VnUX>Yb?Sce}&RoV1R6SH#>yPHZ`c2LYNNM-$ zUJNkd@x<4iz{31wCHQ^nGLEQOyqi=&+^uN|l29oX&Wzt4>M#%7EM|FTJO9xD!O5(xJffQ5K1I^dG4 zIuTs}35Zvdl#2)^SwgW)yc9B)T}&2|O2;#H-)xfg|v$$o^xJmF;l80=p&vxWg zaYSuG?xc@55vuPZIcXw5hn@wme38m!$}11g&PM1LOW$BThN7zRSe< zS}Wl$c@df=6ZGM}PR1BVi{dPZ#r7>tu9Qf`Xn+K5-Pe%0_V?w}zIe92TdXMe52c`) z%AgPlB$2>FFFX9aau8gNC@Ze(n+5JdyL(uQdp90Pcu=Ko4}doTOBN0H|j-?s#y^E(rGuhc*e>W^;o4}DEygcl<_!6*{I`y z_*%xdm4QFotK(vBm~&BRtbJYI(bd1ai973fB}v##j~?wXIvR7^^;T6NcuaswShmw; zMjE|AlAoRue^@q}$cE}&TqlO@r(ATUXMAM75DkhxpQAps-W}xIVCI3awP#+oE$0EZd>B)sto?8k*RPot`l=oQ;weg=I2m{P(;Zk<(fXBG2o zCP2sg1lAJ)*dLU5il-rci~bD1KlTr&f%#20m;g+eo%sZ-+W_qnfZlkvoV^C665*{H z>4|;)ZfLgfzakh0PlNl6+9>Y4D42DCe2ZdK#g#Mh#Y5_XDI`f0@HP%EW-~E#yGwnS zyh)LWfx?04C3tUpf@fEus~5E0o|k;5iv+TnDAh-@;XD7Xk{4FkQOPMBl==F({RJZS zD&lBC_*d-gsfgHv&cUc+{L`HkJzi0P-^FR5;xs#s1V86lGI0VMBe|r_k#9=|He0zG z36pO?WJsHj%l06n4DfGdEstH)b1NYI=LD5t+PeALmU;BJNT8{?sQi&|33Ba}<>j!| z?{_5wa0YbVvAHDCs@^n>COD$9R+lnTJ)Y7b4%@TLw?vM$gnw&AB`@<0%~5&ONWQ5v zQE(QBAY&HQ=M%f6x4tJ$>qgTv*WmC4TyZoBJP@uon5s7f3lnh;6Npn23qp}%Xbv*q zCs3n&^jITyyUKWvG%yzPi(D+siCx>(D{u#lTutxVWkE-N;)8~0)A%Jfa7B**`3(p9 zvtPc7)CVxBRR3Q0p|4dF!8IE3nmVA6MKtT1Kp%IUJ9#vCx$wINLxFEVZJeJxHR_Bcc;Wiy*Z)-D5U)V=nQ!vxyB;~s_Wt+r ziP?Isd%w<&i?IT9c^_m48WZ#ar3GGGl}`CVmq?!0O7FmEX~Uu}Axr>(H1e z%(LxA@OTbHut0UTE$*!km;TVet7E7u$v%jKj+DvU5S3}eGBk8=7j$YFyMp&3fWA_I&PN6`fwZ7PEBBPfHsQVr8x=ylCzs)@CPjT>FL zQ0~|lkatugoGUF4Y~|1jVtOZb^Z4$c%lLT6W^J+{AIi6#nzo@#2RBdADKRf%fK94A z;|bE{rhI_Asnd!^iNgD486?gDZ?gF;il7oV#3~QYL_G!VCAiq7ehuLpl%c~j7{|{$ zI4>ENSViA{_$A8$SZ)O%8vtr#(I}`N%fky1G5F$K8X_#EG!@nO}EAUlwz{ zPw)c|Z_}UVg){F&Ffuab8g&*?W1FP03{w_QZZ<~}aeJvab5%I{yEJH!Ny4bE+LwM8&2 z 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" + ], + "text/plain": [ + "<__main__.MyComponent at 0x7fa1066e5eb0>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "MyComponent()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Outfile was changed to '{'name': 'outfile', 'old': None, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.foo'), 'owner': <__main__.AdvancedComponent object at 0x7fa105f4fe20>, 'type': 'change'}'\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "AdvancedComponent\n", + "

\n", + "

An advanced technique

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
infile/home/aknierim/dev/ctapipe/docs/examples/test.fooinput file name (default: traitlets.Undefined)
outfile/home/aknierim/dev/ctapipe/docs/examples/out.foooutput file name (default: traitlets.Undefined)
value1-1Value to use (default: -1)
\n", + "
" + ], + "text/plain": [ + "<__main__.AdvancedComponent at 0x7fa105f4fe20>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "AdvancedComponent(infile=\"test.foo\", outfile=\"out.foo\")" ] @@ -138,9 +215,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subarray : MonteCarloArray\n", + "Num Tels : 180\n", + "Footprint: 4.92 km2\n", + "\n", + " Type Count Tel IDs \n", + "----------------- ----- ---------------\n", + " SST_ASTRI_CHEC 120 30-99,131-180 \n", + " LST_LST_LSTCam 4 1-4 \n", + "MST_MST_NectarCam 28 100-124,128-130\n", + " MST_MST_FlashCam 28 5-29,125-127 \n" + ] + } + ], "source": [ "from ctapipe.instrument import SubarrayDescription, TelescopeDescription\n", "\n", @@ -150,9 +244,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "TelescopeWiseComponent\n", + "

\n", + "

a component that contains parameters that are per-telescope configurable

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
param[('type', '*', 5.0)]Something configurable with telescope patterns. (default: traitlets.Undefined)
\n", + "
" + ], + "text/plain": [ + "<__main__.TelescopeWiseComponent at 0x7fa1704b9280>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "TelescopeWiseComponent(subarray=subarray)" ] @@ -186,7 +312,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -244,9 +370,128 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "MyTool\n", + "

\n", + "

do some things and stuff

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
config_files[] (default: traitlets.Undefined)
iterations5Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format[%(name)s]%(highlevel)s %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level30Set the log level by value or name. (default: 30)
logging_config{}\n", + " Configure additional log handlers.\n", + "\n", + " The default stderr logs handler is configured by the\n", + " log_level, log_datefmt and log_format settings.\n", + "\n", + " This configuration can be used to configure additional handlers\n", + " (e.g. to output the log to a file) or for finer control over the\n", + " default handlers.\n", + "\n", + " If provided this should be a logging configuration dictionary, for\n", + " more information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", + "\n", + " This dictionary is merged with the base logging configuration which\n", + " defines the following:\n", + "\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + "\n", + " This example adds a new handler that writes to a file:\n", + "\n", + " .. code-block:: python\n", + "\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + "\n", + " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", + "

Components:\n", + "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", + "

\n", + "" + ], + "text/plain": [ + "<__main__.MyTool at 0x7fa170490cd0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool = MyTool()\n", "tool" @@ -254,9 +499,78 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "do some things and stuff\n", + "\n", + "Options\n", + "=======\n", + "The options below are convenience aliases to configurable class-options,\n", + "as listed in the \"Equivalent to\" description-line of the aliases.\n", + "To see all configurable class-options for some , use:\n", + " --help-all\n", + "\n", + "-q, --quiet\n", + " Disable console logging.\n", + " Equivalent to: [--Tool.quiet=True]\n", + "-v, --verbose\n", + " Set log level to DEBUG\n", + " Equivalent to: [--Tool.log_level=DEBUG]\n", + "--overwrite\n", + " Overwrite existing output files without asking\n", + " Equivalent to: [--Tool.overwrite=True]\n", + "--debug\n", + " Set log-level to debug, for the most verbose logging.\n", + " Equivalent to: [--Application.log_level=10]\n", + "--show-config\n", + " Show the application's configuration (human-readable format)\n", + " Equivalent to: [--Application.show_config=True]\n", + "--show-config-json\n", + " Show the application's configuration (json format)\n", + " Equivalent to: [--Application.show_config_json=True]\n", + "-c, --config=...\n", + " Default: []\n", + " Equivalent to: [--Tool.config_files]\n", + "--log-level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + " Equivalent to: [--Tool.log_level]\n", + "-l, --log-file=\n", + " Filename for the log\n", + " Default: None\n", + " Equivalent to: [--Tool.log_file]\n", + "--log-file-level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + " Equivalent to: [--Tool.log_file_level]\n", + "--provenance-log=\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--Tool.provenance_log]\n", + "--infile=\n", + " input file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.infile]\n", + "--outfile=\n", + " output file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.outfile]\n", + "--iterations=\n", + " Number of times to run\n", + " Default: 5\n", + " Equivalent to: [--MyTool.iterations]\n", + "\n", + "To see all available configurables, use `--help-all`.\n", + "\n" + ] + } + ], "source": [ "tool.print_help()" ] @@ -270,9 +584,322 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "do some things and stuff\n", + "\n", + "Options\n", + "=======\n", + "The options below are convenience aliases to configurable class-options,\n", + "as listed in the \"Equivalent to\" description-line of the aliases.\n", + "To see all configurable class-options for some , use:\n", + " --help-all\n", + "\n", + "-q, --quiet\n", + " Disable console logging.\n", + " Equivalent to: [--Tool.quiet=True]\n", + "-v, --verbose\n", + " Set log level to DEBUG\n", + " Equivalent to: [--Tool.log_level=DEBUG]\n", + "--overwrite\n", + " Overwrite existing output files without asking\n", + " Equivalent to: [--Tool.overwrite=True]\n", + "--debug\n", + " Set log-level to debug, for the most verbose logging.\n", + " Equivalent to: [--Application.log_level=10]\n", + "--show-config\n", + " Show the application's configuration (human-readable format)\n", + " Equivalent to: [--Application.show_config=True]\n", + "--show-config-json\n", + " Show the application's configuration (json format)\n", + " Equivalent to: [--Application.show_config_json=True]\n", + "-c, --config=...\n", + " Default: []\n", + " Equivalent to: [--Tool.config_files]\n", + "--log-level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + " Equivalent to: [--Tool.log_level]\n", + "-l, --log-file=\n", + " Filename for the log\n", + " Default: None\n", + " Equivalent to: [--Tool.log_file]\n", + "--log-file-level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + " Equivalent to: [--Tool.log_file_level]\n", + "--provenance-log=\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--Tool.provenance_log]\n", + "--infile=\n", + " input file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.infile]\n", + "--outfile=\n", + " output file name\n", + " Default: traitlets.Undefined\n", + " Equivalent to: [--AdvancedComponent.outfile]\n", + "--iterations=\n", + " Number of times to run\n", + " Default: 5\n", + " Equivalent to: [--MyTool.iterations]\n", + "\n", + "Class options\n", + "=============\n", + "The command-line option below sets the respective configurable class-parameter:\n", + " --Class.parameter=value\n", + "This line is evaluated in Python, so simple expressions are allowed.\n", + "For instance, to set `C.a=[0,1,2]`, you may type this:\n", + " --C.a='range(3)'\n", + "\n", + "Application(SingletonConfigurable) options\n", + "------------------------------------------\n", + "--Application.log_datefmt=\n", + " The date format used by logging formatters for %(asctime)s\n", + " Default: '%Y-%m-%d %H:%M:%S'\n", + "--Application.log_format=\n", + " The Logging format template\n", + " Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "--Application.log_level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + "--Application.logging_config==...\n", + " Configure additional log handlers.\n", + " The default stderr logs handler is configured by the log_level, log_datefmt\n", + " and log_format settings.\n", + " This configuration can be used to configure additional handlers (e.g. to\n", + " output the log to a file) or for finer control over the default handlers.\n", + " If provided this should be a logging configuration dictionary, for more\n", + " information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-\n", + " dictschema\n", + " This dictionary is merged with the base logging configuration which defines\n", + " the following:\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + " This example adds a new handler that writes to a file:\n", + " .. code-block:: python\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + " Default: {}\n", + "--Application.show_config=\n", + " Instead of starting the Application, dump configuration to stdout\n", + " Default: False\n", + "--Application.show_config_json=\n", + " Instead of starting the Application, dump configuration to stdout (as JSON)\n", + " Default: False\n", + "\n", + "Tool(Application) options\n", + "-------------------------\n", + "--Tool.config_files=...\n", + " Default: []\n", + "--Tool.log_config==...\n", + " Default: {}\n", + "--Tool.log_datefmt=\n", + " The date format used by logging formatters for %(asctime)s\n", + " Default: '%Y-%m-%d %H:%M:%S'\n", + "--Tool.log_file=\n", + " Filename for the log\n", + " Default: None\n", + "--Tool.log_file_level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + "--Tool.log_format=\n", + " The Logging format template\n", + " Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "--Tool.log_level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + "--Tool.logging_config==...\n", + " Configure additional log handlers.\n", + " The default stderr logs handler is configured by the log_level, log_datefmt\n", + " and log_format settings.\n", + " This configuration can be used to configure additional handlers (e.g. to\n", + " output the log to a file) or for finer control over the default handlers.\n", + " If provided this should be a logging configuration dictionary, for more\n", + " information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-\n", + " dictschema\n", + " This dictionary is merged with the base logging configuration which defines\n", + " the following:\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + " This example adds a new handler that writes to a file:\n", + " .. code-block:: python\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + " Default: {}\n", + "--Tool.overwrite=\n", + " Default: False\n", + "--Tool.provenance_log=\n", + " Default: traitlets.Undefined\n", + "--Tool.quiet=\n", + " Default: False\n", + "--Tool.show_config=\n", + " Instead of starting the Application, dump configuration to stdout\n", + " Default: False\n", + "--Tool.show_config_json=\n", + " Instead of starting the Application, dump configuration to stdout (as JSON)\n", + " Default: False\n", + "\n", + "MyTool(Tool) options\n", + "--------------------\n", + "--MyTool.config_files=...\n", + " Default: []\n", + "--MyTool.iterations=\n", + " Number of times to run\n", + " Default: 5\n", + "--MyTool.log_config==...\n", + " Default: {}\n", + "--MyTool.log_datefmt=\n", + " The date format used by logging formatters for %(asctime)s\n", + " Default: '%Y-%m-%d %H:%M:%S'\n", + "--MyTool.log_file=\n", + " Filename for the log\n", + " Default: None\n", + "--MyTool.log_file_level=\n", + " Logging Level for File Logging\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 'INFO'\n", + "--MyTool.log_format=\n", + " The Logging format template\n", + " Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "--MyTool.log_level=\n", + " Set the log level by value or name.\n", + " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + " Default: 30\n", + "--MyTool.logging_config==...\n", + " Configure additional log handlers.\n", + " The default stderr logs handler is configured by the log_level, log_datefmt\n", + " and log_format settings.\n", + " This configuration can be used to configure additional handlers (e.g. to\n", + " output the log to a file) or for finer control over the default handlers.\n", + " If provided this should be a logging configuration dictionary, for more\n", + " information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-\n", + " dictschema\n", + " This dictionary is merged with the base logging configuration which defines\n", + " the following:\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + " This example adds a new handler that writes to a file:\n", + " .. code-block:: python\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + " Default: {}\n", + "--MyTool.overwrite=\n", + " Default: False\n", + "--MyTool.provenance_log=\n", + " Default: traitlets.Undefined\n", + "--MyTool.quiet=\n", + " Default: False\n", + "--MyTool.show_config=\n", + " Instead of starting the Application, dump configuration to stdout\n", + " Default: False\n", + "--MyTool.show_config_json=\n", + " Instead of starting the Application, dump configuration to stdout (as JSON)\n", + " Default: False\n", + "\n", + "MyComponent(Component) options\n", + "------------------------------\n", + "--MyComponent.value=\n", + " Value to use\n", + " Default: -1\n", + "\n", + "AdvancedComponent(Component) options\n", + "------------------------------------\n", + "--AdvancedComponent.infile=\n", + " input file name\n", + " Default: traitlets.Undefined\n", + "--AdvancedComponent.outfile=\n", + " output file name\n", + " Default: traitlets.Undefined\n", + "--AdvancedComponent.value1=\n", + " Value to use\n", + " Default: -1\n", + "\n", + "SecondaryMyComponent(MyComponent) options\n", + "-----------------------------------------\n", + "--SecondaryMyComponent.value=\n", + " Value to use\n", + " Default: -1\n", + "\n", + "TelescopeWiseComponent(TelescopeComponent) options\n", + "--------------------------------------------------\n", + "--TelescopeWiseComponent.param=...\n", + " Something configurable with telescope patterns.\n", + " Default: [('type', '*', 5.0)]\n", + "\n" + ] + } + ], "source": [ "tool.print_help(classes=True)" ] @@ -295,9 +922,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:52,057 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170483f40>, 'type': 'change'}'\n", + "2023-07-03 17:24:52,559 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n" + ] + } + ], "source": [ "try:\n", " tool.run(argv=[\"--infile\", str(GAMMA_FILE), \"--outfile\", \"out.csv\"])\n", @@ -307,9 +943,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:52,798 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): Loading config from '[]'\n", + "2023-07-03 17:24:52,800 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", + "2023-07-03 17:24:52,802 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170483520>, 'type': 'change'}'\n", + "2023-07-03 17:24:52,803 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 3 iterations...\n", + "2023-07-03 17:24:52,803 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", + "2023-07-03 17:24:52,903 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", + "2023-07-03 17:24:53,005 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", + "2023-07-03 17:24:53,106 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", + "2023-07-03 17:24:53,108 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", + "2023-07-03 17:24:53,114 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,116 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n" + ] + } + ], "source": [ "tool.log_format = \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\"\n", "\n", @@ -340,9 +994,2637 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:53,149 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Starting: mytool\n", + "2023-07-03 17:24:53,325 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): Loading config from '[]'\n", + "2023-07-03 17:24:53,327 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", + "2023-07-03 17:24:53,329 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486340>, 'type': 'change'}'\n", + "2023-07-03 17:24:53,330 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.run): CONFIG: {'MyTool': {'config_files': [], 'iterations': 3, 'log_config': {}, 'log_datefmt': '%Y-%m-%d %H:%M:%S', 'log_file': None, 'log_file_level': 'INFO', 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s', 'log_level': 10, 'logging_config': {}, 'overwrite': False, 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'), 'quiet': False, 'show_config': False, 'show_config_json': False, 'MyComponent': {'value': -1}, 'SecondaryMyComponent': {'value': -1}, 'TelescopeWiseComponent': {'param': [('type', '*', 5.0)]}, 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'), 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'value1': -1, 'MyComponent': {'value': -1}}}}\n", + "2023-07-03 17:24:53,330 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 3 iterations...\n", + "2023-07-03 17:24:53,330 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", + "2023-07-03 17:24:53,331 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,331 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,432 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", + "2023-07-03 17:24:53,433 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,435 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,537 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", + "2023-07-03 17:24:53,538 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,539 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:53,640 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", + "2023-07-03 17:24:53,642 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", + "2023-07-03 17:24:53,649 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,651 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,653 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:53,668 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.write_provenance): PROVENANCE: '[\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"c2c31b3c-b5cd-4c46-8581-e0cf17c94af0\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:51.880\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.561\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.052\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 5,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", + " \"log_level\": 30,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.011350000000014404\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"9a689c40-0157-4ee0-88f4-fb8125ef689c\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.601\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.110\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.794\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 20,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.008483333333408893\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"a237bc8b-cb43-456b-a3d2-3f1ad096fbeb\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.153\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.644\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:53.322\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 10,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.00818333333336696\n", + " }\n", + "]'\n", + "2023-07-03 17:24:53,683 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (application.exit): Exiting application: mytool\n" + ] + } + ], "source": [ "try:\n", " tool.run(\n", @@ -368,9 +3650,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:53,720 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Starting: mytool\n", + "2023-07-03 17:24:53,931 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486880>, 'type': 'change'}'\n", + "2023-07-03 17:24:54,032 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n" + ] + } + ], "source": [ "tool.iterations = 1\n", "tool.log_level = 0\n", @@ -390,9 +3682,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bad value: The 'iterations' trait of a MyTool instance expected an int, not the str 'badval'.\n" + ] + } + ], "source": [ "try:\n", " tool.iterations = \"badval\"\n", @@ -411,9 +3711,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:54,141 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/Another.txt'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486880>, 'type': 'change'}'\n" + ] + } + ], "source": [ "tool.advanced.outfile = \"Another.txt\"" ] @@ -434,7 +3742,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -443,9 +3751,4382 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:54,332 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", + "2023-07-03 17:24:54,334 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/foo.txt'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486e20>, 'type': 'change'}'\n", + "2023-07-03 17:24:54,335 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.run): CONFIG: {'MyTool': {'config_files': [PosixPath('/home/aknierim/dev/ctapipe/docs/examples/Tools.json')], 'iterations': 5, 'log_config': {}, 'log_datefmt': '%Y-%m-%d %H:%M:%S', 'log_file': None, 'log_file_level': 'INFO', 'log_format': '[%(name)s]%(highlevel)s %(message)s', 'log_level': 10, 'logging_config': {}, 'overwrite': False, 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'), 'quiet': False, 'show_config': False, 'show_config_json': False, 'MyComponent': {'value': -1}, 'SecondaryMyComponent': {'value': -1}, 'TelescopeWiseComponent': {'param': [('type', '*', 5.0)]}, 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/something.txt'), 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/foo.txt'), 'value1': -1, 'MyComponent': {'value': -1}}}}\n", + "2023-07-03 17:24:54,336 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 5 iterations...\n", + "2023-07-03 17:24:54,336 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", + "2023-07-03 17:24:54,336 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,337 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,437 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", + "2023-07-03 17:24:54,439 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,441 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,542 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", + "2023-07-03 17:24:54,543 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,543 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,644 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 3\n", + "2023-07-03 17:24:54,645 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,647 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,748 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 4\n", + "2023-07-03 17:24:54,749 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,749 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", + "2023-07-03 17:24:54,850 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", + "2023-07-03 17:24:54,852 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", + "2023-07-03 17:24:54,858 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,859 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,861 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,862 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,864 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", + "2023-07-03 17:24:54,887 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.write_provenance): PROVENANCE: '[\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"c2c31b3c-b5cd-4c46-8581-e0cf17c94af0\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:51.880\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.561\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.052\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 5,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", + " \"log_level\": 30,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.011350000000014404\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"9a689c40-0157-4ee0-88f4-fb8125ef689c\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:52.601\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.110\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:52.794\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 20,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.008483333333408893\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"a237bc8b-cb43-456b-a3d2-3f1ad096fbeb\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.153\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.644\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:53.322\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 3,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 10,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.00818333333336696\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"b0ef6627-d00f-4fd8-bf9a-7631e890715b\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:53.722\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:54.034\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:53.927\"\n", + " },\n", + " \"input\": [],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [],\n", + " \"iterations\": 1,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", + " \"log_level\": 0,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.005199999999874194\n", + " },\n", + " {\n", + " \"activity_name\": \"mytool\",\n", + " \"activity_uuid\": \"837610ed-009c-4e8f-9770-cfb76ab71239\",\n", + " \"start\": {\n", + " \"time_utc\": \"2023-07-03T15:24:54.154\"\n", + " },\n", + " \"stop\": {\n", + " \"time_utc\": \"2023-07-03T15:24:54.854\"\n", + " },\n", + " \"system\": {\n", + " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", + " \"ctapipe_resources_version\": \"not installed\",\n", + " \"eventio_version\": \"1.11.0\",\n", + " \"ctapipe_svc_path\": null,\n", + " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", + " \"platform\": {\n", + " \"architecture_bits\": \"64bit\",\n", + " \"architecture_linkage\": \"ELF\",\n", + " \"machine\": \"x86_64\",\n", + " \"processor\": \"x86_64\",\n", + " \"node\": \"e5b-dell-09\",\n", + " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", + " \"system\": \"Linux\",\n", + " \"release\": \"5.19.0-46-generic\",\n", + " \"libcver\": [\n", + " \"glibc\",\n", + " \"2.35\"\n", + " ],\n", + " \"n_cpus\": 12,\n", + " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", + " },\n", + " \"python\": {\n", + " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", + " \"version\": [\n", + " \"3\",\n", + " \"9\",\n", + " \"16\"\n", + " ],\n", + " \"compiler\": \"GCC 11.3.0\",\n", + " \"implementation\": \"CPython\",\n", + " \"packages\": [\n", + " {\n", + " \"name\": \"Babel\",\n", + " \"version\": \"2.12.1\"\n", + " },\n", + " {\n", + " \"name\": \"Cython\",\n", + " \"version\": \"0.29.34\"\n", + " },\n", + " {\n", + " \"name\": \"Jinja2\",\n", + " \"version\": \"3.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"MarkupSafe\",\n", + " \"version\": \"2.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"Pillow\",\n", + " \"version\": \"9.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5\",\n", + " \"version\": \"5.15.7\"\n", + " },\n", + " {\n", + " \"name\": \"PyQt5-sip\",\n", + " \"version\": \"12.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"PySocks\",\n", + " \"version\": \"1.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"PyYAML\",\n", + " \"version\": \"6.0\"\n", + " },\n", + " {\n", + " \"name\": \"Pygments\",\n", + " \"version\": \"2.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"QtPy\",\n", + " \"version\": \"2.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"Send2Trash\",\n", + " \"version\": \"1.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"Sphinx\",\n", + " \"version\": \"6.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"accessible-pygments\",\n", + " \"version\": \"0.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"alabaster\",\n", + " \"version\": \"0.7.13\"\n", + " },\n", + " {\n", + " \"name\": \"anyio\",\n", + " \"version\": \"3.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi\",\n", + " \"version\": \"21.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"argon2-cffi-bindings\",\n", + " \"version\": \"21.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"astropy\",\n", + " \"version\": \"5.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"asttokens\",\n", + " \"version\": \"2.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"async-lru\",\n", + " \"version\": \"2.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"attrs\",\n", + " \"version\": \"23.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"backcall\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"backports.functools-lru-cache\",\n", + " \"version\": \"1.6.4\"\n", + " },\n", + " {\n", + " \"name\": \"beautifulsoup4\",\n", + " \"version\": \"4.12.2\"\n", + " },\n", + " {\n", + " \"name\": \"black\",\n", + " \"version\": \"23.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"bleach\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"bokeh\",\n", + " \"version\": \"2.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"brotlipy\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"cached-property\",\n", + " \"version\": \"1.5.2\"\n", + " },\n", + " {\n", + " \"name\": \"certifi\",\n", + " \"version\": \"2023.5.7\"\n", + " },\n", + " {\n", + " \"name\": \"cffi\",\n", + " \"version\": \"1.15.1\"\n", + " },\n", + " {\n", + " \"name\": \"cfgv\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"charset-normalizer\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"click\",\n", + " \"version\": \"8.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"click-default-group\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"colorama\",\n", + " \"version\": \"0.4.6\"\n", + " },\n", + " {\n", + " \"name\": \"comm\",\n", + " \"version\": \"0.1.3\"\n", + " },\n", + " {\n", + " \"name\": \"contourpy\",\n", + " \"version\": \"1.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"corsikaio\",\n", + " \"version\": \"0.2.6.post1\"\n", + " },\n", + " {\n", + " \"name\": \"coverage\",\n", + " \"version\": \"7.2.5\"\n", + " },\n", + " {\n", + " \"name\": \"cryptography\",\n", + " \"version\": \"40.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"ctapipe\",\n", + " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", + " },\n", + " {\n", + " \"name\": \"cycler\",\n", + " \"version\": \"0.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"debugpy\",\n", + " \"version\": \"1.6.7\"\n", + " },\n", + " {\n", + " \"name\": \"decorator\",\n", + " \"version\": \"5.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"defusedxml\",\n", + " \"version\": \"0.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"distlib\",\n", + " \"version\": \"0.3.6\"\n", + " },\n", + " {\n", + " \"name\": \"docutils\",\n", + " \"version\": \"0.18.1\"\n", + " },\n", + " {\n", + " \"name\": \"entrypoints\",\n", + " \"version\": \"0.4\"\n", + " },\n", + " {\n", + " \"name\": \"eventio\",\n", + " \"version\": \"1.11.0\"\n", + " },\n", + " {\n", + " \"name\": \"exceptiongroup\",\n", + " \"version\": \"1.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"executing\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"fastjsonschema\",\n", + " \"version\": \"2.16.3\"\n", + " },\n", + " {\n", + " \"name\": \"filelock\",\n", + " \"version\": \"3.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"flit_core\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"fonttools\",\n", + " \"version\": \"4.39.3\"\n", + " },\n", + " {\n", + " \"name\": \"h5py\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"identify\",\n", + " \"version\": \"2.5.24\"\n", + " },\n", + " {\n", + " \"name\": \"idna\",\n", + " \"version\": \"3.4\"\n", + " },\n", + " {\n", + " \"name\": \"imagesize\",\n", + " \"version\": \"1.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"iminuit\",\n", + " \"version\": \"2.21.3\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-metadata\",\n", + " \"version\": \"6.6.0\"\n", + " },\n", + " {\n", + " \"name\": \"importlib-resources\",\n", + " \"version\": \"5.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"incremental\",\n", + " \"version\": \"22.10.0\"\n", + " },\n", + " {\n", + " \"name\": \"iniconfig\",\n", + " \"version\": \"2.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipykernel\",\n", + " \"version\": \"6.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipython\",\n", + " \"version\": \"8.13.2\"\n", + " },\n", + " {\n", + " \"name\": \"ipython-genutils\",\n", + " \"version\": \"0.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"ipywidgets\",\n", + " \"version\": \"8.0.6\"\n", + " },\n", + " {\n", + " \"name\": \"jedi\",\n", + " \"version\": \"0.18.2\"\n", + " },\n", + " {\n", + " \"name\": \"joblib\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"json5\",\n", + " \"version\": \"0.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"jsonschema\",\n", + " \"version\": \"4.17.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-console\",\n", + " \"version\": \"6.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-events\",\n", + " \"version\": \"0.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter-lsp\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_client\",\n", + " \"version\": \"8.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_core\",\n", + " \"version\": \"5.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server\",\n", + " \"version\": \"2.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"jupyter_server_terminals\",\n", + " \"version\": \"0.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab\",\n", + " \"version\": \"4.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-pygments\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab-widgets\",\n", + " \"version\": \"3.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"jupyterlab_server\",\n", + " \"version\": \"2.22.1\"\n", + " },\n", + " {\n", + " \"name\": \"kiwisolver\",\n", + " \"version\": \"1.4.4\"\n", + " },\n", + " {\n", + " \"name\": \"livereload\",\n", + " \"version\": \"2.6.3\"\n", + " },\n", + " {\n", + " \"name\": \"llvmlite\",\n", + " \"version\": \"0.39.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib\",\n", + " \"version\": \"3.7.1\"\n", + " },\n", + " {\n", + " \"name\": \"matplotlib-inline\",\n", + " \"version\": \"0.1.6\"\n", + " },\n", + " {\n", + " \"name\": \"mistune\",\n", + " \"version\": \"2.0.5\"\n", + " },\n", + " {\n", + " \"name\": \"munkres\",\n", + " \"version\": \"1.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"mypy-extensions\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclassic\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbclient\",\n", + " \"version\": \"0.7.4\"\n", + " },\n", + " {\n", + " \"name\": \"nbconvert\",\n", + " \"version\": \"7.4.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbformat\",\n", + " \"version\": \"5.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"nbsphinx\",\n", + " \"version\": \"0.9.1\"\n", + " },\n", + " {\n", + " \"name\": \"nest-asyncio\",\n", + " \"version\": \"1.5.6\"\n", + " },\n", + " {\n", + " \"name\": \"nodeenv\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"notebook\",\n", + " \"version\": \"6.5.4\"\n", + " },\n", + " {\n", + " \"name\": \"notebook_shim\",\n", + " \"version\": \"0.2.3\"\n", + " },\n", + " {\n", + " \"name\": \"numba\",\n", + " \"version\": \"0.56.4\"\n", + " },\n", + " {\n", + " \"name\": \"numexpr\",\n", + " \"version\": \"2.8.4\"\n", + " },\n", + " {\n", + " \"name\": \"numpy\",\n", + " \"version\": \"1.23.5\"\n", + " },\n", + " {\n", + " \"name\": \"numpydoc\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"packaging\",\n", + " \"version\": \"23.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandas\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"pandocfilters\",\n", + " \"version\": \"1.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"parso\",\n", + " \"version\": \"0.8.3\"\n", + " },\n", + " {\n", + " \"name\": \"pathspec\",\n", + " \"version\": \"0.11.1\"\n", + " },\n", + " {\n", + " \"name\": \"pexpect\",\n", + " \"version\": \"4.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"pickleshare\",\n", + " \"version\": \"0.7.5\"\n", + " },\n", + " {\n", + " \"name\": \"pip\",\n", + " \"version\": \"23.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pkgutil_resolve_name\",\n", + " \"version\": \"1.3.10\"\n", + " },\n", + " {\n", + " \"name\": \"platformdirs\",\n", + " \"version\": \"3.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"pluggy\",\n", + " \"version\": \"1.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"ply\",\n", + " \"version\": \"3.11\"\n", + " },\n", + " {\n", + " \"name\": \"pooch\",\n", + " \"version\": \"1.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pre-commit\",\n", + " \"version\": \"3.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"prometheus-client\",\n", + " \"version\": \"0.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"prompt-toolkit\",\n", + " \"version\": \"3.0.38\"\n", + " },\n", + " {\n", + " \"name\": \"psutil\",\n", + " \"version\": \"5.9.5\"\n", + " },\n", + " {\n", + " \"name\": \"ptyprocess\",\n", + " \"version\": \"0.7.0\"\n", + " },\n", + " {\n", + " \"name\": \"pure-eval\",\n", + " \"version\": \"0.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"py-cpuinfo\",\n", + " \"version\": \"9.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pyOpenSSL\",\n", + " \"version\": \"23.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"pycparser\",\n", + " \"version\": \"2.21\"\n", + " },\n", + " {\n", + " \"name\": \"pydata-sphinx-theme\",\n", + " \"version\": \"0.13.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyerfa\",\n", + " \"version\": \"2.0.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyparsing\",\n", + " \"version\": \"3.0.9\"\n", + " },\n", + " {\n", + " \"name\": \"pyrsistent\",\n", + " \"version\": \"0.19.3\"\n", + " },\n", + " {\n", + " \"name\": \"pytest\",\n", + " \"version\": \"7.3.1\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-astropy-header\",\n", + " \"version\": \"0.1.2\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-cov\",\n", + " \"version\": \"4.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"pytest-runner\",\n", + " \"version\": \"6.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"python-dateutil\",\n", + " \"version\": \"2.8.2\"\n", + " },\n", + " {\n", + " \"name\": \"python-json-logger\",\n", + " \"version\": \"2.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"pytz\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"pyzmq\",\n", + " \"version\": \"25.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"qtconsole\",\n", + " \"version\": \"5.4.3\"\n", + " },\n", + " {\n", + " \"name\": \"requests\",\n", + " \"version\": \"2.29.0\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3339-validator\",\n", + " \"version\": \"0.1.4\"\n", + " },\n", + " {\n", + " \"name\": \"rfc3986-validator\",\n", + " \"version\": \"0.1.1\"\n", + " },\n", + " {\n", + " \"name\": \"scikit-learn\",\n", + " \"version\": \"1.2.2\"\n", + " },\n", + " {\n", + " \"name\": \"scipy\",\n", + " \"version\": \"1.10.1\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools\",\n", + " \"version\": \"67.7.2\"\n", + " },\n", + " {\n", + " \"name\": \"setuptools-scm\",\n", + " \"version\": \"7.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"sip\",\n", + " \"version\": \"6.7.9\"\n", + " },\n", + " {\n", + " \"name\": \"six\",\n", + " \"version\": \"1.16.0\"\n", + " },\n", + " {\n", + " \"name\": \"sniffio\",\n", + " \"version\": \"1.3.0\"\n", + " },\n", + " {\n", + " \"name\": \"snowballstemmer\",\n", + " \"version\": \"2.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"soupsieve\",\n", + " \"version\": \"2.3.2.post1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-autobuild\",\n", + " \"version\": \"2021.3.14\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-automodapi\",\n", + " \"version\": \"0.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx-rtd-theme\",\n", + " \"version\": \"1.2.0\"\n", + " },\n", + " {\n", + " \"name\": \"sphinx_design\",\n", + " \"version\": \"0.4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-applehelp\",\n", + " \"version\": \"1.0.4\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-devhelp\",\n", + " \"version\": \"1.0.2\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-htmlhelp\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jquery\",\n", + " \"version\": \"4.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-jsmath\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-qthelp\",\n", + " \"version\": \"1.0.3\"\n", + " },\n", + " {\n", + " \"name\": \"sphinxcontrib-serializinghtml\",\n", + " \"version\": \"1.1.5\"\n", + " },\n", + " {\n", + " \"name\": \"stack-data\",\n", + " \"version\": \"0.6.2\"\n", + " },\n", + " {\n", + " \"name\": \"tables\",\n", + " \"version\": \"3.8.0\"\n", + " },\n", + " {\n", + " \"name\": \"terminado\",\n", + " \"version\": \"0.17.1\"\n", + " },\n", + " {\n", + " \"name\": \"threadpoolctl\",\n", + " \"version\": \"3.1.0\"\n", + " },\n", + " {\n", + " \"name\": \"tinycss2\",\n", + " \"version\": \"1.2.1\"\n", + " },\n", + " {\n", + " \"name\": \"toml\",\n", + " \"version\": \"0.10.2\"\n", + " },\n", + " {\n", + " \"name\": \"tomli\",\n", + " \"version\": \"2.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"tornado\",\n", + " \"version\": \"6.3\"\n", + " },\n", + " {\n", + " \"name\": \"towncrier\",\n", + " \"version\": \"22.12.0\"\n", + " },\n", + " {\n", + " \"name\": \"tqdm\",\n", + " \"version\": \"4.65.0\"\n", + " },\n", + " {\n", + " \"name\": \"traitlets\",\n", + " \"version\": \"5.9.0\"\n", + " },\n", + " {\n", + " \"name\": \"typing_extensions\",\n", + " \"version\": \"4.5.0\"\n", + " },\n", + " {\n", + " \"name\": \"tzdata\",\n", + " \"version\": \"2023.3\"\n", + " },\n", + " {\n", + " \"name\": \"ukkonen\",\n", + " \"version\": \"1.0.1\"\n", + " },\n", + " {\n", + " \"name\": \"unicodedata2\",\n", + " \"version\": \"15.0.0\"\n", + " },\n", + " {\n", + " \"name\": \"urllib3\",\n", + " \"version\": \"1.26.15\"\n", + " },\n", + " {\n", + " \"name\": \"virtualenv\",\n", + " \"version\": \"20.23.0\"\n", + " },\n", + " {\n", + " \"name\": \"wcwidth\",\n", + " \"version\": \"0.2.6\"\n", + " },\n", + " {\n", + " \"name\": \"webencodings\",\n", + " \"version\": \"0.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"websocket-client\",\n", + " \"version\": \"1.5.1\"\n", + " },\n", + " {\n", + " \"name\": \"wheel\",\n", + " \"version\": \"0.40.0\"\n", + " },\n", + " {\n", + " \"name\": \"widgetsnbextension\",\n", + " \"version\": \"4.0.7\"\n", + " },\n", + " {\n", + " \"name\": \"zipp\",\n", + " \"version\": \"3.15.0\"\n", + " },\n", + " {\n", + " \"name\": \"zstandard\",\n", + " \"version\": \"0.19.0\"\n", + " }\n", + " ]\n", + " },\n", + " \"environment\": {\n", + " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", + " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", + " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", + " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", + " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", + " \"CONDA_SHLVL\": \"1\",\n", + " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", + " \"LD_LIBRARY_PATH\": null,\n", + " \"DYLD_LIBRARY_PATH\": null,\n", + " \"USER\": \"aknierim\",\n", + " \"HOME\": \"/home/aknierim\",\n", + " \"SHELL\": \"/bin/zsh\"\n", + " },\n", + " \"arguments\": [\n", + " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", + " \"-f\",\n", + " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", + " ],\n", + " \"start_time_utc\": \"2023-07-03T15:24:54.328\"\n", + " },\n", + " \"input\": [\n", + " {\n", + " \"url\": \"/home/aknierim/dev/ctapipe/docs/examples/Tools.json\",\n", + " \"role\": \"Tool Configuration\"\n", + " }\n", + " ],\n", + " \"output\": [],\n", + " \"config\": {\n", + " \"MyTool\": {\n", + " \"config_files\": [\n", + " \"/home/aknierim/dev/ctapipe/docs/examples/Tools.json\"\n", + " ],\n", + " \"iterations\": 5,\n", + " \"log_config\": {},\n", + " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", + " \"log_file\": null,\n", + " \"log_file_level\": \"INFO\",\n", + " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", + " \"log_level\": 10,\n", + " \"logging_config\": {},\n", + " \"overwrite\": false,\n", + " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", + " \"quiet\": false,\n", + " \"show_config\": false,\n", + " \"show_config_json\": false,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"SecondaryMyComponent\": {\n", + " \"value\": -1\n", + " },\n", + " \"TelescopeWiseComponent\": {\n", + " \"param\": [\n", + " [\n", + " \"type\",\n", + " \"*\",\n", + " 5.0\n", + " ]\n", + " ]\n", + " },\n", + " \"AdvancedComponent\": {\n", + " \"infile\": \"/home/aknierim/dev/ctapipe/docs/examples/something.txt\",\n", + " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/foo.txt\",\n", + " \"value1\": -1,\n", + " \"MyComponent\": {\n", + " \"value\": -1\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"status\": \"completed\",\n", + " \"duration_min\": 0.01166666666650329\n", + " }\n", + "]'\n", + "2023-07-03 17:24:54,902 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (application.exit): Exiting application: mytool\n" + ] + } + ], "source": [ "try:\n", " tool2.run(argv=[\"--config\", \"Tools.json\"])\n", @@ -455,34 +8136,61 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/aknierim/dev/ctapipe/docs/examples/something.txt\n" + ] + } + ], "source": [ "print(tool2.advanced.infile)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'MyTool': {'config_files': ['Tools.json'], 'log_level': 'DEBUG'}, 'AdvancedComponent': {'infile': 'something.txt', 'outfile': 'foo.txt'}}\n" + ] + } + ], "source": [ "print(tool2.config)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool2.is_setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -491,16 +8199,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool3.is_setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -509,27 +8228,283 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool3.is_setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "MyTool\n", + "

\n", + "

do some things and stuff

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
config_files[] (default: traitlets.Undefined)
iterations5Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format[%(name)s]%(highlevel)s %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level30Set the log level by value or name. (default: 30)
logging_config{}\n", + " Configure additional log handlers.\n", + "\n", + " The default stderr logs handler is configured by the\n", + " log_level, log_datefmt and log_format settings.\n", + "\n", + " This configuration can be used to configure additional handlers\n", + " (e.g. to output the log to a file) or for finer control over the\n", + " default handlers.\n", + "\n", + " If provided this should be a logging configuration dictionary, for\n", + " more information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", + "\n", + " This dictionary is merged with the base logging configuration which\n", + " defines the following:\n", + "\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + "\n", + " This example adds a new handler that writes to a file:\n", + "\n", + " .. code-block:: python\n", + "\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + "\n", + " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", + "

Components:\n", + "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", + "

\n", + "" + ], + "text/plain": [ + "<__main__.MyTool at 0x7fa1985c6610>" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool3" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-07-03 17:24:55,026 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa1704f4250>, 'type': 'change'}'\n" + ] + }, + { + "data": { + "text/html": [ + "MyTool\n", + "

\n", + "

do some things and stuff

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "
config_files[] (default: traitlets.Undefined)
iterations1Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level0Set the log level by value or name. (default: 30)
logging_config{}\n", + " Configure additional log handlers.\n", + "\n", + " The default stderr logs handler is configured by the\n", + " log_level, log_datefmt and log_format settings.\n", + "\n", + " This configuration can be used to configure additional handlers\n", + " (e.g. to output the log to a file) or for finer control over the\n", + " default handlers.\n", + "\n", + " If provided this should be a logging configuration dictionary, for\n", + " more information see:\n", + " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", + "\n", + " This dictionary is merged with the base logging configuration which\n", + " defines the following:\n", + "\n", + " * A logging formatter intended for interactive use called\n", + " ``console``.\n", + " * A logging handler that writes to stderr called\n", + " ``console`` which uses the formatter ``console``.\n", + " * A logger with the name of this application set to ``DEBUG``\n", + " level.\n", + "\n", + " This example adds a new handler that writes to a file:\n", + "\n", + " .. code-block:: python\n", + "\n", + " c.Application.logging_config = {\n", + " 'handlers': {\n", + " 'file': {\n", + " 'class': 'logging.FileHandler',\n", + " 'level': 'DEBUG',\n", + " 'filename': '',\n", + " }\n", + " },\n", + " 'loggers': {\n", + " '': {\n", + " 'level': 'DEBUG',\n", + " # NOTE: if you don't list the default \"console\"\n", + " # handler here then it will be disabled\n", + " 'handlers': ['console', 'file'],\n", + " },\n", + " }\n", + " }\n", + "\n", + " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", + "

Components:\n", + "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", + "

\n", + "" + ], + "text/plain": [ + "<__main__.MyTool at 0x7fa170490cd0>" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.setup()\n", "tool" @@ -537,9 +8512,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "SecondaryMyComponent\n", + "

\n", + "

A second component

\n", + "
\n", + "

\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
value-1Value to use (default: -1)
\n", + "
" + ], + "text/plain": [ + "<__main__.SecondaryMyComponent at 0x7fa1704f4a00>" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.comp2" ] @@ -553,18 +8560,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'MyTool': {'config_files': [],\n", + " 'iterations': 1,\n", + " 'log_config': {},\n", + " 'log_datefmt': '%Y-%m-%d %H:%M:%S',\n", + " 'log_file': None,\n", + " 'log_file_level': 'INFO',\n", + " 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s',\n", + " 'log_level': 0,\n", + " 'logging_config': {},\n", + " 'overwrite': False,\n", + " 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'),\n", + " 'quiet': False,\n", + " 'show_config': False,\n", + " 'show_config_json': False,\n", + " 'MyComponent': {'value': -1},\n", + " 'SecondaryMyComponent': {'value': -1},\n", + " 'TelescopeWiseComponent': {'param': TelescopePatternList([('type',\n", + " '*',\n", + " 5.0)])},\n", + " 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'),\n", + " 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'),\n", + " 'value1': -1,\n", + " 'MyComponent': {'value': -1}}}}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.get_current_config()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'MyTool': {'config_files': [],\n", + " 'iterations': 12,\n", + " 'log_config': {},\n", + " 'log_datefmt': '%Y-%m-%d %H:%M:%S',\n", + " 'log_file': None,\n", + " 'log_file_level': 'INFO',\n", + " 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s',\n", + " 'log_level': 0,\n", + " 'logging_config': {},\n", + " 'overwrite': False,\n", + " 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'),\n", + " 'quiet': False,\n", + " 'show_config': False,\n", + " 'show_config_json': False,\n", + " 'MyComponent': {'value': -1},\n", + " 'SecondaryMyComponent': {'value': -1},\n", + " 'TelescopeWiseComponent': {'param': TelescopePatternList([('type',\n", + " '*',\n", + " 5.0)])},\n", + " 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'),\n", + " 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'),\n", + " 'value1': -1,\n", + " 'MyComponent': {'value': -1}}}}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tool.iterations = 12\n", "tool.get_current_config()" @@ -579,9 +8652,244 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Configuration file for mytool.\n", + "\n", + "c = get_config() #noqa\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# Application(SingletonConfigurable) configuration\n", + "#------------------------------------------------------------------------------\n", + "## This is an application.\n", + "\n", + "## The date format used by logging formatters for %(asctime)s\n", + "# Default: '%Y-%m-%d %H:%M:%S'\n", + "# c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", + "\n", + "## The Logging format template\n", + "# Default: '[%(name)s]%(highlevel)s %(message)s'\n", + "# c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", + "\n", + "## Set the log level by value or name.\n", + "# Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + "# Default: 30\n", + "# c.Application.log_level = 30\n", + "\n", + "## Configure additional log handlers.\n", + "# \n", + "# The default stderr logs handler is configured by the log_level, log_datefmt\n", + "# and log_format settings.\n", + "# \n", + "# This configuration can be used to configure additional handlers (e.g. to\n", + "# output the log to a file) or for finer control over the default handlers.\n", + "# \n", + "# If provided this should be a logging configuration dictionary, for more\n", + "# information see:\n", + "# https://docs.python.org/3/library/logging.config.html#logging-config-\n", + "# dictschema\n", + "# \n", + "# This dictionary is merged with the base logging configuration which defines\n", + "# the following:\n", + "# \n", + "# * A logging formatter intended for interactive use called\n", + "# ``console``.\n", + "# * A logging handler that writes to stderr called\n", + "# ``console`` which uses the formatter ``console``.\n", + "# * A logger with the name of this application set to ``DEBUG``\n", + "# level.\n", + "# \n", + "# This example adds a new handler that writes to a file:\n", + "# \n", + "# .. code-block:: python\n", + "# \n", + "# c.Application.logging_config = {\n", + "# 'handlers': {\n", + "# 'file': {\n", + "# 'class': 'logging.FileHandler',\n", + "# 'level': 'DEBUG',\n", + "# 'filename': '',\n", + "# }\n", + "# },\n", + "# 'loggers': {\n", + "# '': {\n", + "# 'level': 'DEBUG',\n", + "# # NOTE: if you don't list the default \"console\"\n", + "# # handler here then it will be disabled\n", + "# 'handlers': ['console', 'file'],\n", + "# },\n", + "# }\n", + "# }\n", + "# Default: {}\n", + "# c.Application.logging_config = {}\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout\n", + "# Default: False\n", + "# c.Application.show_config = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", + "# Default: False\n", + "# c.Application.show_config_json = False\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# Tool(Application) configuration\n", + "#------------------------------------------------------------------------------\n", + "## This is an application.\n", + "\n", + "# Default: []\n", + "# c.Tool.config_files = []\n", + "\n", + "# Default: {}\n", + "# c.Tool.log_config = {}\n", + "\n", + "## The date format used by logging formatters for %(asctime)s\n", + "# See also: Application.log_datefmt\n", + "# c.Tool.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", + "\n", + "## Filename for the log\n", + "# Default: None\n", + "# c.Tool.log_file = None\n", + "\n", + "## Logging Level for File Logging\n", + "# Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", + "# Default: 'INFO'\n", + "# c.Tool.log_file_level = 'INFO'\n", + "\n", + "## The Logging format template\n", + "# See also: Application.log_format\n", + "# c.Tool.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", + "\n", + "## Set the log level by value or name.\n", + "# See also: Application.log_level\n", + "# c.Tool.log_level = 30\n", + "\n", + "## \n", + "# See also: Application.logging_config\n", + "# c.Tool.logging_config = {}\n", + "\n", + "# Default: False\n", + "# c.Tool.overwrite = False\n", + "\n", + "# Default: traitlets.Undefined\n", + "# c.Tool.provenance_log = traitlets.Undefined\n", + "\n", + "# Default: False\n", + "# c.Tool.quiet = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout\n", + "# See also: Application.show_config\n", + "# c.Tool.show_config = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", + "# See also: Application.show_config_json\n", + "# c.Tool.show_config_json = False\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# MyTool(Tool) configuration\n", + "#------------------------------------------------------------------------------\n", + "# See also: Tool.config_files\n", + "# c.MyTool.config_files = []\n", + "\n", + "## Number of times to run\n", + "# Default: 5\n", + "# c.MyTool.iterations = 5\n", + "\n", + "# See also: Tool.log_config\n", + "# c.MyTool.log_config = {}\n", + "\n", + "## The date format used by logging formatters for %(asctime)s\n", + "# See also: Application.log_datefmt\n", + "# c.MyTool.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", + "\n", + "## Filename for the log\n", + "# See also: Tool.log_file\n", + "# c.MyTool.log_file = None\n", + "\n", + "## Logging Level for File Logging\n", + "# See also: Tool.log_file_level\n", + "# c.MyTool.log_file_level = 'INFO'\n", + "\n", + "## The Logging format template\n", + "# See also: Application.log_format\n", + "# c.MyTool.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", + "\n", + "## Set the log level by value or name.\n", + "# See also: Application.log_level\n", + "# c.MyTool.log_level = 30\n", + "\n", + "## \n", + "# See also: Application.logging_config\n", + "# c.MyTool.logging_config = {}\n", + "\n", + "# See also: Tool.overwrite\n", + "# c.MyTool.overwrite = False\n", + "\n", + "# See also: Tool.provenance_log\n", + "# c.MyTool.provenance_log = traitlets.Undefined\n", + "\n", + "# See also: Tool.quiet\n", + "# c.MyTool.quiet = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout\n", + "# See also: Application.show_config\n", + "# c.MyTool.show_config = False\n", + "\n", + "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", + "# See also: Application.show_config_json\n", + "# c.MyTool.show_config_json = False\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# MyComponent(Component) configuration\n", + "#------------------------------------------------------------------------------\n", + "## A Component that does stuff\n", + "\n", + "## Value to use\n", + "# Default: -1\n", + "# c.MyComponent.value = -1\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# AdvancedComponent(Component) configuration\n", + "#------------------------------------------------------------------------------\n", + "## An advanced technique\n", + "\n", + "## input file name\n", + "# Default: traitlets.Undefined\n", + "# c.AdvancedComponent.infile = traitlets.Undefined\n", + "\n", + "## output file name\n", + "# Default: traitlets.Undefined\n", + "# c.AdvancedComponent.outfile = traitlets.Undefined\n", + "\n", + "## Value to use\n", + "# Default: -1\n", + "# c.AdvancedComponent.value1 = -1\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# SecondaryMyComponent(MyComponent) configuration\n", + "#------------------------------------------------------------------------------\n", + "## A second component\n", + "\n", + "## Value to use\n", + "# See also: MyComponent.value\n", + "# c.SecondaryMyComponent.value = -1\n", + "\n", + "#------------------------------------------------------------------------------\n", + "# TelescopeWiseComponent(TelescopeComponent) configuration\n", + "#------------------------------------------------------------------------------\n", + "## a component that contains parameters that are per-telescope configurable\n", + "\n", + "## Something configurable with telescope patterns.\n", + "# Default: [('type', '*', 5.0)]\n", + "# c.TelescopeWiseComponent.param = [('type', '*', 5.0)]\n", + "\n" + ] + } + ], "source": [ "print(tool.generate_config_file())" ] @@ -595,14 +8903,22 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { "codemirror_mode": { - "name": "ipython" + "name": "ipython", + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", - "nbconvert_exporter": "python" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index 07bad01c378..92e6ba6b614 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -1,3 +1,4 @@ + .. _getting_started: ****************************** @@ -77,7 +78,6 @@ Change to the directory where you cloned ``ctapipe``, and type: .. code-block:: console - $ conda env create -n cta-dev -f environment.yml @@ -238,11 +238,11 @@ You can do this at any time and more than once. It just moves the changes from your local branch on your development machine to your fork on github. -++++++++++++++++++++++++ -4. make a *Pull Request* -++++++++++++++++++++++++ +++++++++++++++++++++++++++ +4. Create a *Pull Request* +++++++++++++++++++++++++++ -When you're happy, you make PR on on your github fork page by clicking +When you're happy, you create PR on on your github fork page by clicking "pull request". You can also do this via *GitHub Desktop* if you have that installed, by pushing the pull-request button in the upper-right-hand corner. @@ -279,7 +279,7 @@ When the PR is accepted, the reviewer will merge your branch into the *master* repo on cta-observatory's account. +++++++++++++++++++++++++++++ -6. delete your feature branch +6. Delete your feature branch +++++++++++++++++++++++++++++ since it is no longer needed (assuming it was accepted and merged in): diff --git a/docs/index.rst b/docs/index.rst index def76c2a40d..37d4fe4ecf8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,7 @@ .. include:: references.txt +:html_theme.sidebar_secondary.remove: true + .. _ctapipe: ============================================== @@ -8,11 +10,19 @@ Prototype CTA Pipeline Framework (``ctapipe``) .. currentmodule:: ctapipe -**version**: |version| +**Version**: |version| + +.. image:: ctapipe_logo.webp + :class: only-light + :align: center + :width: 90% + :alt: The ctapipe logo. -.. image:: ctapipe_logo.png +.. image:: ctapipe_logo_dark.webp + :class: only-dark :align: center :width: 90% + :alt: The ctapipe logo. What is ctapipe? ================ @@ -33,25 +43,150 @@ What is ctapipe? .. _ctapipe_docs: -General documentation -===================== +.. General documentation +.. ===================== .. toctree:: :maxdepth: 1 - :glob: + :hidden: - getting_started_users/index - getting_started/index + User Guide + Developer Guide + ctapipe_api/index development/index tutorials/index examples/index tools/index FAQ data_models/index - ctapipe_api/index bibliography changelog + + +.. grid:: 3 + + .. grid-item-card:: + + :octicon:`book;40px` + + User Guide + ^^^^^^^^^^ + + Learn how to get started as a user. This guide + will help you install ctapipe. + + +++ + + .. button-ref:: getting_started_users/index + :expand: + :color: primary + :click-parent: + + To the user guide + + + .. grid-item-card:: + + :octicon:`person-add;40px` + + Developer Guide + ^^^^^^^^^^^^^^^ + + Learn how to get started as a developer. + This guide will help you install ctapipe for development + and explains how to contribute. + + +++ + + .. button-ref:: getting_started/index + :expand: + :color: primary + :click-parent: + + To the developer guide + + + .. grid-item-card:: + + :octicon:`git-pull-request;40px` + + Development Guidelines + ^^^^^^^^^^^^^^^^^^^^^^ + + These guidelines explain the coding style and the workflow. The ctapipe + enhancement proposals (CEPs) can also be found here. + + +++ + + .. button-ref:: development/index + :expand: + :color: primary + :click-parent: + + To the development guidelines + + + .. grid-item-card:: + + :octicon:`code;40px` + + API Docs + ^^^^^^^^ + + The API docs contain detailed descriptions of + of the various modules and functions included + in ctapipe. + + +++ + + .. button-ref:: ctapipe_api/index + :expand: + :color: primary + :click-parent: + + To API docs + + + .. grid-item-card:: + + :octicon:`mortar-board;40px` + + Tutorials + ^^^^^^^^^ + + A collection of tutorials aimed at new users + and developers to familiarize with ctapipe. + + +++ + + .. button-ref:: tutorials/index + :expand: + :color: primary + :click-parent: + + To the tutorials + + + .. grid-item-card:: + + :octicon:`light-bulb;40px` + + Examples + ^^^^^^^^ + + Some lower-level examples of features included in the ctapipe API. + + +++ + + .. button-ref:: examples/index + :expand: + :color: primary + :click-parent: + + To the examples + + Module API Status (relative to next release) ============================================ @@ -65,3 +200,7 @@ Development Help * Development workflow examples from AstroPy: https://astropy.readthedocs.org/en/latest/development/workflow/development_workflow.html * GIT tutorial: https://www.atlassian.com/git/tutorials/syncing/git-pull * Code distribution and Packaging https://packaging.python.org/en/latest/ + + + + diff --git a/docs/versions.json b/docs/versions.json new file mode 100644 index 00000000000..325cfcaf9eb --- /dev/null +++ b/docs/versions.json @@ -0,0 +1,12 @@ +[ + { + "name": "latest", + "version": "latest", + "url": "https://ctapipe.readthedocs.io/en/latest/" + }, + { + "name": "stable", + "version": "stable", + "url": "https://ctapipe.readthedocs.io/en/stable/" + }, +] From 40aab03aa4f5809176e1ac460eaaa8b90740c5e5 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:53:33 +0200 Subject: [PATCH 015/264] Update setup.cfg pydata dependency --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index d3e867f8638..8f835079cd3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -57,7 +57,7 @@ tests = docs = sphinx - sphinx_rtd_theme + pydata_sphinx_theme sphinx_automodapi nbsphinx numpydoc From bc9d6d7096dd6446bac1e94f7c1b7023915b2089 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 16:00:11 +0200 Subject: [PATCH 016/264] Added sphinx-design --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index 8f835079cd3..0858479d898 100644 --- a/setup.cfg +++ b/setup.cfg @@ -61,6 +61,7 @@ docs = sphinx_automodapi nbsphinx numpydoc + sphinx-design jupyter notebook graphviz From 07ce4bafb771940a8b8b3e318787d4198f9b62e9 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 17:17:22 +0200 Subject: [PATCH 017/264] Fixed sphinx warning for ctapipe.compat.StrEnum --- docs/conf.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index cc5843d1020..813c75a266b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -126,8 +126,9 @@ def setup(app): ("py:class", "astropy.coordinates.baseframe.BaseCoordinateFrame"), ("py:class", "astropy.table.table.Table"), ("py:class", "eventio.simtel.simtelfile.SimTelFile"), - ("py:obj", "ctapipe.calib.CameraCalibrator"), # temporary fix to ignore warning - ("py:obj", "ctapipe.calib.GainSelector"), # temporary fix to ignore warning + ("py:class", "ctapipe.compat.StrEnum"), + ("py:obj", "ctapipe.calib.CameraCalibrator"), # temporary fix to ignore warning + ("py:obj", "ctapipe.calib.GainSelector"), # temporary fix to ignore warning ] # The suffix(es) of source filenames. @@ -237,8 +238,8 @@ def setup(app): "header_links_before_dropdown": 6, "navbar_start": ["navbar-logo", "version-switcher"], "switcher": { - "version_match": version_match, - "json_url": json_url, + "version_match": version_match, + "json_url": json_url, }, "use_edit_page_button": True, "icon_links": [ @@ -246,7 +247,7 @@ def setup(app): "name": "CTA Observatory", "url": "https://www.cta-observatory.org/", "type": "url", - "icon": "https://www.cta-observatory.org/wp-content/themes/ctao/favicon.ico" + "icon": "https://www.cta-observatory.org/wp-content/themes/ctao/favicon.ico", }, ], } From c025fe334da63c057eafd36313bc2a8dd01681d1 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 5 Jul 2023 13:00:14 +0200 Subject: [PATCH 018/264] Fixed sphinx warnings for `ctapipe.instrument` * Fixed warnings by changing ``automodapi`` to ``automodule`` at certain locations * Added change log rst file * Removed unused import of ``pydata_sphinx_theme`` * Updated environment.yml --- docs/_static/ctapipe.css | 2 +- docs/changes/2373.maintenance.rst | 3 +++ docs/conf.py | 10 ++++++---- docs/ctapipe_api/calib/index_camera.rst | 1 - docs/ctapipe_api/instrument/camera.rst | 1 + docs/ctapipe_api/instrument/camera_geometry.rst | 2 +- docs/index.rst | 2 +- docs/versions.json | 12 ------------ environment.yml | 4 +++- 9 files changed, 16 insertions(+), 21 deletions(-) create mode 100644 docs/changes/2373.maintenance.rst delete mode 100644 docs/versions.json diff --git a/docs/_static/ctapipe.css b/docs/_static/ctapipe.css index 243e4af60cd..c7093391670 100644 --- a/docs/_static/ctapipe.css +++ b/docs/_static/ctapipe.css @@ -42,6 +42,6 @@ } html[data-theme="dark"] .sd-shadow-sm { - --sd-color-shadow: #6e6e6e; + --sd-color-shadow: #6e6e6e } diff --git a/docs/changes/2373.maintenance.rst b/docs/changes/2373.maintenance.rst new file mode 100644 index 00000000000..8e5a70349d3 --- /dev/null +++ b/docs/changes/2373.maintenance.rst @@ -0,0 +1,3 @@ +* Switched to ``PyData`` theme for docs +* Updated ``Sphinx`` to version 6.2.1 +* Updated front page of docs diff --git a/docs/conf.py b/docs/conf.py index 813c75a266b..3ea55bb1e6c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,7 +29,6 @@ # Get configuration information from setup.cfg from configparser import ConfigParser -import pydata_sphinx_theme import ctapipe setup_cfg = ConfigParser() @@ -127,8 +126,12 @@ def setup(app): ("py:class", "astropy.table.table.Table"), ("py:class", "eventio.simtel.simtelfile.SimTelFile"), ("py:class", "ctapipe.compat.StrEnum"), - ("py:obj", "ctapipe.calib.CameraCalibrator"), # temporary fix to ignore warning - ("py:obj", "ctapipe.calib.GainSelector"), # temporary fix to ignore warning +] + +# temporary fixes to ignore reference warnings and ensure build +nitpick_ignore += [ + ("py:obj", "ctapipe.calib.CameraCalibrator"), + ("py:obj", "ctapipe.calib.GainSelector"), ] # The suffix(es) of source filenames. @@ -219,7 +222,6 @@ def setup(app): on_rtd = os.environ.get("READTHEDOCS", None) == "True" html_theme = "pydata_sphinx_theme" -# html_theme_path = [pydata_sphinx_theme.__path__] html_favicon = "_static/favicon.ico" diff --git a/docs/ctapipe_api/calib/index_camera.rst b/docs/ctapipe_api/calib/index_camera.rst index 897acf55a82..06302ce2216 100644 --- a/docs/ctapipe_api/calib/index_camera.rst +++ b/docs/ctapipe_api/calib/index_camera.rst @@ -38,7 +38,6 @@ Reference/API ************* .. automodapi:: ctapipe.calib.camera - :no-main-docstr: ------------------------------ diff --git a/docs/ctapipe_api/instrument/camera.rst b/docs/ctapipe_api/instrument/camera.rst index 0b45cad8fa0..a24db0326d9 100644 --- a/docs/ctapipe_api/instrument/camera.rst +++ b/docs/ctapipe_api/instrument/camera.rst @@ -22,5 +22,6 @@ Reference/API .. automodapi:: ctapipe.instrument.camera :no-inheritance-diagram: + .. automodapi:: ctapipe.instrument.camera.description :no-inheritance-diagram: diff --git a/docs/ctapipe_api/instrument/camera_geometry.rst b/docs/ctapipe_api/instrument/camera_geometry.rst index 94336be2760..2650cbb0a41 100644 --- a/docs/ctapipe_api/instrument/camera_geometry.rst +++ b/docs/ctapipe_api/instrument/camera_geometry.rst @@ -91,4 +91,4 @@ Reference/API ============= .. automodapi:: ctapipe.instrument.camera.geometry - :no-inheritance-diagram: + :no-inheritance-diagram: diff --git a/docs/index.rst b/docs/index.rst index 37d4fe4ecf8..e550bdfef93 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -52,8 +52,8 @@ What is ctapipe? User Guide Developer Guide - ctapipe_api/index development/index + ctapipe_api/index tutorials/index examples/index tools/index diff --git a/docs/versions.json b/docs/versions.json deleted file mode 100644 index 325cfcaf9eb..00000000000 --- a/docs/versions.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "name": "latest", - "version": "latest", - "url": "https://ctapipe.readthedocs.io/en/latest/" - }, - { - "name": "stable", - "version": "stable", - "url": "https://ctapipe.readthedocs.io/en/stable/" - }, -] diff --git a/environment.yml b/environment.yml index a45df14902b..bbc3bad0b47 100644 --- a/environment.yml +++ b/environment.yml @@ -36,7 +36,8 @@ dependencies: - setuptools - sphinx - sphinx-automodapi - - sphinx_rtd_theme + - pydata-sphinx-theme + - sphinx-design - tomli - towncrier - tqdm @@ -47,4 +48,5 @@ dependencies: - zlib - zstandard - eventio>=1.9.1 + - jinja2 - ffmpeg # for making movies in the documentation From ce1bc0cb787afb2648e251fb03cac7ae5287ae95 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 5 Jul 2023 14:46:44 +0200 Subject: [PATCH 019/264] Allow only writing simulation info and trigger info in datawriter, remove obsolete dump-triggers --- ctapipe/io/datawriter.py | 34 ++++--- ctapipe/tools/dump_triggers.py | 142 ---------------------------- ctapipe/tools/process.py | 1 + ctapipe/tools/tests/test_process.py | 22 +++++ ctapipe/tools/tests/test_tools.py | 13 --- docs/changes/2375.api.rst | 5 + setup.cfg | 1 - 7 files changed, 47 insertions(+), 171 deletions(-) delete mode 100644 ctapipe/tools/dump_triggers.py create mode 100644 docs/changes/2375.api.rst diff --git a/ctapipe/io/datawriter.py b/ctapipe/io/datawriter.py index 0b0631d5af9..daca2aa3f55 100644 --- a/ctapipe/io/datawriter.py +++ b/ctapipe/io/datawriter.py @@ -298,15 +298,11 @@ def __call__(self, event: ArrayEventContainer): Write a single event to the output file. """ self._at_least_one_event = True + self.log.debug("WRITING EVENT %s", event.index) - # Write subarray event data self._write_subarray_pointing(event, writer=self._writer) + self._write_trigger(self._writer, event) - self.log.debug("WRITING EVENT %s", event.index) - self._writer.write( - table_name="dl1/event/subarray/trigger", - containers=[event.index, event.trigger], - ) if event.simulation is not None and event.simulation.shower is not None: self._writer.write( table_name="simulation/event/subarray/shower", @@ -415,8 +411,9 @@ def _setup_output_path(self): self.write_muon_parameters, ] if not any(writable_things): - raise ToolConfigurationError( - "DataWriter configured to write no information" + self.log.warning( + "No processing results were selected for writing" + ", only writing trigger and simulation information" ) def _setup_writer(self): @@ -616,6 +613,20 @@ def table_name(self, tel_id): """construct dataset table names depending on chosen split method""" return f"tel_{tel_id:03d}" + def _write_trigger(self, writer: TableWriter, event: ArrayEventContainer): + """ + Write trigger information + """ + self._writer.write( + table_name="dl1/event/subarray/trigger", + containers=[event.index, event.trigger], + ) + + for tel_id, trigger in event.trigger.tel.items(): + writer.write( + "dl1/event/telescope/trigger", (_get_tel_index(event, tel_id), trigger) + ) + def _write_r1_telescope_events( self, writer: TableWriter, event: ArrayEventContainer ): @@ -646,13 +657,6 @@ def _write_dl1_telescope_events( event """ - # write the telescope tables - # trigger info - for tel_id, trigger in event.trigger.tel.items(): - writer.write( - "dl1/event/telescope/trigger", [_get_tel_index(event, tel_id), trigger] - ) - # pointing info for tel_id, pnt in event.pointing.tel.items(): current_pointing = (pnt.azimuth, pnt.altitude) diff --git a/ctapipe/tools/dump_triggers.py b/ctapipe/tools/dump_triggers.py deleted file mode 100644 index af03cdd87a9..00000000000 --- a/ctapipe/tools/dump_triggers.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -dump a table of the event times and trigger patterns from a -simtelarray input file. -""" - -import numpy as np -from astropy import units as u -from astropy.table import Table - -from ..core import Provenance, Tool -from ..core.traits import Dict, Path, Unicode -from ..io import EventSource - -MAX_TELS = 1000 - - -class DumpTriggersTool(Tool): - description = Unicode(__doc__) - name = "ctapipe-dump-triggers" - - # ============================================= - # configuration parameters: - # ============================================= - - input_path = Path( - exists=True, directory_ok=False, help="input simtelarray file", allow_none=False - ).tag(config=True) - - output_path = Path( - default_value="triggers.fits", - directory_ok=False, - help="output filename (*.fits, *.h5)", - ).tag(config=True) - - # ============================================= - # map low-level options to high-level command-line options - # ============================================= - - aliases = Dict( - { - "input": "DumpTriggersTool.input_path", - "output": "DumpTriggersTool.output_path", - } - ) - - examples = ( - "ctapipe-dump-triggers --input gamma.simtel.gz " - "--output trig.fits --overwrite" - "\n\n" - "If you want to see more output, use --log_level=DEBUG" - ) - - # ============================================= - # The methods of the Tool (initialize, start, finish): - # ============================================= - - def add_event_to_table(self, event): - """ - add the current hessio event to a row in the `self.events` table - """ - time = event.trigger.time - - if self._prev_time is None: - self._prev_time = time - - if self._current_starttime is None: - self._current_starttime = time - - relative_time = time - self._current_starttime - delta_t = time - self._prev_time - self._prev_time = time - - # build the trigger pattern as a fixed-length array - # (better for storage in FITS format) - # trigtels = event.get_telescope_with_data_list() - trigtels = event.dl0.tel.keys() - self._current_trigpattern[:] = 0 # zero the trigger pattern - self._current_trigpattern[list(trigtels)] = 1 # set the triggered tels - # to 1 - - # insert the row into the table - self.events.add_row( - ( - event.index.event_id, - relative_time.sec, - delta_t.sec, - len(trigtels), - self._current_trigpattern, - ) - ) - - def setup(self): - """setup function, called before `start()`""" - - self.check_output(self.output_path) - self.events = Table( - names=["EVENT_ID", "T_REL", "DELTA_T", "N_TRIG", "TRIGGERED_TELS"], - dtype=[np.int64, np.float64, np.float64, np.int32, np.uint8], - ) - - self.events["TRIGGERED_TELS"].shape = (0, MAX_TELS) - self.events["T_REL"].unit = u.s - self.events["T_REL"].description = "Time relative to first event" - self.events["DELTA_T"].unit = u.s - self.events.meta["INPUT"] = str(self.input_path) - - self._current_trigpattern = np.zeros(MAX_TELS) - self._current_starttime = None - self._prev_time = None - - def start(self): - """main event loop""" - with EventSource(self.input_path) as source: - for event in source: - self.add_event_to_table(event) - - def finish(self): - """ - finish up and write out results (called automatically after - `start()`) - """ - # write out the final table - try: - if ".fits" in self.output_path.suffixes: - self.events.write(self.output_path, overwrite=self.overwrite) - elif self.output_path.suffix in (".hdf5", ".h5", ".hdf"): - self.events.write( - self.output_path, path="/events", overwrite=self.overwrite - ) - else: - self.events.write(self.output_path) - - Provenance().add_output_file(self.output_path) - except IOError as err: - self.log.warning("Couldn't write output (%s)", err) - - self.log.info("\n %s", self.events) - - -def main(): - tool = DumpTriggersTool() - tool.run() diff --git a/ctapipe/tools/process.py b/ctapipe/tools/process.py index b7dc27de185..32848532623 100644 --- a/ctapipe/tools/process.py +++ b/ctapipe/tools/process.py @@ -282,6 +282,7 @@ def start(self): """ Process events """ + self.log.info("applying calibration: %s", self.should_calibrate) self.log.info("(re)compute DL1: %s", self.should_compute_dl1) self.log.info("(re)compute DL2: %s", self.should_compute_dl2) self.log.info( diff --git a/ctapipe/tools/tests/test_process.py b/ctapipe/tools/tests/test_process.py index 04a87079cb1..01039649265 100644 --- a/ctapipe/tools/tests/test_process.py +++ b/ctapipe/tools/tests/test_process.py @@ -478,3 +478,25 @@ def test_plugin_help(capsys): assert ( "PluginReconstructor.foo" in captured.out ), "Tool help is missing plugin classes, did you run `pip install -e ./test_plugin`?" + + +def test_only_trigger_and_simulation(tmp_path): + output = tmp_path / "only_trigger_and_simulation.h5" + + run_tool( + ProcessorTool(), + argv=[ + "--input=dataset://gamma_prod5.simtel.zst", + f"--output={output}", + "--no-write-parameters", + "--overwrite", + ], + cwd=tmp_path, + raises=True, + ) + + with TableLoader(output, load_simulated=True) as loader: + events = loader.read_subarray_events() + assert len(events) == 7 + assert "tels_with_trigger" in events.colnames + assert "true_energy" in events.colnames diff --git a/ctapipe/tools/tests/test_tools.py b/ctapipe/tools/tests/test_tools.py index c31c7736456..c7e2dd46cf9 100644 --- a/ctapipe/tools/tests/test_tools.py +++ b/ctapipe/tools/tests/test_tools.py @@ -81,19 +81,6 @@ def test_fileinfo(tmp_path, dl1_image_file): assert "CTA ACTIVITY ID" in header[str(dl1_image_file)] -def test_dump_triggers(tmp_path): - from ctapipe.tools.dump_triggers import DumpTriggersTool - - sys.argv = ["dump_triggers"] - output_path = tmp_path / "triggers.fits" - tool = DumpTriggersTool(input_path=PROD5B_PATH, output_path=str(output_path)) - - assert run_tool(tool, cwd=tmp_path) == 0 - - assert output_path.exists() - assert run_tool(tool, ["--help-all"]) == 0 - - def test_dump_instrument(tmp_path): from ctapipe.tools.dump_instrument import DumpInstrumentTool diff --git a/docs/changes/2375.api.rst b/docs/changes/2375.api.rst new file mode 100644 index 00000000000..36ab27b3d7e --- /dev/null +++ b/docs/changes/2375.api.rst @@ -0,0 +1,5 @@ +The ``ctapipe-dump-triggers`` tool was removed, since it wrote a custom data format +not compatble with e.g. the output of the ``DataWriter`` and ``ctapipe-process``. +If you only want to store trigger and simulation information from simulated / DL0 +input files into the ctapipe format HDF5 files, you can now use +``ctapipe-process -i -o --no-write-parameters``. diff --git a/setup.cfg b/setup.cfg index 5092c8e6292..6386aa80308 100644 --- a/setup.cfg +++ b/setup.cfg @@ -88,7 +88,6 @@ exclude = [options.entry_points] console_scripts = ctapipe-info = ctapipe.tools.info:main - ctapipe-dump-triggers = ctapipe.tools.dump_triggers:main ctapipe-dump-instrument=ctapipe.tools.dump_instrument:main ctapipe-display-dl1 = ctapipe.tools.display_dl1:main ctapipe-process = ctapipe.tools.process:main From 2aed4dee284bfcb6271b416c2e1fc74eaf4cc9e0 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 5 Jul 2023 16:29:32 +0200 Subject: [PATCH 020/264] Attempt at a temporary workaround --- docs/conf.py | 10 ++++++++-- docs/ctapipe_api/instrument/camera_geometry.rst | 2 +- docs/ctapipe_api/instrument/camera_readout.rst | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 3ea55bb1e6c..1a7c0595a6c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ numpydoc_show_class_members = False -# numpydoc_class_members_toctree = False +numpydoc_class_members_toctree = False nbsphinx_timeout = 200 # allow max 2 minutes to build each notebook @@ -128,10 +128,15 @@ def setup(app): ("py:class", "ctapipe.compat.StrEnum"), ] -# temporary fixes to ignore reference warnings and ensure build +# temporary workaround to ignore reference warnings and ensure build nitpick_ignore += [ ("py:obj", "ctapipe.calib.CameraCalibrator"), ("py:obj", "ctapipe.calib.GainSelector"), + ("py:obj", "CameraGeometry"), + ("py:obj", "ctapipe.instrument.camera.CameraGeometry"), + ("py:obj", "ctapipe.instrument.camera.CameraDescription"), + ("py:obj", "ctapipe.instrument.camera.PixelShape"), + ("py:obj", "ctapipe.instrument.camera.CameraReadout"), ] # The suffix(es) of source filenames. @@ -256,6 +261,7 @@ def setup(app): html_sidebars = { "**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"], + "index.rst": [], } diff --git a/docs/ctapipe_api/instrument/camera_geometry.rst b/docs/ctapipe_api/instrument/camera_geometry.rst index 2650cbb0a41..94336be2760 100644 --- a/docs/ctapipe_api/instrument/camera_geometry.rst +++ b/docs/ctapipe_api/instrument/camera_geometry.rst @@ -91,4 +91,4 @@ Reference/API ============= .. automodapi:: ctapipe.instrument.camera.geometry - :no-inheritance-diagram: + :no-inheritance-diagram: diff --git a/docs/ctapipe_api/instrument/camera_readout.rst b/docs/ctapipe_api/instrument/camera_readout.rst index b455257b5a1..d98cc235ddb 100644 --- a/docs/ctapipe_api/instrument/camera_readout.rst +++ b/docs/ctapipe_api/instrument/camera_readout.rst @@ -32,8 +32,8 @@ Input/Output You can write out a `CameraReadout` by using the ``CameraReadout.to_table()`` - method to turn it into a `~astropy.table.Table`, and then call its ``write()`` - function. Reading it back in can be done with ``CameraReadout.from_table()``. +method to turn it into a `~astropy.table.Table`, and then call its ``write()`` +function. Reading it back in can be done with ``CameraReadout.from_table()``. .. code-block:: python From 8b60b9a560867ebc6fb1771d3bfde8e74f69f878 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 5 Jul 2023 17:07:43 +0200 Subject: [PATCH 021/264] Added ``:noindex:`` option to certain rst files * Added ``:noindex:`` to get rid of warnings * Works at least locally --- docs/ctapipe_api/instrument/camera.rst | 1 + docs/ctapipe_api/instrument/camera_geometry.rst | 1 + docs/ctapipe_api/instrument/camera_readout.rst | 1 + 3 files changed, 3 insertions(+) diff --git a/docs/ctapipe_api/instrument/camera.rst b/docs/ctapipe_api/instrument/camera.rst index a24db0326d9..fdcfad70b42 100644 --- a/docs/ctapipe_api/instrument/camera.rst +++ b/docs/ctapipe_api/instrument/camera.rst @@ -25,3 +25,4 @@ Reference/API .. automodapi:: ctapipe.instrument.camera.description :no-inheritance-diagram: + :noindex: diff --git a/docs/ctapipe_api/instrument/camera_geometry.rst b/docs/ctapipe_api/instrument/camera_geometry.rst index 94336be2760..fedbf2138f3 100644 --- a/docs/ctapipe_api/instrument/camera_geometry.rst +++ b/docs/ctapipe_api/instrument/camera_geometry.rst @@ -92,3 +92,4 @@ Reference/API .. automodapi:: ctapipe.instrument.camera.geometry :no-inheritance-diagram: + :noindex: diff --git a/docs/ctapipe_api/instrument/camera_readout.rst b/docs/ctapipe_api/instrument/camera_readout.rst index d98cc235ddb..817a199cc58 100644 --- a/docs/ctapipe_api/instrument/camera_readout.rst +++ b/docs/ctapipe_api/instrument/camera_readout.rst @@ -55,3 +55,4 @@ Reference/API .. automodapi:: ctapipe.instrument.camera.readout :no-inheritance-diagram: + :noindex: From ea996fe787d070758a6e9639bf04d7a5aaf75b10 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 6 Jul 2023 09:43:26 +0200 Subject: [PATCH 022/264] Remove writer argument from internal functions --- ctapipe/io/datawriter.py | 71 ++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/ctapipe/io/datawriter.py b/ctapipe/io/datawriter.py index daca2aa3f55..3a5cc8f00dd 100644 --- a/ctapipe/io/datawriter.py +++ b/ctapipe/io/datawriter.py @@ -27,7 +27,7 @@ from .eventsource import EventSource from .hdf5tableio import HDF5TableWriter from .simteleventsource import SimTelEventSource -from .tableio import FixedPointColumnTransform, TableWriter, TelListToMaskTransform +from .tableio import FixedPointColumnTransform, TelListToMaskTransform __all__ = ["DataWriter", "DATA_MODEL_VERSION", "write_reference_metadata_headers"] @@ -300,8 +300,8 @@ def __call__(self, event: ArrayEventContainer): self._at_least_one_event = True self.log.debug("WRITING EVENT %s", event.index) - self._write_subarray_pointing(event, writer=self._writer) - self._write_trigger(self._writer, event) + self._write_subarray_pointing(event) + self._write_trigger(event) if event.simulation is not None and event.simulation.shower is not None: self._writer.write( @@ -318,21 +318,21 @@ def __call__(self, event: ArrayEventContainer): ) if self.write_waveforms: - self._write_r1_telescope_events(self._writer, event) + self._write_r1_telescope_events(event) if self.write_raw_waveforms: - self._write_r0_telescope_events(self._writer, event) + self._write_r0_telescope_events(event) # write telescope event data - self._write_dl1_telescope_events(self._writer, event) + self._write_dl1_telescope_events(event) # write DL2 info if requested if self.write_showers: - self._write_dl2_telescope_events(self._writer, event) - self._write_dl2_stereo_event(self._writer, event) + self._write_dl2_telescope_events(event) + self._write_dl2_stereo_event(event) if self.write_muon_parameters: - self._write_muon_telescope_events(self._writer, event) + self._write_muon_telescope_events(event) def finish(self): """called after all events are done""" @@ -354,7 +354,6 @@ def finish(self): ) self._write_context_metadata_headers() - self._writer.close() @property @@ -504,13 +503,13 @@ def _setup_writer(self): self._writer = writer self.log.debug("Writer initialized: %s", self._writer) - def _write_subarray_pointing(self, event: ArrayEventContainer, writer: TableWriter): + def _write_subarray_pointing(self, event: ArrayEventContainer): """store subarray pointing info in a monitoring table""" pnt = event.pointing current_pointing = (pnt.array_azimuth, pnt.array_altitude) if current_pointing != self._last_pointing: pnt.prefix = "" - writer.write("dl1/monitoring/subarray/pointing", [event.trigger, pnt]) + self._writer.write("dl1/monitoring/subarray/pointing", [event.trigger, pnt]) self._last_pointing = current_pointing def _write_scheduling_and_observation_blocks(self): @@ -613,7 +612,7 @@ def table_name(self, tel_id): """construct dataset table names depending on chosen split method""" return f"tel_{tel_id:03d}" - def _write_trigger(self, writer: TableWriter, event: ArrayEventContainer): + def _write_trigger(self, event: ArrayEventContainer): """ Write trigger information """ @@ -623,35 +622,29 @@ def _write_trigger(self, writer: TableWriter, event: ArrayEventContainer): ) for tel_id, trigger in event.trigger.tel.items(): - writer.write( + self._writer.write( "dl1/event/telescope/trigger", (_get_tel_index(event, tel_id), trigger) ) - def _write_r1_telescope_events( - self, writer: TableWriter, event: ArrayEventContainer - ): + def _write_r1_telescope_events(self, event: ArrayEventContainer): for tel_id, r1_tel in event.r1.tel.items(): tel_index = _get_tel_index(event, tel_id) table_name = self.table_name(tel_id) r1_tel.prefix = "" - writer.write(f"r1/event/telescope/{table_name}", [tel_index, r1_tel]) + self._writer.write(f"r1/event/telescope/{table_name}", [tel_index, r1_tel]) - def _write_r0_telescope_events( - self, writer: TableWriter, event: ArrayEventContainer - ): + def _write_r0_telescope_events(self, event: ArrayEventContainer): for tel_id, r0_tel in event.r0.tel.items(): tel_index = _get_tel_index(event, tel_id) table_name = self.table_name(tel_id) r0_tel.prefix = "" - writer.write(f"r0/event/telescope/{table_name}", [tel_index, r0_tel]) + self._writer.write(f"r0/event/telescope/{table_name}", [tel_index, r0_tel]) - def _write_dl1_telescope_events( - self, writer: TableWriter, event: ArrayEventContainer - ): + def _write_dl1_telescope_events(self, event: ArrayEventContainer): """ add entries to the event/telescope tables for each telescope in a single event @@ -662,7 +655,7 @@ def _write_dl1_telescope_events( current_pointing = (pnt.azimuth, pnt.altitude) if current_pointing != self._last_pointing_tel[tel_id]: pnt.prefix = "" - writer.write( + self._writer.write( f"dl1/monitoring/telescope/pointing/tel_{tel_id:03d}", [event.trigger.tel[tel_id], pnt], ) @@ -678,7 +671,7 @@ def _write_dl1_telescope_events( table_name = self.table_name(tel_id) if self.write_parameters: - writer.write( + self._writer.write( table_name=f"dl1/event/telescope/parameters/{table_name}", containers=[tel_index, *dl1_camera.parameters.values()], ) @@ -689,14 +682,14 @@ def _write_dl1_telescope_events( "DataWriter.write_images is True but event does not contain image" ) - writer.write( + self._writer.write( table_name=f"dl1/event/telescope/images/{table_name}", containers=[tel_index, dl1_camera], ) if self._is_simulation: # always write this, so that at least the sum is included - writer.write( + self._writer.write( f"simulation/event/telescope/images/{table_name}", [tel_index, event.simulation.tel[tel_id]], ) @@ -709,7 +702,7 @@ def _write_dl1_telescope_events( true_parameters = event.simulation.tel[tel_id].true_parameters # only write the available containers, no peak time related # features for true image available. - writer.write( + self._writer.write( f"simulation/event/telescope/parameters/{table_name}", [ tel_index, @@ -721,21 +714,17 @@ def _write_dl1_telescope_events( ], ) - def _write_muon_telescope_events( - self, writer: TableWriter, event: ArrayEventContainer - ): + def _write_muon_telescope_events(self, event: ArrayEventContainer): for tel_id, muon in event.muon.tel.items(): table_name = self.table_name(tel_id) tel_index = _get_tel_index(event, tel_id) - writer.write( + self._writer.write( f"dl1/event/telescope/muon/{table_name}", [tel_index, muon.ring, muon.parameters, muon.efficiency], ) - def _write_dl2_telescope_events( - self, writer: TableWriter, event: ArrayEventContainer - ): + def _write_dl2_telescope_events(self, event: ArrayEventContainer): """ write per-telescope DL2 shower information. @@ -753,9 +742,11 @@ def _write_dl2_telescope_events( f"dl2/event/telescope/{container_name}/{algorithm}/{table_name}" ) - writer.write(table_name=name, containers=[tel_index, container]) + self._writer.write( + table_name=name, containers=[tel_index, container] + ) - def _write_dl2_stereo_event(self, writer: TableWriter, event: ArrayEventContainer): + def _write_dl2_stereo_event(self, event: ArrayEventContainer): """ write per-telescope DL2 shower information to e.g. `/dl2/event/stereo/{geometry,energy,classification}/` @@ -766,7 +757,7 @@ def _write_dl2_stereo_event(self, writer: TableWriter, event: ArrayEventContaine # note this will only write info if the particular algorithm # generated it (otherwise the algorithm map is empty, and no # data will be written) - writer.write( + self._writer.write( table_name=f"dl2/event/subarray/{container_name}/{algorithm}", containers=[event.index, container], ) From f3f6d00239d6515dafd3420b07fcb7ad55f3e496 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 7 Jul 2023 09:25:06 +0200 Subject: [PATCH 023/264] Workarounds for duplicate reference warnings * use autosummary and some manually added titles instead of automodapi in ``ctapipe_api/instrument/camera.rst`` and ``ctapipe_api/calib/index.rst`` * allows to circumvent duplicate reference warnings * removed ``nipick_ignore`` entries added in previous commits of this ``update-docs`` branch --- docs/conf.py | 10 ----- docs/ctapipe_api/calib/index.rst | 29 +++++++++--- docs/ctapipe_api/instrument/camera.rst | 28 +++++++++--- .../instrument/camera_geometry.rst | 45 +++++++++---------- .../ctapipe_api/instrument/camera_readout.rst | 1 - docs/ctapipe_api/instrument/index.rst | 3 +- docs/ctapipe_api/instrument/telescope.rst | 1 + 7 files changed, 70 insertions(+), 47 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 1a7c0595a6c..ab78da49645 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -128,16 +128,6 @@ def setup(app): ("py:class", "ctapipe.compat.StrEnum"), ] -# temporary workaround to ignore reference warnings and ensure build -nitpick_ignore += [ - ("py:obj", "ctapipe.calib.CameraCalibrator"), - ("py:obj", "ctapipe.calib.GainSelector"), - ("py:obj", "CameraGeometry"), - ("py:obj", "ctapipe.instrument.camera.CameraGeometry"), - ("py:obj", "ctapipe.instrument.camera.CameraDescription"), - ("py:obj", "ctapipe.instrument.camera.PixelShape"), - ("py:obj", "ctapipe.instrument.camera.CameraReadout"), -] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: diff --git a/docs/ctapipe_api/calib/index.rst b/docs/ctapipe_api/calib/index.rst index 28a105b5f61..0be57e5fccc 100644 --- a/docs/ctapipe_api/calib/index.rst +++ b/docs/ctapipe_api/calib/index.rst @@ -1,8 +1,12 @@ .. _calib: -=============================== - Calibration (`~ctapipe.calib`) -=============================== +.. temporary worakaround to at least have calib in the title, + the reason is the usage of autosummary in the Reference/API + section below + +======================================== +Calibration (``calib``) +======================================== .. currentmodule:: ctapipe.calib @@ -44,6 +48,19 @@ Submodules Reference/API ============= -.. automodapi:: ctapipe.calib - :no-inheritance-diagram: - :noindex: +.. What follows is a *temporary* workaround to circumvent + various warnings of duplicate references caused by + calling automodapi on the camera package. + +ctapipe.calib Package +--------------------- + +Calibration + +.. raw:: html + +

Classes

+ +.. autosummary:: + ~camera.CameraCalibrator + ~camera.GainSelector diff --git a/docs/ctapipe_api/instrument/camera.rst b/docs/ctapipe_api/instrument/camera.rst index fdcfad70b42..27dfeb322db 100644 --- a/docs/ctapipe_api/instrument/camera.rst +++ b/docs/ctapipe_api/instrument/camera.rst @@ -5,8 +5,8 @@ Camera Description ================== -The `CameraDescription` contains classes holding information about the -Cherenkov camera, namely the `CameraGeometry` and `CameraReadout` classes. +The `~CameraDescription` contains classes holding information about the +Cherenkov camera, namely the `~CameraGeometry` and `~CameraReadout` classes. .. toctree:: @@ -17,12 +17,28 @@ Cherenkov camera, namely the `CameraGeometry` and `CameraReadout` classes. Reference/API -------------- +============= +.. What follows is a temporary workaround to circumvent + various warnings of duplicate references caused by + calling automodapi on the camera package. + +ctapipe.instrument.camera Package +--------------------------------- + +.. raw:: html + +

Classes

+ + +.. autosummary:: + + ~CameraDescription + ~CameraGeometry + ~PixelShape + ~camera.geometry.UnknownPixelShapeWarning + ~CameraReadout -.. automodapi:: ctapipe.instrument.camera - :no-inheritance-diagram: .. automodapi:: ctapipe.instrument.camera.description :no-inheritance-diagram: - :noindex: diff --git a/docs/ctapipe_api/instrument/camera_geometry.rst b/docs/ctapipe_api/instrument/camera_geometry.rst index fedbf2138f3..ddf30ae6e8c 100644 --- a/docs/ctapipe_api/instrument/camera_geometry.rst +++ b/docs/ctapipe_api/instrument/camera_geometry.rst @@ -5,7 +5,7 @@ Camera Geometries ================= -The `CameraGeometry` provides an easy way to work with images or data +The `~ctapipe.instrument.CameraGeometry` provides an easy way to work with images or data cubes related to Cherenkov Cameras. In *ctapipe*, a camera image is simply a flat 1D array (or 2D if time information is included), where there is one value per pixel. Of course, to work with such an array, @@ -14,38 +14,38 @@ Since CTA has at least 6 different camera types, and may have multiple versions of each as revisions are made, it is necessary to have a common way to describe all cameras. -So far there are several ways to construct a `CameraGeometry`: +So far there are several ways to construct a `~ctapipe.instrument.CameraGeometry`: -* `~ctapipe.io.EventSource` instances have a ``subarray`` attribute, +* `~ctapipe.io.EventSource` instances have a :attr:`~ctapipe.io.EventSource.subarray` attribute, e.g. to obtain the geometry for the telescope with id 1, use: - ``source.subarray.tel[1].camera.geometry``. - `~ctapipe.io.TableLoader` also has the ``.subarray`` attribute. + ``source.subarray.tel[1].camera.geometry``. The + `~ctapipe.io.TableLoader` instance also has the ``.subarray`` attribute. -* use the `CameraGeometry` constructor, where one has to specify all +* use the `~ctapipe.instrument.CameraGeometry` constructor, where one has to specify all necessary information (pixel positions, types, areas, etc) * load it from a pre-written file (which can be in any format - supported by ``astropy.table``, as long as that format allows for + supported by `astropy.table`, as long as that format allows for header-keywords as well as table entries. -Once loaded, the `CameraGeometry` object gives you access the pixel +Once loaded, the `~ctapipe.instrument.CameraGeometry` object gives you access the pixel positions, areas, neighbors, and shapes. -`CameraGeometry` is used by most image processing algorithms in the +`~ctapipe.instrument.CameraGeometry` is used by most image processing algorithms in the `ctapipe.image` module, as well as displays in the `ctapipe.visualization` module. Input/Output ------------ -You can write out a `CameraGeometry` by using the `CameraGeometry.to_table()` - method to turn it into an `astropy.table.Table`, and then call its `~astropy.table.Table.write` - function. Reading it back in can be done with `CameraGeometry.from_table()` +You can write out a `~ctapipe.instrument.CameraGeometry` by using the `CameraGeometry.to_table()` +method to turn it into an `astropy.table.Table`, and then call its `~astropy.table.Table.write` +function. Reading it back in can be done with `~ctapipe.instrument.CameraGeometry.from_table()` .. code-block:: python - geom = CameraGeometry(...) # constructed elsewhere + geom = ~ctapipe.instrument.CameraGeometry(...) # constructed elsewhere geom.to_table().write('mycam.fits.gz') # FITS output geom.to_table().write('mycam.h5', path='/cameras/mycam') # hdf5 output @@ -53,28 +53,28 @@ You can write out a `CameraGeometry` by using the `CameraGeometry.to_table()` # later read back in: - geom = CameraGeometry.from_table('mycam.ecsv', format='ascii.ecsv') - geom = CameraGeometry.from_table('mycam.fits.gz') - geom = CameraGeometry.from_table('mycam.h5', path='/cameras/mycam') + geom = ~ctapipe.instrument.CameraGeometry.from_table('mycam.ecsv', format='ascii.ecsv') + geom = ~ctapipe.instrument.CameraGeometry.from_table('mycam.fits.gz') + geom = ~ctapipe.instrument.CameraGeometry.from_table('mycam.h5', path='/cameras/mycam') A note on Pixel Neighbors ------------------------- -The `CameraGeometry` object provides two pixel-neighbor -representations: a *neighbor adjacency list* (in the ``neighbors`` -attribute) and a *pixel adjacency matrix* (in the ``neighbor_matrix`` +The `~ctapipe.instrument.CameraGeometry` object provides two pixel-neighbor +representations: a *neighbor adjacency list* (in the :attr:`~CameraGeometry.neighbors` +attribute) and a *pixel adjacency matrix* (in the :attr:`~CameraGeometry.neighbor_matrix` attribute). The former is a list of lists, where element *i* is a list of neighbors *j* of the *i*th pixel. The latter is a 2D matrix where row *i* is a boolean mask of pixels that are neighbors. It is not necessary to load or specify either of these neighbor -representations when constructing a `CameraGeometry`, since they +representations when constructing a `~ctapipe.instrument.CameraGeometry`, since they will be computed on-the-fly if left blank, using a KD-tree nearest-neighbor algorithm. It is recommended that all algorithms that need to be computationally -fast use the ``neighbor_matrix`` attribute, particularly in conjunction -with ``numpy`` operations, since it is quite speed-efficient. +fast use the :attr:`~CameraGeometry.neighbor_matrix` attribute, particularly in conjunction +with `numpy` operations, since it is quite speed-efficient. Examples -------- @@ -92,4 +92,3 @@ Reference/API .. automodapi:: ctapipe.instrument.camera.geometry :no-inheritance-diagram: - :noindex: diff --git a/docs/ctapipe_api/instrument/camera_readout.rst b/docs/ctapipe_api/instrument/camera_readout.rst index 817a199cc58..d98cc235ddb 100644 --- a/docs/ctapipe_api/instrument/camera_readout.rst +++ b/docs/ctapipe_api/instrument/camera_readout.rst @@ -55,4 +55,3 @@ Reference/API .. automodapi:: ctapipe.instrument.camera.readout :no-inheritance-diagram: - :noindex: diff --git a/docs/ctapipe_api/instrument/index.rst b/docs/ctapipe_api/instrument/index.rst index b3b98c040b1..3e2a53ebf36 100644 --- a/docs/ctapipe_api/instrument/index.rst +++ b/docs/ctapipe_api/instrument/index.rst @@ -6,10 +6,11 @@ Instrument (`~ctapipe.instrument`) .. currentmodule:: ctapipe.instrument + Introduction ============ -The `ctapipe.instrument` module contains classes and methods for +The `~ctapipe.instrument` module contains classes and methods for describing the instrumental layout and configuration. This module is under heavy restructuring and should not be considered diff --git a/docs/ctapipe_api/instrument/telescope.rst b/docs/ctapipe_api/instrument/telescope.rst index 8f77e29c258..e30b9364ead 100644 --- a/docs/ctapipe_api/instrument/telescope.rst +++ b/docs/ctapipe_api/instrument/telescope.rst @@ -14,3 +14,4 @@ Reference/API ------------- .. automodapi:: ctapipe.instrument.telescope + :no-inheritance-diagram: From 958e5d95f1cdf1a667247af9c9708c6b43aaf047 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 7 Jul 2023 10:22:50 +0200 Subject: [PATCH 024/264] Fix heading issue --- docs/_static/ctapipe.css | 2 +- docs/ctapipe_api/calib/index.rst | 5 ++--- docs/ctapipe_api/instrument/camera.rst | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/_static/ctapipe.css b/docs/_static/ctapipe.css index c7093391670..243e4af60cd 100644 --- a/docs/_static/ctapipe.css +++ b/docs/_static/ctapipe.css @@ -42,6 +42,6 @@ } html[data-theme="dark"] .sd-shadow-sm { - --sd-color-shadow: #6e6e6e + --sd-color-shadow: #6e6e6e; } diff --git a/docs/ctapipe_api/calib/index.rst b/docs/ctapipe_api/calib/index.rst index 0be57e5fccc..9cd202747dd 100644 --- a/docs/ctapipe_api/calib/index.rst +++ b/docs/ctapipe_api/calib/index.rst @@ -57,9 +57,8 @@ ctapipe.calib Package Calibration -.. raw:: html - -

Classes

+Classes +^^^^^^^ .. autosummary:: ~camera.CameraCalibrator diff --git a/docs/ctapipe_api/instrument/camera.rst b/docs/ctapipe_api/instrument/camera.rst index 27dfeb322db..ba51ca9dbda 100644 --- a/docs/ctapipe_api/instrument/camera.rst +++ b/docs/ctapipe_api/instrument/camera.rst @@ -26,10 +26,9 @@ Reference/API ctapipe.instrument.camera Package --------------------------------- -.. raw:: html - -

Classes

+Classes +^^^^^^^ .. autosummary:: From 1618eb1f9255096ff65ba846d37d09672cd02808 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sun, 9 Jul 2023 12:30:25 +0200 Subject: [PATCH 025/264] Not adding to __all__ fixes automodapi warnings Not adding to ``__all__`` in ``ctapipe/calib/index_camera/__init__.py`` and ``ctapipe/instrument/camera/__init__.py`` fixes nitpick warnings with automodapi. Note that importing the modules is still necessary. --- ctapipe/calib/camera/__init__.py | 10 ++++++---- ctapipe/instrument/camera/__init__.py | 15 ++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ctapipe/calib/camera/__init__.py b/ctapipe/calib/camera/__init__.py index d576bafd0c0..35b051c663c 100644 --- a/ctapipe/calib/camera/__init__.py +++ b/ctapipe/calib/camera/__init__.py @@ -6,7 +6,9 @@ from .calibrator import CameraCalibrator from .gainselection import GainSelector -__all__ = [ - "CameraCalibrator", - "GainSelector", -] +# __all__ = [ +# "CameraCalibrator", +# "GainSelector", +# ] + +__all__ = [] diff --git a/ctapipe/instrument/camera/__init__.py b/ctapipe/instrument/camera/__init__.py index 678ea988577..35c51460b61 100644 --- a/ctapipe/instrument/camera/__init__.py +++ b/ctapipe/instrument/camera/__init__.py @@ -2,10 +2,11 @@ from .geometry import CameraGeometry, UnknownPixelShapeWarning, PixelShape from .readout import CameraReadout -__all__ = [ - "CameraDescription", - "CameraGeometry", - "PixelShape", - "UnknownPixelShapeWarning", - "CameraReadout", -] +# __all__ = [ +# "CameraDescription", +# "CameraGeometry", +# "PixelShape", +# "UnknownPixelShapeWarning", +# "CameraReadout", +# ] +__all__ = [] From a99555b9dbdaa8510c154a4445ffd00d4c423467 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sun, 9 Jul 2023 12:34:45 +0200 Subject: [PATCH 026/264] Change back to automodapi, rework docs front page * Change back to ``automodapi`` in ``ctapipe_api/calib/index.rst`` and ``ctapipe_api/instrument/camera.rst`` * Previous workaround no longer necessary * Fix mobile layout of front page (grid cards now display correctly) * Cleaner docs front page --- docs/ctapipe_api/calib/index.rst | 26 +++---------- docs/ctapipe_api/calib/index_camera.rst | 2 +- docs/ctapipe_api/instrument/camera.rst | 25 ++----------- docs/development/index.rst | 4 +- docs/index.rst | 50 +++++++++---------------- 5 files changed, 29 insertions(+), 78 deletions(-) diff --git a/docs/ctapipe_api/calib/index.rst b/docs/ctapipe_api/calib/index.rst index 9cd202747dd..398acfed120 100644 --- a/docs/ctapipe_api/calib/index.rst +++ b/docs/ctapipe_api/calib/index.rst @@ -1,12 +1,9 @@ .. _calib: -.. temporary worakaround to at least have calib in the title, - the reason is the usage of autosummary in the Reference/API - section below -======================================== -Calibration (``calib``) -======================================== +============================== +Calibration (`~ctapipe.calib`) +============================== .. currentmodule:: ctapipe.calib @@ -48,18 +45,5 @@ Submodules Reference/API ============= -.. What follows is a *temporary* workaround to circumvent - various warnings of duplicate references caused by - calling automodapi on the camera package. - -ctapipe.calib Package ---------------------- - -Calibration - -Classes -^^^^^^^ - -.. autosummary:: - ~camera.CameraCalibrator - ~camera.GainSelector +.. automodapi:: ctapipe.calib + :no-inheritance-diagram: diff --git a/docs/ctapipe_api/calib/index_camera.rst b/docs/ctapipe_api/calib/index_camera.rst index 06302ce2216..0827c266218 100644 --- a/docs/ctapipe_api/calib/index_camera.rst +++ b/docs/ctapipe_api/calib/index_camera.rst @@ -19,7 +19,7 @@ CTA Cameras (MC, prototypes and final camera calibration algorithms). CameraCalibrator **************** -The primary class in this module is the :class:`.CameraCalibrator`. This class handles +The primary class in this module is the `~ctapipe.calib.camera.calibrator.CameraCalibrator`. This class handles two data level transition stages for the event: * R1 -> DL0 (:ref:`image_reducers`) diff --git a/docs/ctapipe_api/instrument/camera.rst b/docs/ctapipe_api/instrument/camera.rst index ba51ca9dbda..86fdd59a431 100644 --- a/docs/ctapipe_api/instrument/camera.rst +++ b/docs/ctapipe_api/instrument/camera.rst @@ -5,8 +5,8 @@ Camera Description ================== -The `~CameraDescription` contains classes holding information about the -Cherenkov camera, namely the `~CameraGeometry` and `~CameraReadout` classes. +The `~camera.description.CameraDescription` contains classes holding information about the +Cherenkov camera, namely the `~camera.geometry.CameraGeometry` and `~camera.readout.CameraReadout` classes. .. toctree:: @@ -19,25 +19,8 @@ Cherenkov camera, namely the `~CameraGeometry` and `~CameraReadout` classes. Reference/API ============= -.. What follows is a temporary workaround to circumvent - various warnings of duplicate references caused by - calling automodapi on the camera package. - -ctapipe.instrument.camera Package ---------------------------------- - - -Classes -^^^^^^^ - -.. autosummary:: - - ~CameraDescription - ~CameraGeometry - ~PixelShape - ~camera.geometry.UnknownPixelShapeWarning - ~CameraReadout - +.. automodapi:: ctapipe.instrument.camera + :no-inheritance-diagram: .. automodapi:: ctapipe.instrument.camera.description :no-inheritance-diagram: diff --git a/docs/development/index.rst b/docs/development/index.rst index 856fdaa57ae..e214e31ad00 100644 --- a/docs/development/index.rst +++ b/docs/development/index.rst @@ -1,7 +1,7 @@ .. _guidelines: -Development Guidelines -====================== +Coding Guidelines +================= .. toctree:: diff --git a/docs/index.rst b/docs/index.rst index e550bdfef93..6485c01d5b3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,7 @@ .. include:: references.txt :html_theme.sidebar_secondary.remove: true +:html_theme.sidebar_primary.remove: true .. _ctapipe: @@ -10,7 +11,7 @@ Prototype CTA Pipeline Framework (``ctapipe``) .. currentmodule:: ctapipe -**Version**: |version| +| .. image:: ctapipe_logo.webp :class: only-light @@ -24,8 +25,18 @@ Prototype CTA Pipeline Framework (``ctapipe``) :width: 90% :alt: The ctapipe logo. -What is ctapipe? -================ +| + +**Date**: |today| **Version**: |version| + +**Useful links**: +`Source Repository `__ | +`Issue Tracker `__ | +`Discussions `__ + +**License**: BSD-3 **Python**: |python_requires| + +| ``ctapipe`` is a framework for prototyping the low-level data processing algorithms for the Cherenkov Telescope Array. @@ -34,18 +45,9 @@ What is ctapipe? structure and functionality as we explore various design choices before the 1.0 release. -* Code, feature requests, bug reports, pull requests: https://github.com/cta-observatory/ctapipe -* Docs: https://ctapipe.readthedocs.io/ -* License: BSD-3 -* Python: |python_requires| - - .. _ctapipe_docs: -.. General documentation -.. ===================== - .. toctree:: :maxdepth: 1 :hidden: @@ -64,7 +66,7 @@ What is ctapipe? -.. grid:: 3 +.. grid:: 1 2 2 3 .. grid-item-card:: @@ -111,8 +113,8 @@ What is ctapipe? :octicon:`git-pull-request;40px` - Development Guidelines - ^^^^^^^^^^^^^^^^^^^^^^ + Coding Guidelines + ^^^^^^^^^^^^^^^^^ These guidelines explain the coding style and the workflow. The ctapipe enhancement proposals (CEPs) can also be found here. @@ -186,21 +188,3 @@ What is ctapipe? To the examples - -Module API Status (relative to next release) -============================================ - -ctapipe is under activate developement and we will make breaking changes from release to release until -we reach version 1.0. - - -Development Help -================ - -* Development workflow examples from AstroPy: https://astropy.readthedocs.org/en/latest/development/workflow/development_workflow.html -* GIT tutorial: https://www.atlassian.com/git/tutorials/syncing/git-pull -* Code distribution and Packaging https://packaging.python.org/en/latest/ - - - - From 246639f0e42719d96b603baa8b8081c7bd8eddb5 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 10 Jul 2023 10:58:19 +0200 Subject: [PATCH 027/264] Ignore unused import warnings Ignore unused import warnings in ``ctapipe/calib/camera/__init__.py`` ``ctapipe/instrument/camera/__init__.py`` using ``noqa: F401``. This will allow the linting CI to run successfully, while still allowing the docs to be built with ``automodapi``. --- ctapipe/calib/camera/__init__.py | 4 ++-- ctapipe/instrument/camera/__init__.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ctapipe/calib/camera/__init__.py b/ctapipe/calib/camera/__init__.py index 35b051c663c..b71a6d469c8 100644 --- a/ctapipe/calib/camera/__init__.py +++ b/ctapipe/calib/camera/__init__.py @@ -3,8 +3,8 @@ Camera calibration module. """ -from .calibrator import CameraCalibrator -from .gainselection import GainSelector +from .calibrator import CameraCalibrator # noqa: F401 +from .gainselection import GainSelector # noqa: F401 # __all__ = [ # "CameraCalibrator", diff --git a/ctapipe/instrument/camera/__init__.py b/ctapipe/instrument/camera/__init__.py index 35c51460b61..c87b09a7ef9 100644 --- a/ctapipe/instrument/camera/__init__.py +++ b/ctapipe/instrument/camera/__init__.py @@ -1,6 +1,6 @@ -from .description import CameraDescription -from .geometry import CameraGeometry, UnknownPixelShapeWarning, PixelShape -from .readout import CameraReadout +from .description import CameraDescription # noqa: F401 +from .geometry import CameraGeometry, UnknownPixelShapeWarning, PixelShape # noqa: F401 +from .readout import CameraReadout # noqa: F401 # __all__ = [ # "CameraDescription", From 3c0223b09f2e0eb96e2e52c8f05a6353ad2b5cb6 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 10 Jul 2023 11:40:56 +0200 Subject: [PATCH 028/264] Fix isort failing in ctapipe/instrument/camera/__init__.py --- ctapipe/instrument/camera/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/instrument/camera/__init__.py b/ctapipe/instrument/camera/__init__.py index c87b09a7ef9..43a0644f6f9 100644 --- a/ctapipe/instrument/camera/__init__.py +++ b/ctapipe/instrument/camera/__init__.py @@ -1,5 +1,5 @@ from .description import CameraDescription # noqa: F401 -from .geometry import CameraGeometry, UnknownPixelShapeWarning, PixelShape # noqa: F401 +from .geometry import CameraGeometry, PixelShape, UnknownPixelShapeWarning # noqa: F401 from .readout import CameraReadout # noqa: F401 # __all__ = [ From 099f601621e78c71e1895f26e414be6ab2608a92 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 10 Jul 2023 15:25:23 +0200 Subject: [PATCH 029/264] Remove html_sidebars option from conf.py --- docs/conf.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index ab78da49645..6c41637ed84 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -249,11 +249,6 @@ def setup(app): ], } -html_sidebars = { - "**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"], - "index.rst": [], -} - # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 3834b66faa510239f2737f9ecfeedfc97a5f4fc3 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Tue, 11 Jul 2023 15:52:26 +0200 Subject: [PATCH 030/264] Update intensity_fitter.py Added variable to check if fit converged, and storing of this variable in resulting container --- ctapipe/image/muon/intensity_fitter.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ctapipe/image/muon/intensity_fitter.py b/ctapipe/image/muon/intensity_fitter.py index 1eb40309402..7f6fde70f95 100644 --- a/ctapipe/image/muon/intensity_fitter.py +++ b/ctapipe/image/muon/intensity_fitter.py @@ -536,6 +536,9 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non # Perform minimisation minuit.migrad() + # Check for convergence + validation = minuit.valid + # Get fitted values result = minuit.values @@ -545,4 +548,5 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non impact_y=result["impact_parameter"] * np.sin(result["phi"]) * u.m, width=u.Quantity(np.rad2deg(result["ring_width"]), u.deg), optical_efficiency=result["optical_efficiency_muon"], + fit_convergence=validation ) From ecc22c4c968fcc124b621572f0ee56f18be6cd3d Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Tue, 11 Jul 2023 15:54:16 +0200 Subject: [PATCH 031/264] Update containers.py Added new field to store an information about convergence of the muon intensity fit --- ctapipe/containers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index bcccaef7f40..eb0dea53355 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -984,6 +984,7 @@ class MuonEfficiencyContainer(Container): impact_x = Field(nan * u.m, "impact parameter x position") impact_y = Field(nan * u.m, "impact parameter y position") optical_efficiency = Field(nan, "optical efficiency muon") + fit_convergence = Field(nan, "convergence of the fit") class MuonParametersContainer(Container): From 98bad8c0bca9d03defdab68f547b617f166cb744 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Tue, 11 Jul 2023 17:05:23 +0200 Subject: [PATCH 032/264] Update containers.py Implemented comments of @kosack and @maxnoe --- ctapipe/containers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index eb0dea53355..b35f4f3c6b7 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -984,7 +984,9 @@ class MuonEfficiencyContainer(Container): impact_x = Field(nan * u.m, "impact parameter x position") impact_y = Field(nan * u.m, "impact parameter y position") optical_efficiency = Field(nan, "optical efficiency muon") - fit_convergence = Field(nan, "convergence of the fit") + is_valid = Field(False, "True if the fit converged successfully") + parameters_at_limit = Field(False, "True if any bounded parameter was fitted close to a bound") + likelihood_value = Field(nan, "cost function value at the minimum") class MuonParametersContainer(Container): From 26280e77ba3aa2944173a6735d3faa2e900be555 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Tue, 11 Jul 2023 17:46:36 +0200 Subject: [PATCH 033/264] Update intensity_fitter.py Added assignment of new fields --- ctapipe/image/muon/intensity_fitter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ctapipe/image/muon/intensity_fitter.py b/ctapipe/image/muon/intensity_fitter.py index 7f6fde70f95..7ac332dee5a 100644 --- a/ctapipe/image/muon/intensity_fitter.py +++ b/ctapipe/image/muon/intensity_fitter.py @@ -548,5 +548,7 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non impact_y=result["impact_parameter"] * np.sin(result["phi"]) * u.m, width=u.Quantity(np.rad2deg(result["ring_width"]), u.deg), optical_efficiency=result["optical_efficiency_muon"], - fit_convergence=validation + is_valid=minuit.valid + parameters_at_limit=minuit.fmin.has_parameters_at_limit + likelihood_value=minuit.fval ) From 2e25d02112774b1bc4a39f465e107b535b160550 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Tue, 11 Jul 2023 17:47:16 +0200 Subject: [PATCH 034/264] Update intensity_fitter.py Deleted unnecessary variable --- ctapipe/image/muon/intensity_fitter.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/ctapipe/image/muon/intensity_fitter.py b/ctapipe/image/muon/intensity_fitter.py index 7ac332dee5a..f3e3c7a1968 100644 --- a/ctapipe/image/muon/intensity_fitter.py +++ b/ctapipe/image/muon/intensity_fitter.py @@ -535,9 +535,6 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non # Perform minimisation minuit.migrad() - - # Check for convergence - validation = minuit.valid # Get fitted values result = minuit.values From 78507435a17fc06c139870de0f0bc4c579fcb5cd Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Wed, 12 Jul 2023 10:28:13 +0200 Subject: [PATCH 035/264] Update intensity_fitter.py Added commas --- ctapipe/image/muon/intensity_fitter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctapipe/image/muon/intensity_fitter.py b/ctapipe/image/muon/intensity_fitter.py index f3e3c7a1968..b4df7bd5910 100644 --- a/ctapipe/image/muon/intensity_fitter.py +++ b/ctapipe/image/muon/intensity_fitter.py @@ -545,7 +545,7 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non impact_y=result["impact_parameter"] * np.sin(result["phi"]) * u.m, width=u.Quantity(np.rad2deg(result["ring_width"]), u.deg), optical_efficiency=result["optical_efficiency_muon"], - is_valid=minuit.valid - parameters_at_limit=minuit.fmin.has_parameters_at_limit + is_valid=minuit.valid, + parameters_at_limit=minuit.fmin.has_parameters_at_limit, likelihood_value=minuit.fval ) From 89ca045b4a7da6e37b503489f06f0bf09abf6a20 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Wed, 12 Jul 2023 13:02:33 +0200 Subject: [PATCH 036/264] Added tests for the new fields --- ctapipe/image/muon/tests/test_intensity_fit.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ctapipe/image/muon/tests/test_intensity_fit.py b/ctapipe/image/muon/tests/test_intensity_fit.py index a534da44aa0..25f8a98f620 100644 --- a/ctapipe/image/muon/tests/test_intensity_fit.py +++ b/ctapipe/image/muon/tests/test_intensity_fit.py @@ -89,6 +89,9 @@ def test_muon_efficiency_fit(prod5_lst): assert u.isclose(result.impact, impact_parameter, rtol=0.05) assert u.isclose(result.width, ring_width, rtol=0.05) assert u.isclose(result.optical_efficiency, efficiency, rtol=0.05) + assert result.is_valid + assert not result.parameters_at_limit + assert np.isfinite(result.likelihood_value) def test_scts(prod5_sst): From ba5c8159e3bb37ee9ec0f0f36d70b72e21998827 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Wed, 12 Jul 2023 14:39:39 +0200 Subject: [PATCH 037/264] Created file with description of channges --- docs/changes/2381.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2381.feature.rst diff --git a/docs/changes/2381.feature.rst b/docs/changes/2381.feature.rst new file mode 100644 index 00000000000..402e78f05a3 --- /dev/null +++ b/docs/changes/2381.feature.rst @@ -0,0 +1 @@ +Added new fields to the `MuonEfficiencyContainer` - `is_valid` to check if fit converged successfully, `parameters_at_limit` to check if parameters were fitted close to a bound and `likelihood_value` which represents cost function value atthe minimum. These fields were added to the output of the `MuonIntensityFitter` From 2cca40ab5c1ea3360b1776a59946952769323de5 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Wed, 12 Jul 2023 15:08:56 +0200 Subject: [PATCH 038/264] Replaced single ticks with double tickks --- docs/changes/2381.feature.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/2381.feature.rst b/docs/changes/2381.feature.rst index 402e78f05a3..4d9e9177c9d 100644 --- a/docs/changes/2381.feature.rst +++ b/docs/changes/2381.feature.rst @@ -1 +1 @@ -Added new fields to the `MuonEfficiencyContainer` - `is_valid` to check if fit converged successfully, `parameters_at_limit` to check if parameters were fitted close to a bound and `likelihood_value` which represents cost function value atthe minimum. These fields were added to the output of the `MuonIntensityFitter` +Added new fields to the ``MuonEfficiencyContainer`` - ``is_valid`` to check if fit converged successfully, ``parameters_at_limit`` to check if parameters were fitted close to a bound and ``likelihood_value`` which represents cost function value atthe minimum. These fields were added to the output of the ``MuonIntensityFitter``. From 5ff3637d7c136adb7813ea80d2910d6b35566de1 Mon Sep 17 00:00:00 2001 From: Vadym Voitsekhovskyi Date: Wed, 12 Jul 2023 17:18:54 +0200 Subject: [PATCH 039/264] Resolved style issues --- ctapipe/containers.py | 4 +++- ctapipe/image/muon/intensity_fitter.py | 4 ++-- ctapipe/image/toymodel.py | 24 ++++++++++----------- ctapipe/visualization/bokeh.py | 30 ++++++++++++-------------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index b35f4f3c6b7..060bbc903d6 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -985,7 +985,9 @@ class MuonEfficiencyContainer(Container): impact_y = Field(nan * u.m, "impact parameter y position") optical_efficiency = Field(nan, "optical efficiency muon") is_valid = Field(False, "True if the fit converged successfully") - parameters_at_limit = Field(False, "True if any bounded parameter was fitted close to a bound") + parameters_at_limit = Field( + False, "True if any bounded parameter was fitted close to a bound" + ) likelihood_value = Field(nan, "cost function value at the minimum") diff --git a/ctapipe/image/muon/intensity_fitter.py b/ctapipe/image/muon/intensity_fitter.py index b4df7bd5910..97046316607 100644 --- a/ctapipe/image/muon/intensity_fitter.py +++ b/ctapipe/image/muon/intensity_fitter.py @@ -535,7 +535,7 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non # Perform minimisation minuit.migrad() - + # Get fitted values result = minuit.values @@ -547,5 +547,5 @@ def __call__(self, tel_id, center_x, center_y, radius, image, pedestal, mask=Non optical_efficiency=result["optical_efficiency_muon"], is_valid=minuit.valid, parameters_at_limit=minuit.fmin.has_parameters_at_limit, - likelihood_value=minuit.fval + likelihood_value=minuit.fval, ) diff --git a/ctapipe/image/toymodel.py b/ctapipe/image/toymodel.py index bb9a9f5abf6..abad3a66199 100644 --- a/ctapipe/image/toymodel.py +++ b/ctapipe/image/toymodel.py @@ -18,15 +18,17 @@ >>> print(image.shape) (400,) """ -import numpy as np -from ctapipe.utils import linalg -from ctapipe.image.hillas import camera_to_shower_coordinates +from abc import ABCMeta, abstractmethod + import astropy.units as u +import numpy as np from astropy.coordinates import Angle -from scipy.stats import multivariate_normal, skewnorm, norm -from scipy.ndimage import convolve1d -from abc import ABCMeta, abstractmethod from numpy.random import default_rng +from scipy.ndimage import convolve1d +from scipy.stats import multivariate_normal, norm, skewnorm + +from ctapipe.image.hillas import camera_to_shower_coordinates +from ctapipe.utils import linalg __all__ = [ "WaveformModel", @@ -186,8 +188,7 @@ class ImageModel(metaclass=ABCMeta): @u.quantity_input(x=u.m, y=u.m) @abstractmethod def pdf(self, x, y): - """Probability density function. - """ + """Probability density function.""" def generate_image(self, camera, intensity=50, nsb_level_pe=20, rng=None): """Generate a randomized DL1 shower image. @@ -286,8 +287,7 @@ def pdf(self, x, y): class SkewedGaussian(ImageModel): - """A shower image that has a skewness along the major axis. - """ + """A shower image that has a skewness along the major axis.""" @u.quantity_input(x=u.m, y=u.m, length=u.m, width=u.m) def __init__(self, x, y, length, width, psi, skewness): @@ -327,8 +327,8 @@ def _moments_to_parameters(self): delta = np.sign(self.skewness) * np.sqrt( (np.pi / 2 * skew23) / (skew23 + (0.5 * (4 - np.pi)) ** (2 / 3)) ) - a = delta / np.sqrt(1 - delta ** 2) - scale = self.length.to_value(u.m) / np.sqrt(1 - 2 * delta ** 2 / np.pi) + a = delta / np.sqrt(1 - delta**2) + scale = self.length.to_value(u.m) / np.sqrt(1 - 2 * delta**2 / np.pi) loc = -scale * delta * np.sqrt(2 / np.pi) return a, loc, scale diff --git a/ctapipe/visualization/bokeh.py b/ctapipe/visualization/bokeh.py index c99b83aba39..117b7f66aab 100644 --- a/ctapipe/visualization/bokeh.py +++ b/ctapipe/visualization/bokeh.py @@ -1,32 +1,30 @@ import sys import tempfile from abc import ABCMeta -import matplotlib.pyplot as plt -from matplotlib.colors import to_hex +import astropy.units as u +import matplotlib.pyplot as plt import numpy as np - -from bokeh.io import output_notebook, push_notebook, show, output_file -from bokeh.plotting import figure +from bokeh.io import output_file, output_notebook, push_notebook, show from bokeh.models import ( - ColumnDataSource, - TapTool, + BoxZoomTool, + CategoricalColorMapper, ColorBar, - LinearColorMapper, - LogColorMapper, + ColumnDataSource, ContinuousColorMapper, - CategoricalColorMapper, - HoverTool, - BoxZoomTool, Ellipse, + HoverTool, Label, + LinearColorMapper, + LogColorMapper, + TapTool, ) -from bokeh.palettes import Viridis256, Magma256, Inferno256, Greys256, d3 -import astropy.units as u +from bokeh.palettes import Greys256, Inferno256, Magma256, Viridis256, d3 +from bokeh.plotting import figure +from matplotlib.colors import to_hex from ..instrument import CameraGeometry, PixelShape - PLOTARGS = dict(tools="", toolbar_location=None, outline_line_color="#595959") @@ -644,7 +642,7 @@ def _init_datasource(self, subarray, values, *, radius, frame, scale, alpha): for i, telescope_id in enumerate(telescope_ids): telescope = subarray.tel[telescope_id] tel_types.append(str(telescope)) - mirror_area = telescope.optics.mirror_area.to_value(u.m ** 2) + mirror_area = telescope.optics.mirror_area.to_value(u.m**2) mirror_radii[i] = np.sqrt(mirror_area) / np.pi if values is None: From 57d348f0b2b56e5750048ab1cce87c7cbf63345e Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 11:30:46 +0200 Subject: [PATCH 040/264] Fix duplicated reference warning for muon components --- ctapipe/image/__init__.py | 2 ++ ctapipe/image/muon/__init__.py | 9 +++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ctapipe/image/__init__.py b/ctapipe/image/__init__.py index 3f8f32fc6d6..61799ac01a5 100644 --- a/ctapipe/image/__init__.py +++ b/ctapipe/image/__init__.py @@ -42,6 +42,7 @@ ) from .muon import ( MuonIntensityFitter, + MuonProcessor, MuonRingFitter, intensity_ratio_inside_ring, kundu_chaudhuri_circle_fit, @@ -93,6 +94,7 @@ "chi_squared", "MuonIntensityFitter", "MuonRingFitter", + "MuonProcessor", "kundu_chaudhuri_circle_fit", "mean_squared_error", "intensity_ratio_inside_ring", diff --git a/ctapipe/image/muon/__init__.py b/ctapipe/image/muon/__init__.py index f7025eb10a3..4d35282377c 100644 --- a/ctapipe/image/muon/__init__.py +++ b/ctapipe/image/muon/__init__.py @@ -5,17 +5,14 @@ ring_containment, ) from .fitting import kundu_chaudhuri_circle_fit -from .intensity_fitter import MuonIntensityFitter -from .processor import MuonProcessor -from .ring_fitter import MuonRingFitter +from .intensity_fitter import MuonIntensityFitter # noqa: F401 +from .processor import MuonProcessor # noqa: F401 +from .ring_fitter import MuonRingFitter # noqa: F401 __all__ = [ - "MuonIntensityFitter", - "MuonRingFitter", "kundu_chaudhuri_circle_fit", "mean_squared_error", "intensity_ratio_inside_ring", "ring_completeness", "ring_containment", - "MuonProcessor", ] From c0dc668f942fc6c13cf114ca0239b39460118904 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 11:46:44 +0200 Subject: [PATCH 041/264] Fix broken html syntax in Component.__repr_html__ --- ctapipe/core/component.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/core/component.py b/ctapipe/core/component.py index caee11edef7..cbfc05b2584 100644 --- a/ctapipe/core/component.py +++ b/ctapipe/core/component.py @@ -233,7 +233,7 @@ def _repr_html_(self): or "Undocumented" ) lines = [ - "
", + '
', f"{name}", f"

{docstring}

", "", From 2f16d2302afdae080bcb9d272b3b47d60dc01750 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 11:47:17 +0200 Subject: [PATCH 042/264] Clear notebook outputs --- docs/examples/Tools.ipynb | 8422 +------------------------------------ 1 file changed, 57 insertions(+), 8365 deletions(-) diff --git a/docs/examples/Tools.ipynb b/docs/examples/Tools.ipynb index 7f9322406da..02eb2b8f3c1 100644 --- a/docs/examples/Tools.ipynb +++ b/docs/examples/Tools.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -58,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -113,95 +113,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "MyComponent\n", - "

\n", - "

A Component that does stuff

\n", - "
\n", - "

\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - "
value-1Value to use (default: -1)
\n", - "
" - ], - "text/plain": [ - "<__main__.MyComponent at 0x7fa1066e5eb0>" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "MyComponent()" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Outfile was changed to '{'name': 'outfile', 'old': None, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.foo'), 'owner': <__main__.AdvancedComponent object at 0x7fa105f4fe20>, 'type': 'change'}'\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "AdvancedComponent\n", - "

\n", - "

An advanced technique

\n", - "
\n", - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "
infile/home/aknierim/dev/ctapipe/docs/examples/test.fooinput file name (default: traitlets.Undefined)
outfile/home/aknierim/dev/ctapipe/docs/examples/out.foooutput file name (default: traitlets.Undefined)
value1-1Value to use (default: -1)
\n", - "
" - ], - "text/plain": [ - "<__main__.AdvancedComponent at 0x7fa105f4fe20>" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "AdvancedComponent(infile=\"test.foo\", outfile=\"out.foo\")" ] @@ -215,26 +138,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Subarray : MonteCarloArray\n", - "Num Tels : 180\n", - "Footprint: 4.92 km2\n", - "\n", - " Type Count Tel IDs \n", - "----------------- ----- ---------------\n", - " SST_ASTRI_CHEC 120 30-99,131-180 \n", - " LST_LST_LSTCam 4 1-4 \n", - "MST_MST_NectarCam 28 100-124,128-130\n", - " MST_MST_FlashCam 28 5-29,125-127 \n" - ] - } - ], + "outputs": [], "source": [ "from ctapipe.instrument import SubarrayDescription, TelescopeDescription\n", "\n", @@ -244,41 +150,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "TelescopeWiseComponent\n", - "

\n", - "

a component that contains parameters that are per-telescope configurable

\n", - "
\n", - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - "
param[('type', '*', 5.0)]Something configurable with telescope patterns. (default: traitlets.Undefined)
\n", - "
" - ], - "text/plain": [ - "<__main__.TelescopeWiseComponent at 0x7fa1704b9280>" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "TelescopeWiseComponent(subarray=subarray)" ] @@ -312,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -370,128 +244,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "MyTool\n", - "

\n", - "

do some things and stuff

\n", - "
\n", - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "
config_files[] (default: traitlets.Undefined)
iterations5Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format[%(name)s]%(highlevel)s %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level30Set the log level by value or name. (default: 30)
logging_config{}\n", - " Configure additional log handlers.\n", - "\n", - " The default stderr logs handler is configured by the\n", - " log_level, log_datefmt and log_format settings.\n", - "\n", - " This configuration can be used to configure additional handlers\n", - " (e.g. to output the log to a file) or for finer control over the\n", - " default handlers.\n", - "\n", - " If provided this should be a logging configuration dictionary, for\n", - " more information see:\n", - " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", - "\n", - " This dictionary is merged with the base logging configuration which\n", - " defines the following:\n", - "\n", - " * A logging formatter intended for interactive use called\n", - " ``console``.\n", - " * A logging handler that writes to stderr called\n", - " ``console`` which uses the formatter ``console``.\n", - " * A logger with the name of this application set to ``DEBUG``\n", - " level.\n", - "\n", - " This example adds a new handler that writes to a file:\n", - "\n", - " .. code-block:: python\n", - "\n", - " c.Application.logging_config = {\n", - " 'handlers': {\n", - " 'file': {\n", - " 'class': 'logging.FileHandler',\n", - " 'level': 'DEBUG',\n", - " 'filename': '',\n", - " }\n", - " },\n", - " 'loggers': {\n", - " '': {\n", - " 'level': 'DEBUG',\n", - " # NOTE: if you don't list the default \"console\"\n", - " # handler here then it will be disabled\n", - " 'handlers': ['console', 'file'],\n", - " },\n", - " }\n", - " }\n", - "\n", - " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", - "

Components:\n", - "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", - "

\n", - "
" - ], - "text/plain": [ - "<__main__.MyTool at 0x7fa170490cd0>" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool = MyTool()\n", "tool" @@ -499,78 +254,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "do some things and stuff\n", - "\n", - "Options\n", - "=======\n", - "The options below are convenience aliases to configurable class-options,\n", - "as listed in the \"Equivalent to\" description-line of the aliases.\n", - "To see all configurable class-options for some , use:\n", - " --help-all\n", - "\n", - "-q, --quiet\n", - " Disable console logging.\n", - " Equivalent to: [--Tool.quiet=True]\n", - "-v, --verbose\n", - " Set log level to DEBUG\n", - " Equivalent to: [--Tool.log_level=DEBUG]\n", - "--overwrite\n", - " Overwrite existing output files without asking\n", - " Equivalent to: [--Tool.overwrite=True]\n", - "--debug\n", - " Set log-level to debug, for the most verbose logging.\n", - " Equivalent to: [--Application.log_level=10]\n", - "--show-config\n", - " Show the application's configuration (human-readable format)\n", - " Equivalent to: [--Application.show_config=True]\n", - "--show-config-json\n", - " Show the application's configuration (json format)\n", - " Equivalent to: [--Application.show_config_json=True]\n", - "-c, --config=...\n", - " Default: []\n", - " Equivalent to: [--Tool.config_files]\n", - "--log-level=\n", - " Set the log level by value or name.\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 30\n", - " Equivalent to: [--Tool.log_level]\n", - "-l, --log-file=\n", - " Filename for the log\n", - " Default: None\n", - " Equivalent to: [--Tool.log_file]\n", - "--log-file-level=\n", - " Logging Level for File Logging\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 'INFO'\n", - " Equivalent to: [--Tool.log_file_level]\n", - "--provenance-log=\n", - " Default: traitlets.Undefined\n", - " Equivalent to: [--Tool.provenance_log]\n", - "--infile=\n", - " input file name\n", - " Default: traitlets.Undefined\n", - " Equivalent to: [--AdvancedComponent.infile]\n", - "--outfile=\n", - " output file name\n", - " Default: traitlets.Undefined\n", - " Equivalent to: [--AdvancedComponent.outfile]\n", - "--iterations=\n", - " Number of times to run\n", - " Default: 5\n", - " Equivalent to: [--MyTool.iterations]\n", - "\n", - "To see all available configurables, use `--help-all`.\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "tool.print_help()" ] @@ -584,322 +270,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "do some things and stuff\n", - "\n", - "Options\n", - "=======\n", - "The options below are convenience aliases to configurable class-options,\n", - "as listed in the \"Equivalent to\" description-line of the aliases.\n", - "To see all configurable class-options for some , use:\n", - " --help-all\n", - "\n", - "-q, --quiet\n", - " Disable console logging.\n", - " Equivalent to: [--Tool.quiet=True]\n", - "-v, --verbose\n", - " Set log level to DEBUG\n", - " Equivalent to: [--Tool.log_level=DEBUG]\n", - "--overwrite\n", - " Overwrite existing output files without asking\n", - " Equivalent to: [--Tool.overwrite=True]\n", - "--debug\n", - " Set log-level to debug, for the most verbose logging.\n", - " Equivalent to: [--Application.log_level=10]\n", - "--show-config\n", - " Show the application's configuration (human-readable format)\n", - " Equivalent to: [--Application.show_config=True]\n", - "--show-config-json\n", - " Show the application's configuration (json format)\n", - " Equivalent to: [--Application.show_config_json=True]\n", - "-c, --config=...\n", - " Default: []\n", - " Equivalent to: [--Tool.config_files]\n", - "--log-level=\n", - " Set the log level by value or name.\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 30\n", - " Equivalent to: [--Tool.log_level]\n", - "-l, --log-file=\n", - " Filename for the log\n", - " Default: None\n", - " Equivalent to: [--Tool.log_file]\n", - "--log-file-level=\n", - " Logging Level for File Logging\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 'INFO'\n", - " Equivalent to: [--Tool.log_file_level]\n", - "--provenance-log=\n", - " Default: traitlets.Undefined\n", - " Equivalent to: [--Tool.provenance_log]\n", - "--infile=\n", - " input file name\n", - " Default: traitlets.Undefined\n", - " Equivalent to: [--AdvancedComponent.infile]\n", - "--outfile=\n", - " output file name\n", - " Default: traitlets.Undefined\n", - " Equivalent to: [--AdvancedComponent.outfile]\n", - "--iterations=\n", - " Number of times to run\n", - " Default: 5\n", - " Equivalent to: [--MyTool.iterations]\n", - "\n", - "Class options\n", - "=============\n", - "The command-line option below sets the respective configurable class-parameter:\n", - " --Class.parameter=value\n", - "This line is evaluated in Python, so simple expressions are allowed.\n", - "For instance, to set `C.a=[0,1,2]`, you may type this:\n", - " --C.a='range(3)'\n", - "\n", - "Application(SingletonConfigurable) options\n", - "------------------------------------------\n", - "--Application.log_datefmt=\n", - " The date format used by logging formatters for %(asctime)s\n", - " Default: '%Y-%m-%d %H:%M:%S'\n", - "--Application.log_format=\n", - " The Logging format template\n", - " Default: '[%(name)s]%(highlevel)s %(message)s'\n", - "--Application.log_level=\n", - " Set the log level by value or name.\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 30\n", - "--Application.logging_config==...\n", - " Configure additional log handlers.\n", - " The default stderr logs handler is configured by the log_level, log_datefmt\n", - " and log_format settings.\n", - " This configuration can be used to configure additional handlers (e.g. to\n", - " output the log to a file) or for finer control over the default handlers.\n", - " If provided this should be a logging configuration dictionary, for more\n", - " information see:\n", - " https://docs.python.org/3/library/logging.config.html#logging-config-\n", - " dictschema\n", - " This dictionary is merged with the base logging configuration which defines\n", - " the following:\n", - " * A logging formatter intended for interactive use called\n", - " ``console``.\n", - " * A logging handler that writes to stderr called\n", - " ``console`` which uses the formatter ``console``.\n", - " * A logger with the name of this application set to ``DEBUG``\n", - " level.\n", - " This example adds a new handler that writes to a file:\n", - " .. code-block:: python\n", - " c.Application.logging_config = {\n", - " 'handlers': {\n", - " 'file': {\n", - " 'class': 'logging.FileHandler',\n", - " 'level': 'DEBUG',\n", - " 'filename': '',\n", - " }\n", - " },\n", - " 'loggers': {\n", - " '': {\n", - " 'level': 'DEBUG',\n", - " # NOTE: if you don't list the default \"console\"\n", - " # handler here then it will be disabled\n", - " 'handlers': ['console', 'file'],\n", - " },\n", - " }\n", - " }\n", - " Default: {}\n", - "--Application.show_config=\n", - " Instead of starting the Application, dump configuration to stdout\n", - " Default: False\n", - "--Application.show_config_json=\n", - " Instead of starting the Application, dump configuration to stdout (as JSON)\n", - " Default: False\n", - "\n", - "Tool(Application) options\n", - "-------------------------\n", - "--Tool.config_files=...\n", - " Default: []\n", - "--Tool.log_config==...\n", - " Default: {}\n", - "--Tool.log_datefmt=\n", - " The date format used by logging formatters for %(asctime)s\n", - " Default: '%Y-%m-%d %H:%M:%S'\n", - "--Tool.log_file=\n", - " Filename for the log\n", - " Default: None\n", - "--Tool.log_file_level=\n", - " Logging Level for File Logging\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 'INFO'\n", - "--Tool.log_format=\n", - " The Logging format template\n", - " Default: '[%(name)s]%(highlevel)s %(message)s'\n", - "--Tool.log_level=\n", - " Set the log level by value or name.\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 30\n", - "--Tool.logging_config==...\n", - " Configure additional log handlers.\n", - " The default stderr logs handler is configured by the log_level, log_datefmt\n", - " and log_format settings.\n", - " This configuration can be used to configure additional handlers (e.g. to\n", - " output the log to a file) or for finer control over the default handlers.\n", - " If provided this should be a logging configuration dictionary, for more\n", - " information see:\n", - " https://docs.python.org/3/library/logging.config.html#logging-config-\n", - " dictschema\n", - " This dictionary is merged with the base logging configuration which defines\n", - " the following:\n", - " * A logging formatter intended for interactive use called\n", - " ``console``.\n", - " * A logging handler that writes to stderr called\n", - " ``console`` which uses the formatter ``console``.\n", - " * A logger with the name of this application set to ``DEBUG``\n", - " level.\n", - " This example adds a new handler that writes to a file:\n", - " .. code-block:: python\n", - " c.Application.logging_config = {\n", - " 'handlers': {\n", - " 'file': {\n", - " 'class': 'logging.FileHandler',\n", - " 'level': 'DEBUG',\n", - " 'filename': '',\n", - " }\n", - " },\n", - " 'loggers': {\n", - " '': {\n", - " 'level': 'DEBUG',\n", - " # NOTE: if you don't list the default \"console\"\n", - " # handler here then it will be disabled\n", - " 'handlers': ['console', 'file'],\n", - " },\n", - " }\n", - " }\n", - " Default: {}\n", - "--Tool.overwrite=\n", - " Default: False\n", - "--Tool.provenance_log=\n", - " Default: traitlets.Undefined\n", - "--Tool.quiet=\n", - " Default: False\n", - "--Tool.show_config=\n", - " Instead of starting the Application, dump configuration to stdout\n", - " Default: False\n", - "--Tool.show_config_json=\n", - " Instead of starting the Application, dump configuration to stdout (as JSON)\n", - " Default: False\n", - "\n", - "MyTool(Tool) options\n", - "--------------------\n", - "--MyTool.config_files=...\n", - " Default: []\n", - "--MyTool.iterations=\n", - " Number of times to run\n", - " Default: 5\n", - "--MyTool.log_config==...\n", - " Default: {}\n", - "--MyTool.log_datefmt=\n", - " The date format used by logging formatters for %(asctime)s\n", - " Default: '%Y-%m-%d %H:%M:%S'\n", - "--MyTool.log_file=\n", - " Filename for the log\n", - " Default: None\n", - "--MyTool.log_file_level=\n", - " Logging Level for File Logging\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 'INFO'\n", - "--MyTool.log_format=\n", - " The Logging format template\n", - " Default: '[%(name)s]%(highlevel)s %(message)s'\n", - "--MyTool.log_level=\n", - " Set the log level by value or name.\n", - " Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - " Default: 30\n", - "--MyTool.logging_config==...\n", - " Configure additional log handlers.\n", - " The default stderr logs handler is configured by the log_level, log_datefmt\n", - " and log_format settings.\n", - " This configuration can be used to configure additional handlers (e.g. to\n", - " output the log to a file) or for finer control over the default handlers.\n", - " If provided this should be a logging configuration dictionary, for more\n", - " information see:\n", - " https://docs.python.org/3/library/logging.config.html#logging-config-\n", - " dictschema\n", - " This dictionary is merged with the base logging configuration which defines\n", - " the following:\n", - " * A logging formatter intended for interactive use called\n", - " ``console``.\n", - " * A logging handler that writes to stderr called\n", - " ``console`` which uses the formatter ``console``.\n", - " * A logger with the name of this application set to ``DEBUG``\n", - " level.\n", - " This example adds a new handler that writes to a file:\n", - " .. code-block:: python\n", - " c.Application.logging_config = {\n", - " 'handlers': {\n", - " 'file': {\n", - " 'class': 'logging.FileHandler',\n", - " 'level': 'DEBUG',\n", - " 'filename': '',\n", - " }\n", - " },\n", - " 'loggers': {\n", - " '': {\n", - " 'level': 'DEBUG',\n", - " # NOTE: if you don't list the default \"console\"\n", - " # handler here then it will be disabled\n", - " 'handlers': ['console', 'file'],\n", - " },\n", - " }\n", - " }\n", - " Default: {}\n", - "--MyTool.overwrite=\n", - " Default: False\n", - "--MyTool.provenance_log=\n", - " Default: traitlets.Undefined\n", - "--MyTool.quiet=\n", - " Default: False\n", - "--MyTool.show_config=\n", - " Instead of starting the Application, dump configuration to stdout\n", - " Default: False\n", - "--MyTool.show_config_json=\n", - " Instead of starting the Application, dump configuration to stdout (as JSON)\n", - " Default: False\n", - "\n", - "MyComponent(Component) options\n", - "------------------------------\n", - "--MyComponent.value=\n", - " Value to use\n", - " Default: -1\n", - "\n", - "AdvancedComponent(Component) options\n", - "------------------------------------\n", - "--AdvancedComponent.infile=\n", - " input file name\n", - " Default: traitlets.Undefined\n", - "--AdvancedComponent.outfile=\n", - " output file name\n", - " Default: traitlets.Undefined\n", - "--AdvancedComponent.value1=\n", - " Value to use\n", - " Default: -1\n", - "\n", - "SecondaryMyComponent(MyComponent) options\n", - "-----------------------------------------\n", - "--SecondaryMyComponent.value=\n", - " Value to use\n", - " Default: -1\n", - "\n", - "TelescopeWiseComponent(TelescopeComponent) options\n", - "--------------------------------------------------\n", - "--TelescopeWiseComponent.param=...\n", - " Something configurable with telescope patterns.\n", - " Default: [('type', '*', 5.0)]\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "tool.print_help(classes=True)" ] @@ -922,18 +295,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:52,057 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170483f40>, 'type': 'change'}'\n", - "2023-07-03 17:24:52,559 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " tool.run(argv=[\"--infile\", str(GAMMA_FILE), \"--outfile\", \"out.csv\"])\n", @@ -943,27 +307,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:52,798 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): Loading config from '[]'\n", - "2023-07-03 17:24:52,800 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", - "2023-07-03 17:24:52,802 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170483520>, 'type': 'change'}'\n", - "2023-07-03 17:24:52,803 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 3 iterations...\n", - "2023-07-03 17:24:52,803 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", - "2023-07-03 17:24:52,903 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", - "2023-07-03 17:24:53,005 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", - "2023-07-03 17:24:53,106 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", - "2023-07-03 17:24:53,108 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", - "2023-07-03 17:24:53,114 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:53,116 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n" - ] - } - ], + "outputs": [], "source": [ "tool.log_format = \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\"\n", "\n", @@ -994,2637 +340,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:53,149 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Starting: mytool\n", - "2023-07-03 17:24:53,325 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): Loading config from '[]'\n", - "2023-07-03 17:24:53,327 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", - "2023-07-03 17:24:53,329 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486340>, 'type': 'change'}'\n", - "2023-07-03 17:24:53,330 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.run): CONFIG: {'MyTool': {'config_files': [], 'iterations': 3, 'log_config': {}, 'log_datefmt': '%Y-%m-%d %H:%M:%S', 'log_file': None, 'log_file_level': 'INFO', 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s', 'log_level': 10, 'logging_config': {}, 'overwrite': False, 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'), 'quiet': False, 'show_config': False, 'show_config_json': False, 'MyComponent': {'value': -1}, 'SecondaryMyComponent': {'value': -1}, 'TelescopeWiseComponent': {'param': [('type', '*', 5.0)]}, 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'), 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'value1': -1, 'MyComponent': {'value': -1}}}}\n", - "2023-07-03 17:24:53,330 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 3 iterations...\n", - "2023-07-03 17:24:53,330 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", - "2023-07-03 17:24:53,331 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:53,331 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:53,432 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", - "2023-07-03 17:24:53,433 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:53,435 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:53,537 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", - "2023-07-03 17:24:53,538 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:53,539 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:53,640 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", - "2023-07-03 17:24:53,642 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", - "2023-07-03 17:24:53,649 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:53,651 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:53,653 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:53,668 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.write_provenance): PROVENANCE: '[\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"c2c31b3c-b5cd-4c46-8581-e0cf17c94af0\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:51.880\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:52.561\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:52.052\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 5,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", - " \"log_level\": 30,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.011350000000014404\n", - " },\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"9a689c40-0157-4ee0-88f4-fb8125ef689c\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:52.601\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.110\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:52.794\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 3,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", - " \"log_level\": 20,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.008483333333408893\n", - " },\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"a237bc8b-cb43-456b-a3d2-3f1ad096fbeb\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.153\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.644\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:53.322\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 3,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", - " \"log_level\": 10,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.00818333333336696\n", - " }\n", - "]'\n", - "2023-07-03 17:24:53,683 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (application.exit): Exiting application: mytool\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " tool.run(\n", @@ -3650,19 +368,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:53,720 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Starting: mytool\n", - "2023-07-03 17:24:53,931 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486880>, 'type': 'change'}'\n", - "2023-07-03 17:24:54,032 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n" - ] - } - ], + "outputs": [], "source": [ "tool.iterations = 1\n", "tool.log_level = 0\n", @@ -3682,17 +390,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bad value: The 'iterations' trait of a MyTool instance expected an int, not the str 'badval'.\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " tool.iterations = \"badval\"\n", @@ -3711,17 +411,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:54,141 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/Another.txt'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486880>, 'type': 'change'}'\n" - ] - } - ], + "outputs": [], "source": [ "tool.advanced.outfile = \"Another.txt\"" ] @@ -3742,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3751,4382 +443,9 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:54,332 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.initialize): ctapipe version 0.19.1.dev27+g062fd966.d20230703\n", - "2023-07-03 17:24:54,334 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/foo.txt'), 'owner': <__main__.AdvancedComponent object at 0x7fa170486e20>, 'type': 'change'}'\n", - "2023-07-03 17:24:54,335 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.run): CONFIG: {'MyTool': {'config_files': [PosixPath('/home/aknierim/dev/ctapipe/docs/examples/Tools.json')], 'iterations': 5, 'log_config': {}, 'log_datefmt': '%Y-%m-%d %H:%M:%S', 'log_file': None, 'log_file_level': 'INFO', 'log_format': '[%(name)s]%(highlevel)s %(message)s', 'log_level': 10, 'logging_config': {}, 'overwrite': False, 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'), 'quiet': False, 'show_config': False, 'show_config_json': False, 'MyComponent': {'value': -1}, 'SecondaryMyComponent': {'value': -1}, 'TelescopeWiseComponent': {'param': [('type', '*', 5.0)]}, 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/something.txt'), 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/foo.txt'), 'value1': -1, 'MyComponent': {'value': -1}}}}\n", - "2023-07-03 17:24:54,336 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): Performing 5 iterations...\n", - "2023-07-03 17:24:54,336 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 0\n", - "2023-07-03 17:24:54,336 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,337 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,437 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 1\n", - "2023-07-03 17:24:54,439 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,441 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,542 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 2\n", - "2023-07-03 17:24:54,543 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,543 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,644 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 3\n", - "2023-07-03 17:24:54,645 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,647 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,748 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (462504653.start): ITERATION 4\n", - "2023-07-03 17:24:54,749 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.MyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,749 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool.SecondaryMyComponent] (2562530776.do_thing): Did thing\n", - "2023-07-03 17:24:54,850 \u001b[1;33mWARNING\u001b[0m [__main__.mytool] (462504653.finish): Shutting down.\n", - "2023-07-03 17:24:54,852 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.run): Finished: mytool\n", - "2023-07-03 17:24:54,858 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:54,859 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:54,861 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:54,862 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:54,864 \u001b[1;32mINFO\u001b[0m [__main__.mytool] (tool.write_provenance): Output: \n", - "2023-07-03 17:24:54,887 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (tool.write_provenance): PROVENANCE: '[\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"c2c31b3c-b5cd-4c46-8581-e0cf17c94af0\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:51.880\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:52.561\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:52.052\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 5,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", - " \"log_level\": 30,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.011350000000014404\n", - " },\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"9a689c40-0157-4ee0-88f4-fb8125ef689c\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:52.601\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.110\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:52.794\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 3,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", - " \"log_level\": 20,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.008483333333408893\n", - " },\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"a237bc8b-cb43-456b-a3d2-3f1ad096fbeb\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.153\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.644\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:53.322\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 3,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", - " \"log_level\": 10,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.00818333333336696\n", - " },\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"b0ef6627-d00f-4fd8-bf9a-7631e890715b\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:53.722\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:54.034\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:53.927\"\n", - " },\n", - " \"input\": [],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [],\n", - " \"iterations\": 1,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\",\n", - " \"log_level\": 0,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/out.csv\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.005199999999874194\n", - " },\n", - " {\n", - " \"activity_name\": \"mytool\",\n", - " \"activity_uuid\": \"837610ed-009c-4e8f-9770-cfb76ab71239\",\n", - " \"start\": {\n", - " \"time_utc\": \"2023-07-03T15:24:54.154\"\n", - " },\n", - " \"stop\": {\n", - " \"time_utc\": \"2023-07-03T15:24:54.854\"\n", - " },\n", - " \"system\": {\n", - " \"ctapipe_version\": \"0.19.1.dev27+g062fd966.d20230703\",\n", - " \"ctapipe_resources_version\": \"not installed\",\n", - " \"eventio_version\": \"1.11.0\",\n", - " \"ctapipe_svc_path\": null,\n", - " \"executable\": \"/home/aknierim/.local/conda/envs/cta-dev/bin/python\",\n", - " \"platform\": {\n", - " \"architecture_bits\": \"64bit\",\n", - " \"architecture_linkage\": \"ELF\",\n", - " \"machine\": \"x86_64\",\n", - " \"processor\": \"x86_64\",\n", - " \"node\": \"e5b-dell-09\",\n", - " \"version\": \"#47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2\",\n", - " \"system\": \"Linux\",\n", - " \"release\": \"5.19.0-46-generic\",\n", - " \"libcver\": [\n", - " \"glibc\",\n", - " \"2.35\"\n", - " ],\n", - " \"n_cpus\": 12,\n", - " \"boot_time\": \"2023-07-03T07:18:46.000\"\n", - " },\n", - " \"python\": {\n", - " \"version_string\": \"3.9.16 | packaged by conda-forge | (main, Feb 1 2023, 21:39:03) \\n[GCC 11.3.0]\",\n", - " \"version\": [\n", - " \"3\",\n", - " \"9\",\n", - " \"16\"\n", - " ],\n", - " \"compiler\": \"GCC 11.3.0\",\n", - " \"implementation\": \"CPython\",\n", - " \"packages\": [\n", - " {\n", - " \"name\": \"Babel\",\n", - " \"version\": \"2.12.1\"\n", - " },\n", - " {\n", - " \"name\": \"Cython\",\n", - " \"version\": \"0.29.34\"\n", - " },\n", - " {\n", - " \"name\": \"Jinja2\",\n", - " \"version\": \"3.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"MarkupSafe\",\n", - " \"version\": \"2.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"Pillow\",\n", - " \"version\": \"9.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5\",\n", - " \"version\": \"5.15.7\"\n", - " },\n", - " {\n", - " \"name\": \"PyQt5-sip\",\n", - " \"version\": \"12.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"PySocks\",\n", - " \"version\": \"1.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"PyYAML\",\n", - " \"version\": \"6.0\"\n", - " },\n", - " {\n", - " \"name\": \"Pygments\",\n", - " \"version\": \"2.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"QtPy\",\n", - " \"version\": \"2.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"Send2Trash\",\n", - " \"version\": \"1.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"Sphinx\",\n", - " \"version\": \"6.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"accessible-pygments\",\n", - " \"version\": \"0.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"alabaster\",\n", - " \"version\": \"0.7.13\"\n", - " },\n", - " {\n", - " \"name\": \"anyio\",\n", - " \"version\": \"3.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi\",\n", - " \"version\": \"21.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"argon2-cffi-bindings\",\n", - " \"version\": \"21.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"astropy\",\n", - " \"version\": \"5.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"asttokens\",\n", - " \"version\": \"2.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"async-lru\",\n", - " \"version\": \"2.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"attrs\",\n", - " \"version\": \"23.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"backcall\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"backports.functools-lru-cache\",\n", - " \"version\": \"1.6.4\"\n", - " },\n", - " {\n", - " \"name\": \"beautifulsoup4\",\n", - " \"version\": \"4.12.2\"\n", - " },\n", - " {\n", - " \"name\": \"black\",\n", - " \"version\": \"23.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"bleach\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"bokeh\",\n", - " \"version\": \"2.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"brotlipy\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"cached-property\",\n", - " \"version\": \"1.5.2\"\n", - " },\n", - " {\n", - " \"name\": \"certifi\",\n", - " \"version\": \"2023.5.7\"\n", - " },\n", - " {\n", - " \"name\": \"cffi\",\n", - " \"version\": \"1.15.1\"\n", - " },\n", - " {\n", - " \"name\": \"cfgv\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"charset-normalizer\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"click\",\n", - " \"version\": \"8.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"click-default-group\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"colorama\",\n", - " \"version\": \"0.4.6\"\n", - " },\n", - " {\n", - " \"name\": \"comm\",\n", - " \"version\": \"0.1.3\"\n", - " },\n", - " {\n", - " \"name\": \"contourpy\",\n", - " \"version\": \"1.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"corsikaio\",\n", - " \"version\": \"0.2.6.post1\"\n", - " },\n", - " {\n", - " \"name\": \"coverage\",\n", - " \"version\": \"7.2.5\"\n", - " },\n", - " {\n", - " \"name\": \"cryptography\",\n", - " \"version\": \"40.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"ctapipe\",\n", - " \"version\": \"0.19.1.dev27+g062fd966.d20230510\"\n", - " },\n", - " {\n", - " \"name\": \"cycler\",\n", - " \"version\": \"0.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"debugpy\",\n", - " \"version\": \"1.6.7\"\n", - " },\n", - " {\n", - " \"name\": \"decorator\",\n", - " \"version\": \"5.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"defusedxml\",\n", - " \"version\": \"0.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"distlib\",\n", - " \"version\": \"0.3.6\"\n", - " },\n", - " {\n", - " \"name\": \"docutils\",\n", - " \"version\": \"0.18.1\"\n", - " },\n", - " {\n", - " \"name\": \"entrypoints\",\n", - " \"version\": \"0.4\"\n", - " },\n", - " {\n", - " \"name\": \"eventio\",\n", - " \"version\": \"1.11.0\"\n", - " },\n", - " {\n", - " \"name\": \"exceptiongroup\",\n", - " \"version\": \"1.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"executing\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"fastjsonschema\",\n", - " \"version\": \"2.16.3\"\n", - " },\n", - " {\n", - " \"name\": \"filelock\",\n", - " \"version\": \"3.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"flit_core\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"fonttools\",\n", - " \"version\": \"4.39.3\"\n", - " },\n", - " {\n", - " \"name\": \"h5py\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"identify\",\n", - " \"version\": \"2.5.24\"\n", - " },\n", - " {\n", - " \"name\": \"idna\",\n", - " \"version\": \"3.4\"\n", - " },\n", - " {\n", - " \"name\": \"imagesize\",\n", - " \"version\": \"1.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"iminuit\",\n", - " \"version\": \"2.21.3\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-metadata\",\n", - " \"version\": \"6.6.0\"\n", - " },\n", - " {\n", - " \"name\": \"importlib-resources\",\n", - " \"version\": \"5.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"incremental\",\n", - " \"version\": \"22.10.0\"\n", - " },\n", - " {\n", - " \"name\": \"iniconfig\",\n", - " \"version\": \"2.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipykernel\",\n", - " \"version\": \"6.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipython\",\n", - " \"version\": \"8.13.2\"\n", - " },\n", - " {\n", - " \"name\": \"ipython-genutils\",\n", - " \"version\": \"0.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"ipywidgets\",\n", - " \"version\": \"8.0.6\"\n", - " },\n", - " {\n", - " \"name\": \"jedi\",\n", - " \"version\": \"0.18.2\"\n", - " },\n", - " {\n", - " \"name\": \"joblib\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"json5\",\n", - " \"version\": \"0.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"jsonschema\",\n", - " \"version\": \"4.17.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-console\",\n", - " \"version\": \"6.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-events\",\n", - " \"version\": \"0.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter-lsp\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_client\",\n", - " \"version\": \"8.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_core\",\n", - " \"version\": \"5.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server\",\n", - " \"version\": \"2.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"jupyter_server_terminals\",\n", - " \"version\": \"0.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab\",\n", - " \"version\": \"4.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-pygments\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab-widgets\",\n", - " \"version\": \"3.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"jupyterlab_server\",\n", - " \"version\": \"2.22.1\"\n", - " },\n", - " {\n", - " \"name\": \"kiwisolver\",\n", - " \"version\": \"1.4.4\"\n", - " },\n", - " {\n", - " \"name\": \"livereload\",\n", - " \"version\": \"2.6.3\"\n", - " },\n", - " {\n", - " \"name\": \"llvmlite\",\n", - " \"version\": \"0.39.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib\",\n", - " \"version\": \"3.7.1\"\n", - " },\n", - " {\n", - " \"name\": \"matplotlib-inline\",\n", - " \"version\": \"0.1.6\"\n", - " },\n", - " {\n", - " \"name\": \"mistune\",\n", - " \"version\": \"2.0.5\"\n", - " },\n", - " {\n", - " \"name\": \"munkres\",\n", - " \"version\": \"1.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"mypy-extensions\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclassic\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbclient\",\n", - " \"version\": \"0.7.4\"\n", - " },\n", - " {\n", - " \"name\": \"nbconvert\",\n", - " \"version\": \"7.4.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbformat\",\n", - " \"version\": \"5.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"nbsphinx\",\n", - " \"version\": \"0.9.1\"\n", - " },\n", - " {\n", - " \"name\": \"nest-asyncio\",\n", - " \"version\": \"1.5.6\"\n", - " },\n", - " {\n", - " \"name\": \"nodeenv\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"notebook\",\n", - " \"version\": \"6.5.4\"\n", - " },\n", - " {\n", - " \"name\": \"notebook_shim\",\n", - " \"version\": \"0.2.3\"\n", - " },\n", - " {\n", - " \"name\": \"numba\",\n", - " \"version\": \"0.56.4\"\n", - " },\n", - " {\n", - " \"name\": \"numexpr\",\n", - " \"version\": \"2.8.4\"\n", - " },\n", - " {\n", - " \"name\": \"numpy\",\n", - " \"version\": \"1.23.5\"\n", - " },\n", - " {\n", - " \"name\": \"numpydoc\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"packaging\",\n", - " \"version\": \"23.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandas\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"pandocfilters\",\n", - " \"version\": \"1.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"parso\",\n", - " \"version\": \"0.8.3\"\n", - " },\n", - " {\n", - " \"name\": \"pathspec\",\n", - " \"version\": \"0.11.1\"\n", - " },\n", - " {\n", - " \"name\": \"pexpect\",\n", - " \"version\": \"4.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"pickleshare\",\n", - " \"version\": \"0.7.5\"\n", - " },\n", - " {\n", - " \"name\": \"pip\",\n", - " \"version\": \"23.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pkgutil_resolve_name\",\n", - " \"version\": \"1.3.10\"\n", - " },\n", - " {\n", - " \"name\": \"platformdirs\",\n", - " \"version\": \"3.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"pluggy\",\n", - " \"version\": \"1.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"ply\",\n", - " \"version\": \"3.11\"\n", - " },\n", - " {\n", - " \"name\": \"pooch\",\n", - " \"version\": \"1.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pre-commit\",\n", - " \"version\": \"3.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"prometheus-client\",\n", - " \"version\": \"0.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"prompt-toolkit\",\n", - " \"version\": \"3.0.38\"\n", - " },\n", - " {\n", - " \"name\": \"psutil\",\n", - " \"version\": \"5.9.5\"\n", - " },\n", - " {\n", - " \"name\": \"ptyprocess\",\n", - " \"version\": \"0.7.0\"\n", - " },\n", - " {\n", - " \"name\": \"pure-eval\",\n", - " \"version\": \"0.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"py-cpuinfo\",\n", - " \"version\": \"9.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pyOpenSSL\",\n", - " \"version\": \"23.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"pycparser\",\n", - " \"version\": \"2.21\"\n", - " },\n", - " {\n", - " \"name\": \"pydata-sphinx-theme\",\n", - " \"version\": \"0.13.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyerfa\",\n", - " \"version\": \"2.0.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyparsing\",\n", - " \"version\": \"3.0.9\"\n", - " },\n", - " {\n", - " \"name\": \"pyrsistent\",\n", - " \"version\": \"0.19.3\"\n", - " },\n", - " {\n", - " \"name\": \"pytest\",\n", - " \"version\": \"7.3.1\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-astropy-header\",\n", - " \"version\": \"0.1.2\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-cov\",\n", - " \"version\": \"4.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"pytest-runner\",\n", - " \"version\": \"6.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"python-dateutil\",\n", - " \"version\": \"2.8.2\"\n", - " },\n", - " {\n", - " \"name\": \"python-json-logger\",\n", - " \"version\": \"2.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"pytz\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"pyzmq\",\n", - " \"version\": \"25.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"qtconsole\",\n", - " \"version\": \"5.4.3\"\n", - " },\n", - " {\n", - " \"name\": \"requests\",\n", - " \"version\": \"2.29.0\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3339-validator\",\n", - " \"version\": \"0.1.4\"\n", - " },\n", - " {\n", - " \"name\": \"rfc3986-validator\",\n", - " \"version\": \"0.1.1\"\n", - " },\n", - " {\n", - " \"name\": \"scikit-learn\",\n", - " \"version\": \"1.2.2\"\n", - " },\n", - " {\n", - " \"name\": \"scipy\",\n", - " \"version\": \"1.10.1\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools\",\n", - " \"version\": \"67.7.2\"\n", - " },\n", - " {\n", - " \"name\": \"setuptools-scm\",\n", - " \"version\": \"7.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"sip\",\n", - " \"version\": \"6.7.9\"\n", - " },\n", - " {\n", - " \"name\": \"six\",\n", - " \"version\": \"1.16.0\"\n", - " },\n", - " {\n", - " \"name\": \"sniffio\",\n", - " \"version\": \"1.3.0\"\n", - " },\n", - " {\n", - " \"name\": \"snowballstemmer\",\n", - " \"version\": \"2.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"soupsieve\",\n", - " \"version\": \"2.3.2.post1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-autobuild\",\n", - " \"version\": \"2021.3.14\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-automodapi\",\n", - " \"version\": \"0.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx-rtd-theme\",\n", - " \"version\": \"1.2.0\"\n", - " },\n", - " {\n", - " \"name\": \"sphinx_design\",\n", - " \"version\": \"0.4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-applehelp\",\n", - " \"version\": \"1.0.4\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-devhelp\",\n", - " \"version\": \"1.0.2\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-htmlhelp\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jquery\",\n", - " \"version\": \"4.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-jsmath\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-qthelp\",\n", - " \"version\": \"1.0.3\"\n", - " },\n", - " {\n", - " \"name\": \"sphinxcontrib-serializinghtml\",\n", - " \"version\": \"1.1.5\"\n", - " },\n", - " {\n", - " \"name\": \"stack-data\",\n", - " \"version\": \"0.6.2\"\n", - " },\n", - " {\n", - " \"name\": \"tables\",\n", - " \"version\": \"3.8.0\"\n", - " },\n", - " {\n", - " \"name\": \"terminado\",\n", - " \"version\": \"0.17.1\"\n", - " },\n", - " {\n", - " \"name\": \"threadpoolctl\",\n", - " \"version\": \"3.1.0\"\n", - " },\n", - " {\n", - " \"name\": \"tinycss2\",\n", - " \"version\": \"1.2.1\"\n", - " },\n", - " {\n", - " \"name\": \"toml\",\n", - " \"version\": \"0.10.2\"\n", - " },\n", - " {\n", - " \"name\": \"tomli\",\n", - " \"version\": \"2.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"tornado\",\n", - " \"version\": \"6.3\"\n", - " },\n", - " {\n", - " \"name\": \"towncrier\",\n", - " \"version\": \"22.12.0\"\n", - " },\n", - " {\n", - " \"name\": \"tqdm\",\n", - " \"version\": \"4.65.0\"\n", - " },\n", - " {\n", - " \"name\": \"traitlets\",\n", - " \"version\": \"5.9.0\"\n", - " },\n", - " {\n", - " \"name\": \"typing_extensions\",\n", - " \"version\": \"4.5.0\"\n", - " },\n", - " {\n", - " \"name\": \"tzdata\",\n", - " \"version\": \"2023.3\"\n", - " },\n", - " {\n", - " \"name\": \"ukkonen\",\n", - " \"version\": \"1.0.1\"\n", - " },\n", - " {\n", - " \"name\": \"unicodedata2\",\n", - " \"version\": \"15.0.0\"\n", - " },\n", - " {\n", - " \"name\": \"urllib3\",\n", - " \"version\": \"1.26.15\"\n", - " },\n", - " {\n", - " \"name\": \"virtualenv\",\n", - " \"version\": \"20.23.0\"\n", - " },\n", - " {\n", - " \"name\": \"wcwidth\",\n", - " \"version\": \"0.2.6\"\n", - " },\n", - " {\n", - " \"name\": \"webencodings\",\n", - " \"version\": \"0.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"websocket-client\",\n", - " \"version\": \"1.5.1\"\n", - " },\n", - " {\n", - " \"name\": \"wheel\",\n", - " \"version\": \"0.40.0\"\n", - " },\n", - " {\n", - " \"name\": \"widgetsnbextension\",\n", - " \"version\": \"4.0.7\"\n", - " },\n", - " {\n", - " \"name\": \"zipp\",\n", - " \"version\": \"3.15.0\"\n", - " },\n", - " {\n", - " \"name\": \"zstandard\",\n", - " \"version\": \"0.19.0\"\n", - " }\n", - " ]\n", - " },\n", - " \"environment\": {\n", - " \"CONDA_DEFAULT_ENV\": \"cta-dev\",\n", - " \"CONDA_PREFIX\": \"/home/aknierim/.local/conda/envs/cta-dev\",\n", - " \"CONDA_PYTHON_EXE\": \"/home/aknierim/.local/conda/bin/python\",\n", - " \"CONDA_EXE\": \"/home/aknierim/.local/conda/bin/conda\",\n", - " \"CONDA_PROMPT_MODIFIER\": \"(cta-dev) \",\n", - " \"CONDA_SHLVL\": \"1\",\n", - " \"PATH\": \"/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/home/aknierim/.local/conda/envs/cta-dev/bin:/home/aknierim/.local/conda/condabin:/home/aknierim/.codon/bin:/home/aknierim/.local/texlive/2022/bin/x86_64-linux:/home/aknierim/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin\",\n", - " \"LD_LIBRARY_PATH\": null,\n", - " \"DYLD_LIBRARY_PATH\": null,\n", - " \"USER\": \"aknierim\",\n", - " \"HOME\": \"/home/aknierim\",\n", - " \"SHELL\": \"/bin/zsh\"\n", - " },\n", - " \"arguments\": [\n", - " \"/home/aknierim/.local/conda/envs/cta-dev/lib/python3.9/site-packages/ipykernel_launcher.py\",\n", - " \"-f\",\n", - " \"/home/aknierim/.local/share/jupyter/runtime/kernel-8df72055-1d05-4a90-8466-961002b0e8ef.json\"\n", - " ],\n", - " \"start_time_utc\": \"2023-07-03T15:24:54.328\"\n", - " },\n", - " \"input\": [\n", - " {\n", - " \"url\": \"/home/aknierim/dev/ctapipe/docs/examples/Tools.json\",\n", - " \"role\": \"Tool Configuration\"\n", - " }\n", - " ],\n", - " \"output\": [],\n", - " \"config\": {\n", - " \"MyTool\": {\n", - " \"config_files\": [\n", - " \"/home/aknierim/dev/ctapipe/docs/examples/Tools.json\"\n", - " ],\n", - " \"iterations\": 5,\n", - " \"log_config\": {},\n", - " \"log_datefmt\": \"%Y-%m-%d %H:%M:%S\",\n", - " \"log_file\": null,\n", - " \"log_file_level\": \"INFO\",\n", - " \"log_format\": \"[%(name)s]%(highlevel)s %(message)s\",\n", - " \"log_level\": 10,\n", - " \"logging_config\": {},\n", - " \"overwrite\": false,\n", - " \"provenance_log\": \"/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log\",\n", - " \"quiet\": false,\n", - " \"show_config\": false,\n", - " \"show_config_json\": false,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"SecondaryMyComponent\": {\n", - " \"value\": -1\n", - " },\n", - " \"TelescopeWiseComponent\": {\n", - " \"param\": [\n", - " [\n", - " \"type\",\n", - " \"*\",\n", - " 5.0\n", - " ]\n", - " ]\n", - " },\n", - " \"AdvancedComponent\": {\n", - " \"infile\": \"/home/aknierim/dev/ctapipe/docs/examples/something.txt\",\n", - " \"outfile\": \"/home/aknierim/dev/ctapipe/docs/examples/foo.txt\",\n", - " \"value1\": -1,\n", - " \"MyComponent\": {\n", - " \"value\": -1\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"status\": \"completed\",\n", - " \"duration_min\": 0.01166666666650329\n", - " }\n", - "]'\n", - "2023-07-03 17:24:54,902 \u001b[1;34mDEBUG\u001b[0m [__main__.mytool] (application.exit): Exiting application: mytool\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " tool2.run(argv=[\"--config\", \"Tools.json\"])\n", @@ -8136,61 +455,34 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/aknierim/dev/ctapipe/docs/examples/something.txt\n" - ] - } - ], + "outputs": [], "source": [ "print(tool2.advanced.infile)" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'MyTool': {'config_files': ['Tools.json'], 'log_level': 'DEBUG'}, 'AdvancedComponent': {'infile': 'something.txt', 'outfile': 'foo.txt'}}\n" - ] - } - ], + "outputs": [], "source": [ "print(tool2.config)" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool2.is_setup" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -8199,27 +491,16 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool3.is_setup" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -8228,283 +509,27 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool3.is_setup" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "MyTool\n", - "

\n", - "

do some things and stuff

\n", - "
\n", - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "
config_files[] (default: traitlets.Undefined)
iterations5Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format[%(name)s]%(highlevel)s %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level30Set the log level by value or name. (default: 30)
logging_config{}\n", - " Configure additional log handlers.\n", - "\n", - " The default stderr logs handler is configured by the\n", - " log_level, log_datefmt and log_format settings.\n", - "\n", - " This configuration can be used to configure additional handlers\n", - " (e.g. to output the log to a file) or for finer control over the\n", - " default handlers.\n", - "\n", - " If provided this should be a logging configuration dictionary, for\n", - " more information see:\n", - " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", - "\n", - " This dictionary is merged with the base logging configuration which\n", - " defines the following:\n", - "\n", - " * A logging formatter intended for interactive use called\n", - " ``console``.\n", - " * A logging handler that writes to stderr called\n", - " ``console`` which uses the formatter ``console``.\n", - " * A logger with the name of this application set to ``DEBUG``\n", - " level.\n", - "\n", - " This example adds a new handler that writes to a file:\n", - "\n", - " .. code-block:: python\n", - "\n", - " c.Application.logging_config = {\n", - " 'handlers': {\n", - " 'file': {\n", - " 'class': 'logging.FileHandler',\n", - " 'level': 'DEBUG',\n", - " 'filename': '',\n", - " }\n", - " },\n", - " 'loggers': {\n", - " '': {\n", - " 'level': 'DEBUG',\n", - " # NOTE: if you don't list the default \"console\"\n", - " # handler here then it will be disabled\n", - " 'handlers': ['console', 'file'],\n", - " },\n", - " }\n", - " }\n", - "\n", - " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", - "

Components:\n", - "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", - "

\n", - "" - ], - "text/plain": [ - "<__main__.MyTool at 0x7fa1985c6610>" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool3" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-07-03 17:24:55,026 \u001b[1;33mWARNING\u001b[0m [__main__.mytool.AdvancedComponent] (2562530776.on_outfile_changed): Outfile was changed to '{'name': 'outfile', 'old': traitlets.Undefined, 'new': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'), 'owner': <__main__.AdvancedComponent object at 0x7fa1704f4250>, 'type': 'change'}'\n" - ] - }, - { - "data": { - "text/html": [ - "MyTool\n", - "

\n", - "

do some things and stuff

\n", - "
\n", - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "
config_files[] (default: traitlets.Undefined)
iterations1Number of times to run (default: 5)
log_config{} (default: traitlets.Undefined)
log_datefmt%Y-%m-%d %H:%M:%SThe date format used by logging formatters for %(asctime)s (default: %Y-%m-%d %H:%M:%S)
log_fileNoneFilename for the log (default: None)
log_file_levelINFOLogging Level for File Logging (default: INFO)
log_format%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)sThe Logging format template (default: [%(name)s]%(highlevel)s %(message)s)
log_level0Set the log level by value or name. (default: 30)
logging_config{}\n", - " Configure additional log handlers.\n", - "\n", - " The default stderr logs handler is configured by the\n", - " log_level, log_datefmt and log_format settings.\n", - "\n", - " This configuration can be used to configure additional handlers\n", - " (e.g. to output the log to a file) or for finer control over the\n", - " default handlers.\n", - "\n", - " If provided this should be a logging configuration dictionary, for\n", - " more information see:\n", - " https://docs.python.org/3/library/logging.config.html#logging-config-dictschema\n", - "\n", - " This dictionary is merged with the base logging configuration which\n", - " defines the following:\n", - "\n", - " * A logging formatter intended for interactive use called\n", - " ``console``.\n", - " * A logging handler that writes to stderr called\n", - " ``console`` which uses the formatter ``console``.\n", - " * A logger with the name of this application set to ``DEBUG``\n", - " level.\n", - "\n", - " This example adds a new handler that writes to a file:\n", - "\n", - " .. code-block:: python\n", - "\n", - " c.Application.logging_config = {\n", - " 'handlers': {\n", - " 'file': {\n", - " 'class': 'logging.FileHandler',\n", - " 'level': 'DEBUG',\n", - " 'filename': '',\n", - " }\n", - " },\n", - " 'loggers': {\n", - " '': {\n", - " 'level': 'DEBUG',\n", - " # NOTE: if you don't list the default \"console\"\n", - " # handler here then it will be disabled\n", - " 'handlers': ['console', 'file'],\n", - " },\n", - " }\n", - " }\n", - "\n", - " (default: traitlets.Undefined)
overwriteFalse (default: False)
provenance_log/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log (default: traitlets.Undefined)
quietFalse (default: False)
show_configFalseInstead of starting the Application, dump configuration to stdout (default: False)
show_config_jsonFalseInstead of starting the Application, dump configuration to stdout (as JSON) (default: False)
\n", - "

Components:\n", - "MyTool, MyComponent, AdvancedComponent, SecondaryMyComponent, TelescopeWiseComponent\n", - "

\n", - "" - ], - "text/plain": [ - "<__main__.MyTool at 0x7fa170490cd0>" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool.setup()\n", "tool" @@ -8512,41 +537,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "SecondaryMyComponent\n", - "

\n", - "

A second component

\n", - "
\n", - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - "
value-1Value to use (default: -1)
\n", - "
" - ], - "text/plain": [ - "<__main__.SecondaryMyComponent at 0x7fa1704f4a00>" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool.comp2" ] @@ -8560,84 +553,18 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'MyTool': {'config_files': [],\n", - " 'iterations': 1,\n", - " 'log_config': {},\n", - " 'log_datefmt': '%Y-%m-%d %H:%M:%S',\n", - " 'log_file': None,\n", - " 'log_file_level': 'INFO',\n", - " 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s',\n", - " 'log_level': 0,\n", - " 'logging_config': {},\n", - " 'overwrite': False,\n", - " 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'),\n", - " 'quiet': False,\n", - " 'show_config': False,\n", - " 'show_config_json': False,\n", - " 'MyComponent': {'value': -1},\n", - " 'SecondaryMyComponent': {'value': -1},\n", - " 'TelescopeWiseComponent': {'param': TelescopePatternList([('type',\n", - " '*',\n", - " 5.0)])},\n", - " 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'),\n", - " 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'),\n", - " 'value1': -1,\n", - " 'MyComponent': {'value': -1}}}}" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool.get_current_config()" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'MyTool': {'config_files': [],\n", - " 'iterations': 12,\n", - " 'log_config': {},\n", - " 'log_datefmt': '%Y-%m-%d %H:%M:%S',\n", - " 'log_file': None,\n", - " 'log_file_level': 'INFO',\n", - " 'log_format': '%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s',\n", - " 'log_level': 0,\n", - " 'logging_config': {},\n", - " 'overwrite': False,\n", - " 'provenance_log': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/mytool.provenance.log'),\n", - " 'quiet': False,\n", - " 'show_config': False,\n", - " 'show_config_json': False,\n", - " 'MyComponent': {'value': -1},\n", - " 'SecondaryMyComponent': {'value': -1},\n", - " 'TelescopeWiseComponent': {'param': TelescopePatternList([('type',\n", - " '*',\n", - " 5.0)])},\n", - " 'AdvancedComponent': {'infile': PosixPath('/home/aknierim/.cache/ctapipe/cccta-dataserver.in2p3.fr/data/ctapipe-test-data/v1.1.0/gamma_prod5.simtel.zst'),\n", - " 'outfile': PosixPath('/home/aknierim/dev/ctapipe/docs/examples/out.csv'),\n", - " 'value1': -1,\n", - " 'MyComponent': {'value': -1}}}}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tool.iterations = 12\n", "tool.get_current_config()" @@ -8652,244 +579,9 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# Configuration file for mytool.\n", - "\n", - "c = get_config() #noqa\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# Application(SingletonConfigurable) configuration\n", - "#------------------------------------------------------------------------------\n", - "## This is an application.\n", - "\n", - "## The date format used by logging formatters for %(asctime)s\n", - "# Default: '%Y-%m-%d %H:%M:%S'\n", - "# c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", - "\n", - "## The Logging format template\n", - "# Default: '[%(name)s]%(highlevel)s %(message)s'\n", - "# c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", - "\n", - "## Set the log level by value or name.\n", - "# Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - "# Default: 30\n", - "# c.Application.log_level = 30\n", - "\n", - "## Configure additional log handlers.\n", - "# \n", - "# The default stderr logs handler is configured by the log_level, log_datefmt\n", - "# and log_format settings.\n", - "# \n", - "# This configuration can be used to configure additional handlers (e.g. to\n", - "# output the log to a file) or for finer control over the default handlers.\n", - "# \n", - "# If provided this should be a logging configuration dictionary, for more\n", - "# information see:\n", - "# https://docs.python.org/3/library/logging.config.html#logging-config-\n", - "# dictschema\n", - "# \n", - "# This dictionary is merged with the base logging configuration which defines\n", - "# the following:\n", - "# \n", - "# * A logging formatter intended for interactive use called\n", - "# ``console``.\n", - "# * A logging handler that writes to stderr called\n", - "# ``console`` which uses the formatter ``console``.\n", - "# * A logger with the name of this application set to ``DEBUG``\n", - "# level.\n", - "# \n", - "# This example adds a new handler that writes to a file:\n", - "# \n", - "# .. code-block:: python\n", - "# \n", - "# c.Application.logging_config = {\n", - "# 'handlers': {\n", - "# 'file': {\n", - "# 'class': 'logging.FileHandler',\n", - "# 'level': 'DEBUG',\n", - "# 'filename': '',\n", - "# }\n", - "# },\n", - "# 'loggers': {\n", - "# '': {\n", - "# 'level': 'DEBUG',\n", - "# # NOTE: if you don't list the default \"console\"\n", - "# # handler here then it will be disabled\n", - "# 'handlers': ['console', 'file'],\n", - "# },\n", - "# }\n", - "# }\n", - "# Default: {}\n", - "# c.Application.logging_config = {}\n", - "\n", - "## Instead of starting the Application, dump configuration to stdout\n", - "# Default: False\n", - "# c.Application.show_config = False\n", - "\n", - "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", - "# Default: False\n", - "# c.Application.show_config_json = False\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# Tool(Application) configuration\n", - "#------------------------------------------------------------------------------\n", - "## This is an application.\n", - "\n", - "# Default: []\n", - "# c.Tool.config_files = []\n", - "\n", - "# Default: {}\n", - "# c.Tool.log_config = {}\n", - "\n", - "## The date format used by logging formatters for %(asctime)s\n", - "# See also: Application.log_datefmt\n", - "# c.Tool.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", - "\n", - "## Filename for the log\n", - "# Default: None\n", - "# c.Tool.log_file = None\n", - "\n", - "## Logging Level for File Logging\n", - "# Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']\n", - "# Default: 'INFO'\n", - "# c.Tool.log_file_level = 'INFO'\n", - "\n", - "## The Logging format template\n", - "# See also: Application.log_format\n", - "# c.Tool.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", - "\n", - "## Set the log level by value or name.\n", - "# See also: Application.log_level\n", - "# c.Tool.log_level = 30\n", - "\n", - "## \n", - "# See also: Application.logging_config\n", - "# c.Tool.logging_config = {}\n", - "\n", - "# Default: False\n", - "# c.Tool.overwrite = False\n", - "\n", - "# Default: traitlets.Undefined\n", - "# c.Tool.provenance_log = traitlets.Undefined\n", - "\n", - "# Default: False\n", - "# c.Tool.quiet = False\n", - "\n", - "## Instead of starting the Application, dump configuration to stdout\n", - "# See also: Application.show_config\n", - "# c.Tool.show_config = False\n", - "\n", - "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", - "# See also: Application.show_config_json\n", - "# c.Tool.show_config_json = False\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# MyTool(Tool) configuration\n", - "#------------------------------------------------------------------------------\n", - "# See also: Tool.config_files\n", - "# c.MyTool.config_files = []\n", - "\n", - "## Number of times to run\n", - "# Default: 5\n", - "# c.MyTool.iterations = 5\n", - "\n", - "# See also: Tool.log_config\n", - "# c.MyTool.log_config = {}\n", - "\n", - "## The date format used by logging formatters for %(asctime)s\n", - "# See also: Application.log_datefmt\n", - "# c.MyTool.log_datefmt = '%Y-%m-%d %H:%M:%S'\n", - "\n", - "## Filename for the log\n", - "# See also: Tool.log_file\n", - "# c.MyTool.log_file = None\n", - "\n", - "## Logging Level for File Logging\n", - "# See also: Tool.log_file_level\n", - "# c.MyTool.log_file_level = 'INFO'\n", - "\n", - "## The Logging format template\n", - "# See also: Application.log_format\n", - "# c.MyTool.log_format = '[%(name)s]%(highlevel)s %(message)s'\n", - "\n", - "## Set the log level by value or name.\n", - "# See also: Application.log_level\n", - "# c.MyTool.log_level = 30\n", - "\n", - "## \n", - "# See also: Application.logging_config\n", - "# c.MyTool.logging_config = {}\n", - "\n", - "# See also: Tool.overwrite\n", - "# c.MyTool.overwrite = False\n", - "\n", - "# See also: Tool.provenance_log\n", - "# c.MyTool.provenance_log = traitlets.Undefined\n", - "\n", - "# See also: Tool.quiet\n", - "# c.MyTool.quiet = False\n", - "\n", - "## Instead of starting the Application, dump configuration to stdout\n", - "# See also: Application.show_config\n", - "# c.MyTool.show_config = False\n", - "\n", - "## Instead of starting the Application, dump configuration to stdout (as JSON)\n", - "# See also: Application.show_config_json\n", - "# c.MyTool.show_config_json = False\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# MyComponent(Component) configuration\n", - "#------------------------------------------------------------------------------\n", - "## A Component that does stuff\n", - "\n", - "## Value to use\n", - "# Default: -1\n", - "# c.MyComponent.value = -1\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# AdvancedComponent(Component) configuration\n", - "#------------------------------------------------------------------------------\n", - "## An advanced technique\n", - "\n", - "## input file name\n", - "# Default: traitlets.Undefined\n", - "# c.AdvancedComponent.infile = traitlets.Undefined\n", - "\n", - "## output file name\n", - "# Default: traitlets.Undefined\n", - "# c.AdvancedComponent.outfile = traitlets.Undefined\n", - "\n", - "## Value to use\n", - "# Default: -1\n", - "# c.AdvancedComponent.value1 = -1\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# SecondaryMyComponent(MyComponent) configuration\n", - "#------------------------------------------------------------------------------\n", - "## A second component\n", - "\n", - "## Value to use\n", - "# See also: MyComponent.value\n", - "# c.SecondaryMyComponent.value = -1\n", - "\n", - "#------------------------------------------------------------------------------\n", - "# TelescopeWiseComponent(TelescopeComponent) configuration\n", - "#------------------------------------------------------------------------------\n", - "## a component that contains parameters that are per-telescope configurable\n", - "\n", - "## Something configurable with telescope patterns.\n", - "# Default: [('type', '*', 5.0)]\n", - "# c.TelescopeWiseComponent.param = [('type', '*', 5.0)]\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "print(tool.generate_config_file())" ] From 4f5f051c1c7137442a35c3496dc0b9c1abaf4013 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 13:05:15 +0200 Subject: [PATCH 043/264] Fix add_css_file call in docs/conf.py --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 6c41637ed84..8b0c35f29be 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -68,11 +68,11 @@ def setup(app): + app.add_css_file("ctapipe.css") + # fix trait aliases generating doc warnings from ctapipe.core import traits - app.add_css_file("_static/ctapipe.css") - aliases = [ "flag", "observe", From 63b9e63ced2aaa5e01ddc2edb9bc92dc7f9859f0 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 13:05:45 +0200 Subject: [PATCH 044/264] Fix Tool repr_html and add html escaping --- ctapipe/core/component.py | 15 +++++++++------ ctapipe/core/tool.py | 10 +++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ctapipe/core/component.py b/ctapipe/core/component.py index cbfc05b2584..b3b5b91a733 100644 --- a/ctapipe/core/component.py +++ b/ctapipe/core/component.py @@ -1,4 +1,5 @@ """ Class to handle configuration for algorithms """ +import html import warnings import weakref from abc import ABCMeta @@ -235,7 +236,7 @@ def _repr_html_(self): lines = [ '
', f"{name}", - f"

{docstring}

", + docstring, "", " ", " ", @@ -246,21 +247,23 @@ def _repr_html_(self): ] for key, val in self.get_current_config()[name].items(): htmlval = ( - str(val).replace("/", "/").replace("_", "_") + html.escape(str(val)).replace("/", "/").replace("_", "_") ) # allow breaking at boundary # traits of the current component if key in traits: - thehelp = f"{traits[key].help} (default: {traits[key].default_value})" + thehelp = html.escape( + f"{traits[key].help} (default: {traits[key].default_value})" + ) lines.append(f"") if val != traits[key].default_value: lines.append( - f"" + f'' ) else: - lines.append(f"") + lines.append(f'') lines.append( - f"" + f'' ) lines.append(" ") lines.append("
{key}{htmlval}{htmlval}{htmlval}{htmlval}{thehelp}
{thehelp}
") diff --git a/ctapipe/core/tool.py b/ctapipe/core/tool.py index 5f6744d2c95..5d28c1585a3 100644 --- a/ctapipe/core/tool.py +++ b/ctapipe/core/tool.py @@ -1,4 +1,5 @@ """Classes to handle configurable command-line user interfaces.""" +import html import logging import logging.config import os @@ -495,8 +496,9 @@ def _repr_html_(self): or "Undocumented" ) lines = [ + '
', f"{name}", - f"

{docstring}

", + docstring, "", " ", " ", @@ -507,12 +509,14 @@ def _repr_html_(self): ] for key, val in self.get_current_config()[name].items(): htmlval = ( - str(val).replace("/", "/").replace("_", "_") + html.escape(str(val)).replace("/", "/").replace("_", "_") ) # allow breaking at boundary # traits of the current component if key in traits: - thehelp = f"{traits[key].help} (default: {traits[key].default_value})" + thehelp = html.escape( + f"{traits[key].help} (default: {traits[key].default_value})" + ) lines.append(f"") if val != traits[key].default_value: lines.append( From beb5fadd56f43a708c6f05ba0f2cda321864b590 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 13:09:22 +0200 Subject: [PATCH 045/264] Simplify __init__.py --- ctapipe/calib/camera/__init__.py | 10 ++++------ ctapipe/instrument/camera/__init__.py | 16 ++++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/ctapipe/calib/camera/__init__.py b/ctapipe/calib/camera/__init__.py index b71a6d469c8..b5b41267892 100644 --- a/ctapipe/calib/camera/__init__.py +++ b/ctapipe/calib/camera/__init__.py @@ -6,9 +6,7 @@ from .calibrator import CameraCalibrator # noqa: F401 from .gainselection import GainSelector # noqa: F401 -# __all__ = [ -# "CameraCalibrator", -# "GainSelector", -# ] - -__all__ = [] +__all__ = [ + # "CameraCalibrator", + # "GainSelector", +] diff --git a/ctapipe/instrument/camera/__init__.py b/ctapipe/instrument/camera/__init__.py index 43a0644f6f9..e64c4e0db10 100644 --- a/ctapipe/instrument/camera/__init__.py +++ b/ctapipe/instrument/camera/__init__.py @@ -2,11 +2,11 @@ from .geometry import CameraGeometry, PixelShape, UnknownPixelShapeWarning # noqa: F401 from .readout import CameraReadout # noqa: F401 -# __all__ = [ -# "CameraDescription", -# "CameraGeometry", -# "PixelShape", -# "UnknownPixelShapeWarning", -# "CameraReadout", -# ] -__all__ = [] +# commented out due to sphinx issue with classes being defined in 3 places +__all__ = [ + # "CameraDescription", + # "CameraGeometry", + # "PixelShape", + # "UnknownPixelShapeWarning", + # "CameraReadout", +] From dcb59d96db03b14ccb4f230ff3ca9f8ebbfe467a Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 14:09:38 +0200 Subject: [PATCH 046/264] Remove EventSource.from_config, fixes #2258 --- ctapipe/io/eventsource.py | 24 ------------------------ ctapipe/io/tests/test_event_source.py | 8 ++++---- ctapipe/tools/display_dl1.py | 2 +- docs/changes/2384.api.rst | 2 ++ 4 files changed, 7 insertions(+), 29 deletions(-) create mode 100644 docs/changes/2384.api.rst diff --git a/ctapipe/io/eventsource.py b/ctapipe/io/eventsource.py index 40de7dd7891..8fa293c8bb0 100644 --- a/ctapipe/io/eventsource.py +++ b/ctapipe/io/eventsource.py @@ -417,30 +417,6 @@ def _find_input_url_in_config(cls, config=None, parent=None): return input_url - @classmethod - def from_config(cls, config=None, parent=None, **kwargs): - """ - Find compatible EventSource for the EventSource.input_url traitlet - specified via the config. - - This method is typically used in Tools, where the input_url is chosen via - the command line using the traitlet configuration system. - - Parameters - ---------- - config : traitlets.config.loader.Config - Configuration created in the Tool - kwargs - Named arguments for the EventSource - - Returns - ------- - instance - Instance of a compatible EventSource subclass - """ - input_url = cls._find_input_url_in_config(config=config, parent=parent) - return cls.from_url(input_url, config=config, parent=parent, **kwargs) - def close(self): """Close this event source. diff --git a/ctapipe/io/tests/test_event_source.py b/ctapipe/io/tests/test_event_source.py index 639d3547181..71074ddcb01 100644 --- a/ctapipe/io/tests/test_event_source.py +++ b/ctapipe/io/tests/test_event_source.py @@ -102,14 +102,14 @@ def test_from_config(tmp_path): assert reader.input_url == dataset -def test_from_config_parent(): +def test_parent(): dataset = get_dataset_path(prod5_path) class Parent(Component): def __init__(self, config=None, parent=None): super().__init__(config=config, parent=parent) - self.source = EventSource.from_config(parent=self) + self.source = EventSource(parent=self) # test with EventSource in root of config config = Config({"EventSource": {"input_url": dataset}}) @@ -132,7 +132,7 @@ def test_from_config_default(): dataset = get_dataset_path(prod5_path) EventSource.input_url.default_value = dataset config = Config() - reader = EventSource(config=config, parent=None) + reader = EventSource(config=config) assert isinstance(reader, SimTelEventSource) assert reader.input_url == dataset EventSource.input_url.default_value = old_default @@ -143,7 +143,7 @@ def test_from_config_invalid_type(): EventSource.input_url.default_value = dataset config = Config({"EventSource": {"input_url": 124}}) with pytest.raises(TraitError): - EventSource(config=config, parent=None) + EventSource(config=config) def test_event_source_input_url_config_override(): diff --git a/ctapipe/tools/display_dl1.py b/ctapipe/tools/display_dl1.py index af6bde705f7..7a27305b60b 100644 --- a/ctapipe/tools/display_dl1.py +++ b/ctapipe/tools/display_dl1.py @@ -173,7 +173,7 @@ def __init__(self, **kwargs): self.plotter = None def setup(self): - self.eventsource = self.enter_context(EventSource.from_config(parent=self)) + self.eventsource = self.enter_context(EventSource(parent=self)) self.quality_query = QualityQuery(parent=self) compatible_datalevels = [DataLevel.R1, DataLevel.DL0, DataLevel.DL1_IMAGES] diff --git a/docs/changes/2384.api.rst b/docs/changes/2384.api.rst new file mode 100644 index 00000000000..32647abe5eb --- /dev/null +++ b/docs/changes/2384.api.rst @@ -0,0 +1,2 @@ +Remove ``EventSource.from_config``, simply use ``EventSource(config=config)`` or +``EventSource(parent=parent)``. From 02798cb1a13305af15f449cc7f43545b79c6eb44 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 17 Jul 2023 14:55:52 +0200 Subject: [PATCH 047/264] Remove version switcher from navbar * Remove version switcher since it needs to be updated by hand every time a new version is released * Remove now-obsolete ``docs/_static/switcher.json`` * Remove ``jinja2`` dependency from ``environment.yml`` --- docs/_static/switcher.json | 72 -------------------------------------- docs/conf.py | 32 +---------------- environment.yml | 1 - 3 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 docs/_static/switcher.json diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json deleted file mode 100644 index 59a6b3a5637..00000000000 --- a/docs/_static/switcher.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "name": "dev", - "version": "latest", - "url": "https://ctapipe.readthedocs.io/en/latest/" - }, - { - "name": "v0.19.2 (stable)", - "version": "stable", - "url": "https://ctapipe.readthedocs.io/en/stable/" - }, - { - "name": "v0.19.3", - "version": "v0.19.3", - "url": "https://ctapipe.readthedocs.io/en/v0.19.3/" - }, - { - "name": "v0.19.2", - "version": "v0.19.2", - "url": "https://ctapipe.readthedocs.io/en/v0.19.2/" - }, - { - "name": "v0.19.1", - "version": "v0.19.1", - "url": "https://ctapipe.readthedocs.io/en/v0.19.1/" - }, - { - "name": "v0.19.0", - "version": "v0.19.0", - "url": "https://ctapipe.readthedocs.io/en/v0.19.0/" - }, - { - "name": "v0.18.1", - "version": "v0.18.1", - "url": "https://ctapipe.readthedocs.io/en/v0.18.1/" - }, - { - "name": "v0.18.0", - "version": "v0.18.0", - "url": "https://ctapipe.readthedocs.io/en/v0.18.0/" - }, - { - "name": "v0.17.0", - "version": "v0.17.0", - "url": "https://ctapipe.readthedocs.io/en/v0.17.0/" - }, - { - "name": "v0.16.0", - "version": "v0.16.0", - "url": "https://ctapipe.readthedocs.io/en/v0.16.0/" - }, - { - "name": "v0.15.0", - "version": "v0.15.0", - "url": "https://ctapipe.readthedocs.io/en/v0.15.0/" - }, - { - "name": "v0.14.0", - "version": "v0.14.0", - "url": "https://ctapipe.readthedocs.io/en/v0.14.0/" - }, - { - "name": "v0.12.0-rtd", - "version": "v0.12.0-rtd", - "url": "https://ctapipe.readthedocs.io/en/v0.12.0-rtd/" - }, - { - "name": "v0.11.0-rtd", - "version": "v0.11.0-rtd", - "url": "https://ctapipe.readthedocs.io/en/v0.11.0-rtd/" - } -] diff --git a/docs/conf.py b/docs/conf.py index 8b0c35f29be..013d99135dc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -190,32 +190,8 @@ def setup(app): todo_include_todos = True -# -- Version switcher ----------------------------------------------------- - -# Define the json_url for our version switcher. -json_url = "https://ctapipe.readthedocs.io/en/latest/_static/switcher.json" - -# Define the version we use for matching in the version switcher. -version_match = os.environ.get("READTHEDOCS_VERSION") -# If READTHEDOCS_VERSION doesn't exist, we're not on RTD -# If it is an integer, we're in a PR build and the version isn't correct. -if not version_match or version_match.isdigit(): - # For local development, infer the version to match from the package. - release = ctapipe.__version__ - if "dev" in release or "rc" in release: - version_match = "latest" - # We want to keep the relative reference if we are in dev mode - # but we want the whole url if we are effectively in a released version - json_url = "_static/switcher.json" - else: - version_match = release - - # -- Options for HTML output ---------------------------------------------- -# on_rtd is whether we are on readthedocs.org -on_rtd = os.environ.get("READTHEDOCS", None) == "True" - html_theme = "pydata_sphinx_theme" @@ -224,7 +200,6 @@ def setup(app): # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -# html_theme_options = { "logo": { "image_light": "ctapipe_logo.webp", @@ -233,11 +208,7 @@ def setup(app): }, "github_url": "https://github.com/cta-observatory/ctapipe", "header_links_before_dropdown": 6, - "navbar_start": ["navbar-logo", "version-switcher"], - "switcher": { - "version_match": version_match, - "json_url": json_url, - }, + "navbar_start": ["navbar-logo"], "use_edit_page_button": True, "icon_links": [ { @@ -253,7 +224,6 @@ def setup(app): # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = ['_static'] html_static_path = ["_static"] html_context = { "default_mode": "light", diff --git a/environment.yml b/environment.yml index bbc3bad0b47..99abfdd296c 100644 --- a/environment.yml +++ b/environment.yml @@ -48,5 +48,4 @@ dependencies: - zlib - zstandard - eventio>=1.9.1 - - jinja2 - ffmpeg # for making movies in the documentation From a089c49abcb60e6ed9f76a79c306ea69dc3eec0f Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 17 Jul 2023 15:48:56 +0200 Subject: [PATCH 048/264] Add sidebar to all pages --- docs/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 013d99135dc..8c36fd896ae 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -220,6 +220,10 @@ def setup(app): ], } +html_sidebars = { + "**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"] +} + # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 61547d2747afb2513a5e0180a79406cf534f843c Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 17 Jul 2023 16:00:28 +0200 Subject: [PATCH 049/264] Fix for failed CI/lint --- docs/conf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 8c36fd896ae..c6121f5717b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -220,9 +220,7 @@ def setup(app): ], } -html_sidebars = { - "**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"] -} +html_sidebars = {"**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"]} # Add any paths that contain custom static files (such as style sheets) here, From 22d20622ead385fea7d7c08e582f6b91e1f8b42c Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 18 Jul 2023 17:52:05 +0200 Subject: [PATCH 050/264] Move content of caution admonition to announcement banner * Move content of caution admonition block to announcement banner, as this results in a cleaner main page * Remove ``html_sidebars`` for testing purposes --- docs/conf.py | 9 ++++++--- docs/index.rst | 6 ------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index c6121f5717b..5110db2d486 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -210,6 +210,7 @@ def setup(app): "header_links_before_dropdown": 6, "navbar_start": ["navbar-logo"], "use_edit_page_button": True, + "icon_links_label": "Quick Links", "icon_links": [ { "name": "CTA Observatory", @@ -218,11 +219,13 @@ def setup(app): "icon": "https://www.cta-observatory.org/wp-content/themes/ctao/favicon.ico", }, ], + "announcement": """ +

ctapipe is not stable yet, so expect large and rapid + changes to structure and functionality as we explore various + design choices before the 1.0 release.

+ """, } -html_sidebars = {"**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"]} - - # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". diff --git a/docs/index.rst b/docs/index.rst index 6485c01d5b3..84dec76af64 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -40,12 +40,6 @@ Prototype CTA Pipeline Framework (``ctapipe``) ``ctapipe`` is a framework for prototyping the low-level data processing algorithms for the Cherenkov Telescope Array. -.. CAUTION:: - This is not yet stable code, so expect large and rapid changes to - structure and functionality as we explore various design choices before - the 1.0 release. - - .. _ctapipe_docs: .. toctree:: From 2a6b6edb72df2c7bfb9ff519421ba714624d7baf Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 18 Jul 2023 18:34:37 +0200 Subject: [PATCH 051/264] Add sphinx conf path to .readthedocs.yml --- .readthedocs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.readthedocs.yml b/.readthedocs.yml index 98b2982554b..ca08d556fa9 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -8,6 +8,9 @@ build: tools: python: "3.8" +sphinx: + configuration: docs/conf.py + python: install: - method: pip From 854a84e6aa38d875f98de8e0bd99c172cb5d3f9b Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 18 Jul 2023 18:51:17 +0200 Subject: [PATCH 052/264] Add sidebars again At least we have a version switcher for now --- .readthedocs.yml | 3 --- docs/conf.py | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index ca08d556fa9..98b2982554b 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -8,9 +8,6 @@ build: tools: python: "3.8" -sphinx: - configuration: docs/conf.py - python: install: - method: pip diff --git a/docs/conf.py b/docs/conf.py index 5110db2d486..3c493c6920d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -226,6 +226,8 @@ def setup(app): """, } +html_sidebars = {"**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"]} + # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". From c782ba0303356013abd88680ccdf386b502234f1 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 19 Jul 2023 14:17:23 +0200 Subject: [PATCH 053/264] Add navbar version switcher --- docs/_static/switcher.json | 72 ++++++++++++++++++++++++++++++++++++++ docs/conf.py | 28 +++++++++++++-- 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 docs/_static/switcher.json diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json new file mode 100644 index 00000000000..59a6b3a5637 --- /dev/null +++ b/docs/_static/switcher.json @@ -0,0 +1,72 @@ +[ + { + "name": "dev", + "version": "latest", + "url": "https://ctapipe.readthedocs.io/en/latest/" + }, + { + "name": "v0.19.2 (stable)", + "version": "stable", + "url": "https://ctapipe.readthedocs.io/en/stable/" + }, + { + "name": "v0.19.3", + "version": "v0.19.3", + "url": "https://ctapipe.readthedocs.io/en/v0.19.3/" + }, + { + "name": "v0.19.2", + "version": "v0.19.2", + "url": "https://ctapipe.readthedocs.io/en/v0.19.2/" + }, + { + "name": "v0.19.1", + "version": "v0.19.1", + "url": "https://ctapipe.readthedocs.io/en/v0.19.1/" + }, + { + "name": "v0.19.0", + "version": "v0.19.0", + "url": "https://ctapipe.readthedocs.io/en/v0.19.0/" + }, + { + "name": "v0.18.1", + "version": "v0.18.1", + "url": "https://ctapipe.readthedocs.io/en/v0.18.1/" + }, + { + "name": "v0.18.0", + "version": "v0.18.0", + "url": "https://ctapipe.readthedocs.io/en/v0.18.0/" + }, + { + "name": "v0.17.0", + "version": "v0.17.0", + "url": "https://ctapipe.readthedocs.io/en/v0.17.0/" + }, + { + "name": "v0.16.0", + "version": "v0.16.0", + "url": "https://ctapipe.readthedocs.io/en/v0.16.0/" + }, + { + "name": "v0.15.0", + "version": "v0.15.0", + "url": "https://ctapipe.readthedocs.io/en/v0.15.0/" + }, + { + "name": "v0.14.0", + "version": "v0.14.0", + "url": "https://ctapipe.readthedocs.io/en/v0.14.0/" + }, + { + "name": "v0.12.0-rtd", + "version": "v0.12.0-rtd", + "url": "https://ctapipe.readthedocs.io/en/v0.12.0-rtd/" + }, + { + "name": "v0.11.0-rtd", + "version": "v0.11.0-rtd", + "url": "https://ctapipe.readthedocs.io/en/v0.11.0-rtd/" + } +] diff --git a/docs/conf.py b/docs/conf.py index 3c493c6920d..4c228dc4886 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -190,6 +190,26 @@ def setup(app): todo_include_todos = True +# -- Version switcher ----------------------------------------------------- + +# Define the json_url for our version switcher. +json_url = "https://ctapipe.readthedocs.io/en/latest/_static/switcher.json" + +# Define the version we use for matching in the version switcher. +version_match = os.environ.get("READTHEDOCS_VERSION") +# If READTHEDOCS_VERSION doesn't exist, we're not on RTD +# If it is an integer, we're in a PR build and the version isn't correct. +if not version_match or version_match.isdigit(): + # For local development, infer the version to match from the package. + if "dev" in release or "rc" in release: + version_match = "latest" + # We want to keep the relative reference if we are in dev mode + # but we want the whole url if we are effectively in a released version + json_url = "_static/switcher.json" + else: + version_match = release + + # -- Options for HTML output ---------------------------------------------- html_theme = "pydata_sphinx_theme" @@ -208,7 +228,11 @@ def setup(app): }, "github_url": "https://github.com/cta-observatory/ctapipe", "header_links_before_dropdown": 6, - "navbar_start": ["navbar-logo"], + "navbar_start": ["navbar-logo", "version-switcher"], + "switcher": { + "version_match": version_match, + "json_url": json_url, + }, "use_edit_page_button": True, "icon_links_label": "Quick Links", "icon_links": [ @@ -226,8 +250,6 @@ def setup(app): """, } -html_sidebars = {"**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"]} - # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". From 05cc382a78bf7717e175deb0904928aee4b4ba1f Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 19 Jul 2023 15:41:28 +0200 Subject: [PATCH 054/264] Fix versions in switcher.json * Stable is now called stable (without version tag) * Add colors to stable and dev versions in switcher --- docs/_static/ctapipe.css | 22 +++++++++++++++++++++- docs/_static/switcher.json | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/_static/ctapipe.css b/docs/_static/ctapipe.css index 243e4af60cd..30483b997f2 100644 --- a/docs/_static/ctapipe.css +++ b/docs/_static/ctapipe.css @@ -12,6 +12,27 @@ } } +.version-switcher__container a[data-version-name*="stable"] { + background-color: #E9F6EC; + color: #28A745; +} + +.version-switcher__container a[data-version-name*="dev"] { + background-color: #FDF4EB; + color: #EE9040; +} + +html[data-theme="dark"] .version-switcher__container a[data-version-name*="stable"] { + background-color: #222924; + color: #28A745; +} + +html[data-theme="dark"] .version-switcher__container a[data-version-name*="dev"] { + background-color: #332A21; + color: #EE9040; +} + + /* sphinx-design */ .sd-card { border-radius: 5px; @@ -44,4 +65,3 @@ html[data-theme="dark"] .sd-shadow-sm { --sd-color-shadow: #6e6e6e; } - diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 59a6b3a5637..f2c980b19f7 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -5,7 +5,7 @@ "url": "https://ctapipe.readthedocs.io/en/latest/" }, { - "name": "v0.19.2 (stable)", + "name": "stable", "version": "stable", "url": "https://ctapipe.readthedocs.io/en/stable/" }, From fcc398104d709afde73c98237b13482b2a4dff75 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 17 Jul 2023 11:08:57 +0200 Subject: [PATCH 055/264] Update dev getting started --- docs/getting_started/index.rst | 123 +++++++++++++++++++++++---------- 1 file changed, 87 insertions(+), 36 deletions(-) diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index 92e6ba6b614..59d278581b6 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -17,6 +17,28 @@ We strongly recommend using the `mambaforge conda distribution `_. + +++++++++++++++++++++++++++++++++++++++ @@ -78,42 +119,36 @@ Change to the directory where you cloned ``ctapipe``, and type: .. code-block:: console - $ conda env create -n cta-dev -f environment.yml + $ mamba env create -f environment.yml -This will create a conda virtual environment called ``cta-dev`` with all +This will create a conda environment called ``cta-dev`` with all the ctapipe dependencies and a few useful packages for development and interaction. Next, switch to this new virtual environment: .. code-block:: console - $ source activate cta-dev - + $ mamba activate cta-dev You will need to type that last command any time you open a new -terminal to actiavate the virtual environment (you can of course -install everything into the base Anaconda environment without creating -a virtual environment, but then you may have trouble if you want to -install other packages with different requirements on the -dependencies) +terminal to activate the conda environment. + +++++++++++++++++++++++++++++++++++++ Step 5: Setup ctapipe for development +++++++++++++++++++++++++++++++++++++ Now setup this cloned version for development. The following command -will make symlinks in your python library directory to your ctapipe -installation (it creates a ``.pth`` file, there is no need to set -PYTHONPATH, in fact it should be blank to avoid other problems). From -then on, all the ctapipe binaries and the library itself will be +will make use the editable installation feature of python packages. +From then on, all the ctapipe executables and the library itself will be usable from anywhere. .. code-block:: console $ pip install -e . -ctapipe supports adding so-called event sources and reconstructors -through plugins. In order for the respective tests to pass you have +ctapipe supports adding so-called event sources and reconstructors +through plugins. In order for the respective tests to pass you have to install the test plugin via .. code-block:: console @@ -144,32 +179,35 @@ try running some command line tools: .. code-block:: console $ ctapipe-info --all - $ ctapipe-camdemo --camera=NectarCam # try --help for more info + $ ctapipe-process -i dataset://gamma_prod5.simtel.zst -o test.h5 # try --help for more info To update to the latest development version (merging in remote changes to your local working copy): .. code-block:: console - $ git pull upstream master + $ git fetch upstream + $ git merge upstream/main # or rebase, see above --------------------------------------- Developing a new feature or code change --------------------------------------- -We adhere to the PEP8 coding style (see our :doc:`/development/style-guide`). -To enforce this, setup the +We are using the ``black`` and ``isort`` auto-formatters for automatic +adherence to the code style (see our :doc:`/development/style-guide`). +To enforce running these tools whenever you make a commit, setup the `pre-commit hook `_:: $ pre-commit install -You should always create a branch when developing some new code (unless it is -a very small change). Generally make a new branch for each new feature, so -that you can make pull-requests for each one separately and not mix code -from each. Remember that ``git switch `` switches between branches, +You should always create a new branch when developing some new code. +Make a new branch for each new feature, so that you can make pull-requests +for each one separately and not mix code from each. +Remember that ``git switch `` switches between branches, ``git switch -c `` creates a new branch, and ``git branch`` on it's own will tell you which branches are available and which one you are currently on. + First think of a name for your code change, here we'll use *implement_feature_1* as an example. @@ -177,9 +215,14 @@ First think of a name for your code change, here we'll use 1. Create a feature branch: +++++++++++++++++++++++++++ -.. code-block:: sh +To ensure you are starting your work from an up-to-date ``main`` branch, +we recommend starting a new branch like this: + +.. code-block:: console + + $ git fetch upstream # get latest changes from main repository + $ git switch -c upstream/main # start new branch at upstream/main - $ git checkout -b implement_feature_1 ++++++++++++++++ 2. Edit the code @@ -227,12 +270,19 @@ sub-module), check the style, and make sure the docs render correctly 3. Push your branch to your fork on github ++++++++++++++++++++++++++++++++++++++++++ -(sometimes refered to as -"publishing" since it becomes public, but only in your fork) by running +The first time you push a new branch, you need to specify to which remote the branch +should be pushed. Normally this will be ``origin``: -.. code-block:: sh +.. code-block:: console + + $ git push -u origin implement_feature_1 + +After that first setup, you can push new changes using a simple + +.. code-block:: console + + $ git push - git push You can do this at any time and more than once. It just moves the changes from your local branch on your development machine to your fork on github. @@ -286,14 +336,15 @@ since it is no longer needed (assuming it was accepted and merged in): .. code-block:: sh - git checkout master # switch back to your master branch + git switch main # switch back to your master branch pull in the upstream changes, which should include your new features, and remove the branch from the local and remote (github). .. code-block:: sh - git pull upstream master + git fetch upstream + git rebase upstream/main git branch --delete --remotes implement_feature_1 Note the last step can also be done on the GitHub website. @@ -307,7 +358,7 @@ show strange behaviour. **Debugging** is one of the power tools each developer should know. Since using ``print`` statements is **not** debugging and does not give you access to runtime variables at the point where your code fails, we recommend using ``pdb`` or ``ipdb`` for an IPython shell. -A nice introdcution can be found `here `_. +A nice introduction can be found `here `_. --------------------- More Development help From 034bd2bd1569a2cedf5fe72af994a74cc6a43d8d Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 19 Jul 2023 12:17:32 +0200 Subject: [PATCH 056/264] Address review comments --- docs/getting_started/index.rst | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index 59d278581b6..1e0eb39db0a 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -23,9 +23,9 @@ Forking vs. Working in the Main Repository ------------------------------------------ If you are a member of CTA (Consortium or Observatory), or otherwise a regular contributor to ctapipe, the maintainers can give you -access too the main repository at ``cta-observatory/ctapipe``. -Working directly in the main repository has two main advantages over working -using a personal fork: +access to the main repository at ``cta-observatory/ctapipe``. +Working directly in the main repository has two main advantages +over using a personal fork: - No need for synchronisation between the fork and the main repository - Easier collaboration on the same branch with other developers @@ -80,13 +80,15 @@ ctapipe repo (make sure you put in your own username there): $ cd ctapipe -You now need to tell Git that this repo where the main ctapipe repository is: +If you are using a fork, the default remote repository will be the one in your user account on GitHub. +To be able to synchronize with the official copy in the cta-observatory account, +you need to add an upstream remote as follows: .. code-block:: console $ git remote add upstream https://github.com/cta-observatory/ctapipe.git -If that worked, then you should see a *upstream* target in +If that worked, you should see an *upstream* remote in addition to *origin* when typing ``git remote -v``. To get changes from the main repository, run: @@ -138,15 +140,20 @@ terminal to activate the conda environment. Step 5: Setup ctapipe for development +++++++++++++++++++++++++++++++++++++ -Now setup this cloned version for development. The following command -will make use the editable installation feature of python packages. +Now setup this cloned version for development. +The following command will use editable installation feature of python packages. From then on, all the ctapipe executables and the library itself will be -usable from anywhere. +usable from anywhere, given you have activated the ``cta-dev`` conda environment. .. code-block:: console $ pip install -e . +Using the editable installation means you won't have to rerun the installation for +simple code changes to take effect. +However, for things like adding new submodules or new entry points, rerunning the above +step might still be needed. + ctapipe supports adding so-called event sources and reconstructors through plugins. In order for the respective tests to pass you have to install the test plugin via @@ -203,7 +210,7 @@ To enforce running these tools whenever you make a commit, setup the You should always create a new branch when developing some new code. Make a new branch for each new feature, so that you can make pull-requests for each one separately and not mix code from each. -Remember that ``git switch `` switches between branches, +Remember that ``git switch `` [#switch]_ switches between branches, ``git switch -c `` creates a new branch, and ``git branch`` on it's own will tell you which branches are available and which one you are currently on. @@ -374,3 +381,7 @@ automatically. It provides a graphical view of your fork and the upstream cta-observatory repository, so you can see easily what version you are working on. It will handle the forking, syncing, and even allow you to issue pull-requests. + +.. rubric:: Footnotes + +.. [#switch] ``git switch`` is a relatively new addition to git. If your version of git does not have it, update or use ``git checkout`` instead. The equivalent old command to ``git switch -c`` is ``git checkout -b``. From 52106f49c81f4bbd1791b9ec1ce635730d9f3e5f Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 19 Jul 2023 12:48:54 +0200 Subject: [PATCH 057/264] Add footnote about autoSetup{Merge,Remote} --- docs/getting_started/index.rst | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index 1e0eb39db0a..c96cf0e6557 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -154,9 +154,9 @@ simple code changes to take effect. However, for things like adding new submodules or new entry points, rerunning the above step might still be needed. -ctapipe supports adding so-called event sources and reconstructors -through plugins. In order for the respective tests to pass you have -to install the test plugin via +ctapipe supports adding new ``EventSource`` and ``Reconstructor`` implementations +through plugins. In order for the respective tests to pass you have to install the +test plugin via .. code-block:: console @@ -278,7 +278,7 @@ sub-module), check the style, and make sure the docs render correctly ++++++++++++++++++++++++++++++++++++++++++ The first time you push a new branch, you need to specify to which remote the branch -should be pushed. Normally this will be ``origin``: +should be pushed [#push]_. Normally this will be ``origin``: .. code-block:: console @@ -385,3 +385,11 @@ even allow you to issue pull-requests. .. rubric:: Footnotes .. [#switch] ``git switch`` is a relatively new addition to git. If your version of git does not have it, update or use ``git checkout`` instead. The equivalent old command to ``git switch -c`` is ``git checkout -b``. + +.. [#push] As of git version 2.37, you can set these options so that ``git push`` will just work, +also for the first push: + +.. code-block:: console + + $ git config --global branch.autoSetupMerge simple + $ git config --global push.autoSetupRemote true From d1a9e607f98a9f1c4b8fdf6090712b98c8cd75e1 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 20 Jul 2023 17:29:57 +0200 Subject: [PATCH 058/264] Remove default channel from env --- environment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/environment.yml b/environment.yml index 0836ac3a37b..e0951f7fec1 100644 --- a/environment.yml +++ b/environment.yml @@ -2,7 +2,6 @@ name: cta-dev channels: - conda-forge - - default dependencies: - python=3.11 - pip From abf98a08905491f311d9f54e92fb9671414008d8 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 26 May 2023 13:35:55 +0200 Subject: [PATCH 059/264] Add fields defined in CTAO DL0 and R1 data models --- ctapipe/containers.py | 126 +++++++++++++++++++++++++++++++- ctapipe/tests/test_datamodel.py | 16 ++++ 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 ctapipe/tests/test_datamodel.py diff --git a/ctapipe/containers.py b/ctapipe/containers.py index 1bb01418aa4..f1ad4fb2ac0 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -165,6 +165,70 @@ class EventType(enum.Enum): UNKNOWN = 255 +class PixelStatus(enum.IntFlag): + """ + Pixel status information + + See DL0 Data Model specification: + https://redmine.cta-observatory.org/dmsf/files/17552/view + """ + + DVR_STORED_AS_SIGNAL = enum.auto() + DVR_STORED_NO_SIGNAL = enum.auto() + HIGH_GAIN_STORED = enum.auto() + LOW_GAIN_STORED = enum.auto() + SATURATED = enum.auto() + PIXEL_TRIGGER_0 = enum.auto() + PIXEL_TRIGGER_1 = enum.auto() + PIXEL_TRIGGER_2 = enum.auto() + + #: DVR status uses two bits + #: 0 = not stored, 1 = identified as signal, 2 = stored, not identified as signal + DVR_STATUS = DVR_STORED_AS_SIGNAL | DVR_STORED_NO_SIGNAL + + #: Pixel trigger information, TBD + PIXEL_TRIGGER = PIXEL_TRIGGER_0 | PIXEL_TRIGGER_1 | PIXEL_TRIGGER_2 + + @staticmethod + def get_dvr_status(pixel_status): + """ + Return only the bits corresponding to the DVR_STATUS + + Returns + ------- + dvr_status: int or array[uint8] + 0 = pixel not stored + 1 = pixel was identified as signal pixel and stored + 2 = pixel was stored, but not identified as signal + """ + return pixel_status & PixelStatus.DVR_STATUS + + @staticmethod + def get_channel_info(pixel_status): + """ + Return only the bits corresponding to the channel info (high/low gain stored) + + Returns + ------- + channel_info: int or array[uint8] + 0 = pixel broken / disabled + 1 = only high gain read out + 2 = only low gain read out + 3 = both gains read out + """ + gain_bits = PixelStatus.HIGH_GAIN_STORED | PixelStatus.LOW_GAIN_STORED + return (pixel_status & gain_bits) >> 2 + + @staticmethod + def is_invalid(pixel_status): + """Return if pixel values are marked as invalid + + This is encoded in the data model as neither high gain nor low gain marked as stored + """ + gain_bits = PixelStatus.HIGH_GAIN_STORED | PixelStatus.LOW_GAIN_STORED + return (pixel_status & gain_bits) == 0 + + class EventIndexContainer(Container): """index columns to include in event lists, common to all data levels""" @@ -503,6 +567,9 @@ class R1CameraContainer(Container): Storage of r1 calibrated data from a single telescope """ + event_type = Field(EventType.UNKNOWN, "type of event", type=EventType) + event_time = Field(NAN_TIME, "event timestamp") + waveform = Field( None, ( @@ -510,10 +577,42 @@ class R1CameraContainer(Container): "Shape: (n_pixels, n_samples)" ), ) + + pixel_status = Field( + None, + "Array of pixel status values, see PixelStatus for definition of the values", + ndim=1, + dtype=np.uint8, + ) + + first_cell_id = Field( + None, + "Array of first cell ids of the readout chips. Only used by LST and SST.", + dtype=np.uint32, + ) + + module_hires_local_clock_counter = Field( + None, + "Counter values of the camera modules", + dtype=np.uint64, + ) + + pedestal_intensity = Field( + None, + "Pedestal intensity in each pixel in DC", + dtype=np.float32, + ) + + calibration_monitoring_id = Field( + None, + "ID of the CalibrationMonitoringSet containing the applied pre-calibration parameters", + ) + selected_gain_channel = Field( None, ( "Numpy array containing the gain channel chosen for each pixel. " + "Note: should be replaced by using ``pixel_status`` " "Shape: (n_pixels)" ), ) @@ -532,9 +631,15 @@ class R1Container(Container): class DL0CameraContainer(Container): """ - Storage of data volume reduced dl0 data from a single telescope + Storage of data volume reduced dl0 data from a single telescope. + + See DL0 Data Model specification: + https://redmine.cta-observatory.org/dmsf/files/17552/view """ + event_type = Field(EventType.UNKNOWN, "type of event", type=EventType) + event_time = Field(NAN_TIME, "event timestamp") + waveform = Field( None, ( @@ -545,10 +650,29 @@ class DL0CameraContainer(Container): ), ) + pixel_status = Field( + None, + "Array of pixel status values, see PixelStatus for definition of the values", + dtype=np.uint8, + ndim=1, + ) + + first_cell_id = Field( + None, + "Array of first cell ids of the readout chips. Only used by LST and SST.", + dtype=np.uint32, + ) + + calibration_monitoring_id = Field( + None, + "ID of the CalibrationMonitoringSet containing the applied pre-calibration parameters", + ) + selected_gain_channel = Field( None, ( "Numpy array containing the gain channel chosen for each pixel. " + "Note: this should be replaced by only using ``pixel_status`` " "Shape: (n_pixels)" ), ) diff --git a/ctapipe/tests/test_datamodel.py b/ctapipe/tests/test_datamodel.py new file mode 100644 index 00000000000..7a22ae88ac8 --- /dev/null +++ b/ctapipe/tests/test_datamodel.py @@ -0,0 +1,16 @@ +import numpy as np +from numpy.testing import assert_equal + + +def test_pixel_status(): + from ctapipe.containers import PixelStatus + + pixel_status = np.array([0b1101, 0b1000, 0b1110, 0b1101, 0b0000], dtype=np.uint8) + + assert_equal( + PixelStatus.is_invalid(pixel_status), [False, False, False, False, True] + ) + assert_equal(PixelStatus.get_dvr_status(pixel_status), [1, 0, 2, 1, 0]) + assert_equal( + PixelStatus.get_channel_info(pixel_status), [0b11, 0b10, 0b11, 0b11, 0b00] + ) From 9191535aff3c9938f8ed27b117144970e4e95f92 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 31 May 2023 16:14:38 +0200 Subject: [PATCH 060/264] Set pixel_status in SimTelEventSource --- ctapipe/io/simteleventsource.py | 37 +++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/ctapipe/io/simteleventsource.py b/ctapipe/io/simteleventsource.py index 235f8edd737..d6d62962001 100644 --- a/ctapipe/io/simteleventsource.py +++ b/ctapipe/io/simteleventsource.py @@ -20,7 +20,7 @@ FiveLayerAtmosphereDensityProfile, TableAtmosphereDensityProfile, ) -from ..calib.camera.gainselection import GainSelector +from ..calib.camera.gainselection import GainChannel, GainSelector from ..containers import ( ArrayEventContainer, CoordinateFrameType, @@ -29,6 +29,7 @@ ObservationBlockContainer, ObservationBlockState, ObservingMode, + PixelStatus, PixelStatusContainer, PointingContainer, PointingMode, @@ -274,17 +275,20 @@ def apply_simtel_r1_calibration( The gain channel selected for each pixel Shape: (n_pixels) """ - n_channels, n_pixels, n_samples = r0_waveforms.shape + n_channels, n_pixels, _ = r0_waveforms.shape ped = pedestal[..., np.newaxis] DC_to_PHE = dc_to_pe[..., np.newaxis] gain = DC_to_PHE * calib_scale + r1_waveforms = (r0_waveforms - ped) * gain + calib_shift + if n_channels == 1: selected_gain_channel = np.zeros(n_pixels, dtype=np.int8) r1_waveforms = r1_waveforms[0] else: selected_gain_channel = gain_selector(r0_waveforms) r1_waveforms = r1_waveforms[selected_gain_channel, np.arange(n_pixels)] + return r1_waveforms, selected_gain_channel @@ -809,7 +813,7 @@ def _generate_events(self): mon = data.mon.tel[tel_id] mon.calibration.dc_to_pe = dc_to_pe mon.calibration.pedestal_per_sample = pedestal - mon.pixel_status = self._get_pixels_status(tel_id) + mon.pixel_status = self._fill_mon_pixels_status(tel_id) r1_waveform, selected_gain_channel = apply_simtel_r1_calibration( adc_samples, @@ -819,9 +823,15 @@ def _generate_events(self): self.calib_scale, self.calib_shift, ) + + pixel_status = self._get_r1_pixel_status( + tel_id=tel_id, + selected_gain_channel=selected_gain_channel, + ) data.r1.tel[tel_id] = R1CameraContainer( waveform=r1_waveform, selected_gain_channel=selected_gain_channel, + pixel_status=pixel_status, ) # get time_shift from laser calibration @@ -833,7 +843,26 @@ def _generate_events(self): yield data - def _get_pixels_status(self, tel_id): + def _get_r1_pixel_status(self, tel_id, selected_gain_channel): + tel_desc = self.file_.telescope_descriptions[tel_id] + n_pixels = tel_desc["camera_organization"]["n_pixels"] + pixel_status = np.zeros(n_pixels, dtype=np.uint8) + + high_gain_stored = selected_gain_channel == GainChannel.HIGH + low_gain_stored = selected_gain_channel == GainChannel.LOW + + # set gain bits + pixel_status[high_gain_stored] |= PixelStatus.HIGH_GAIN_STORED + pixel_status[low_gain_stored] |= PixelStatus.LOW_GAIN_STORED + + # reset gain bits for completely disabled pixels + disabled = tel_desc["disabled_pixels"]["HV_disabled"] + channel_bits = PixelStatus.HIGH_GAIN_STORED | PixelStatus.LOW_GAIN_STORED + pixel_status[disabled] &= ~np.uint8(channel_bits) + + return pixel_status + + def _fill_mon_pixels_status(self, tel_id): tel = self.file_.telescope_descriptions[tel_id] n_pixels = tel["camera_organization"]["n_pixels"] n_gains = tel["camera_organization"]["n_gains"] From b9814a833e1f74c701a321bb60e39afa9fc98e00 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 31 May 2023 16:18:22 +0200 Subject: [PATCH 061/264] Update pixel_status in r1 to dl0 step in CameraCalibrator, fill new fields --- ctapipe/calib/camera/calibrator.py | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/ctapipe/calib/camera/calibrator.py b/ctapipe/calib/camera/calibrator.py index 373301ce82b..0e29f7f228c 100644 --- a/ctapipe/calib/camera/calibrator.py +++ b/ctapipe/calib/camera/calibrator.py @@ -9,7 +9,7 @@ import numpy as np from numba import float32, float64, guvectorize, int64 -from ctapipe.containers import DL1CameraContainer +from ctapipe.containers import DL0CameraContainer, DL1CameraContainer, PixelStatus from ctapipe.core import TelescopeComponent from ctapipe.core.traits import ( BoolTelescopeParameter, @@ -178,19 +178,35 @@ def _check_dl0_empty(self, waveforms): return False def _calibrate_dl0(self, event, tel_id): - waveforms = event.r1.tel[tel_id].waveform - selected_gain_channel = event.r1.tel[tel_id].selected_gain_channel - if self._check_r1_empty(waveforms): + r1 = event.r1.tel[tel_id] + + if self._check_r1_empty(r1.waveform): return - reduced_waveforms_mask = self.data_volume_reducer( - waveforms, tel_id=tel_id, selected_gain_channel=selected_gain_channel + signal_pixels = self.data_volume_reducer( + r1.waveform, + tel_id=tel_id, + selected_gain_channel=r1.selected_gain_channel, ) - waveforms_copy = waveforms.copy() - waveforms_copy[~reduced_waveforms_mask] = 0 - event.dl0.tel[tel_id].waveform = waveforms_copy - event.dl0.tel[tel_id].selected_gain_channel = selected_gain_channel + dl0_waveform = r1.waveform.copy() + dl0_waveform[~signal_pixels] = 0 + + dl0_pixel_status = r1.pixel_status.copy() + # set dvr pixel bit in pixel_status for pixels kept by DVR + dl0_pixel_status[signal_pixels] |= PixelStatus.DVR_STORED_AS_SIGNAL + # unset dvr bits for removed pixels + dl0_pixel_status[~signal_pixels] &= ~np.uint8(PixelStatus.DVR_STATUS) + + event.dl0.tel[tel_id] = DL0CameraContainer( + event_type=r1.event_type, + event_time=r1.event_time, + waveform=dl0_waveform, + selected_gain_channel=r1.selected_gain_channel, + pixel_status=dl0_pixel_status, + first_cell_id=r1.first_cell_id, + calibration_monitoring_id=r1.calibration_monitoring_id, + ) def _calibrate_dl1(self, event, tel_id): waveforms = event.dl0.tel[tel_id].waveform From b2876ecb71f75281801fdfc281e6d7750949282e Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 1 Jun 2023 11:23:51 +0200 Subject: [PATCH 062/264] Fill event_type into R1 container in SimTelEventSource --- ctapipe/io/simteleventsource.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ctapipe/io/simteleventsource.py b/ctapipe/io/simteleventsource.py index d6d62962001..98cdc37e72c 100644 --- a/ctapipe/io/simteleventsource.py +++ b/ctapipe/io/simteleventsource.py @@ -829,6 +829,7 @@ def _generate_events(self): selected_gain_channel=selected_gain_channel, ) data.r1.tel[tel_id] = R1CameraContainer( + event_type=trigger.event_type, waveform=r1_waveform, selected_gain_channel=selected_gain_channel, pixel_status=pixel_status, From d269a529b628c1d77d3fd1218535c919563cbb40 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 31 May 2023 16:23:22 +0200 Subject: [PATCH 063/264] Add changelog entry --- docs/changes/2338.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2338.feature.rst diff --git a/docs/changes/2338.feature.rst b/docs/changes/2338.feature.rst new file mode 100644 index 00000000000..0d5faf7a5ea --- /dev/null +++ b/docs/changes/2338.feature.rst @@ -0,0 +1 @@ +Added missing fields defined in the CTAO R1 and DL0 data models to the corresponding containers. From ecb22238af7af31410c152a20b11628b6dd42c64 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 2 Jun 2023 13:34:30 +0200 Subject: [PATCH 064/264] Better docstrings --- ctapipe/containers.py | 2 +- ctapipe/tests/test_datamodel.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index f1ad4fb2ac0..bfa4d895470 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -593,7 +593,7 @@ class R1CameraContainer(Container): module_hires_local_clock_counter = Field( None, - "Counter values of the camera modules", + "Clock counter values of the camera modules. See R1 data model for details.", dtype=np.uint64, ) diff --git a/ctapipe/tests/test_datamodel.py b/ctapipe/tests/test_datamodel.py index 7a22ae88ac8..a93bdb4f787 100644 --- a/ctapipe/tests/test_datamodel.py +++ b/ctapipe/tests/test_datamodel.py @@ -1,8 +1,10 @@ +"""Tests for the data structures defined in ctapipe.containers""" import numpy as np from numpy.testing import assert_equal def test_pixel_status(): + """Test methods of the PixelStatus enum on numpy arrays""" from ctapipe.containers import PixelStatus pixel_status = np.array([0b1101, 0b1000, 0b1110, 0b1101, 0b0000], dtype=np.uint8) From e9caf1fb16c40395f718ac2498d4f3b3c85a1536 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 19 Jun 2023 12:41:44 +0200 Subject: [PATCH 065/264] Change dtype of first_cell_id to uint16, add ndim --- ctapipe/containers.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index bfa4d895470..cb4282c5d4c 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -588,19 +588,22 @@ class R1CameraContainer(Container): first_cell_id = Field( None, "Array of first cell ids of the readout chips. Only used by LST and SST.", - dtype=np.uint32, + dtype=np.uint16, + ndim=1, ) module_hires_local_clock_counter = Field( None, "Clock counter values of the camera modules. See R1 data model for details.", dtype=np.uint64, + ndim=1, ) pedestal_intensity = Field( None, "Pedestal intensity in each pixel in DC", dtype=np.float32, + ndim=1, ) calibration_monitoring_id = Field( @@ -660,7 +663,8 @@ class DL0CameraContainer(Container): first_cell_id = Field( None, "Array of first cell ids of the readout chips. Only used by LST and SST.", - dtype=np.uint32, + dtype=np.uint16, + ndim=1, ) calibration_monitoring_id = Field( From ee7764364221ff738bcac1c87623006ddf21ea1d Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 21 Jul 2023 11:43:21 +0200 Subject: [PATCH 066/264] Make docs build using python 3.11 --- docs/_static/ctapipe_logo.png | Bin 0 -> 129249 bytes docs/_static/ctapipe_logo.webp | Bin 0 -> 108648 bytes docs/_static/ctapipe_logo_dark.webp | Bin 0 -> 99660 bytes docs/conf.py | 14 ++++++++++++++ docs/getting_started/index.rst | 8 ++++---- 5 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 docs/_static/ctapipe_logo.png create mode 100644 docs/_static/ctapipe_logo.webp create mode 100644 docs/_static/ctapipe_logo_dark.webp diff --git a/docs/_static/ctapipe_logo.png b/docs/_static/ctapipe_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..50ddd056695f91965892d329bb0516c459cc1f0b GIT binary patch literal 129249 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 literal 0 HcmV?d00001 diff --git a/docs/_static/ctapipe_logo_dark.webp b/docs/_static/ctapipe_logo_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c210e55e18f25a57ce8c269f4f9161bb4f88a1b GIT binary patch literal 99660 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 hOYm9l3 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index d4f43125505..a5315d4a2e4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,6 +101,19 @@ def setup(app): # These links are ignored in the checks, necessary due to broken intersphinx for # these nitpick_ignore = [ + # needed for building the docs with python 3.11 locally. + # we use the lowest supported version on readthedocs, so that is what we use the intersphinx + # link above + ("py:class", "enum.StrEnum"), + # these are coming from traitlets: + ("py:class", "t.Union"), + ("py:class", "t.Any"), + ("py:class", "t.Dict"), + ("py:class", "t.Optional"), + ("py:class", "t.Type"), + ("py:class", "t.List"), + ("py:class", "t.Tuple"), + ("py:class", "Config"), ("py:class", "traitlets.config.configurable.Configurable"), ("py:class", "traitlets.traitlets.HasTraits"), ("py:class", "traitlets.traitlets.HasDescriptors"), @@ -126,6 +139,7 @@ def setup(app): ("py:class", "astropy.table.table.Table"), ("py:class", "eventio.simtel.simtelfile.SimTelFile"), ("py:class", "ctapipe.compat.StrEnum"), + ("py:class", "ctapipe.compat.StrEnum"), ] diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index c96cf0e6557..59e17983f46 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -387,9 +387,9 @@ even allow you to issue pull-requests. .. [#switch] ``git switch`` is a relatively new addition to git. If your version of git does not have it, update or use ``git checkout`` instead. The equivalent old command to ``git switch -c`` is ``git checkout -b``. .. [#push] As of git version 2.37, you can set these options so that ``git push`` will just work, -also for the first push: + also for the first push: -.. code-block:: console + .. code-block:: console - $ git config --global branch.autoSetupMerge simple - $ git config --global push.autoSetupRemote true + $ git config --global branch.autoSetupMerge simple + $ git config --global push.autoSetupRemote true From ba0e148c361033f3aa368b097c755fac3548b01f Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 21 Jul 2023 14:36:37 +0200 Subject: [PATCH 067/264] Shuffle some files around and rename some directories in the docs for better structure --- ctapipe/calib/__init__.py | 7 +- .../atmosphere/index.rst | 0 .../calib/camera.rst} | 7 +- .../calib/index.rst | 17 +-- .../containers/index.rst | 0 .../coordinates/index.rst | 2 +- .../coordinates/plot_camera_frames.py | 0 .../core/corediagram.dot | 0 .../core/index.rst | 0 .../core/tool-component.pdf | Bin .../core/tool-component.png | Bin .../core/traits.rst | 0 .../TwoPassWindowSum_1st_pass_example.png | Bin .../image/cleaning.rst | 0 .../image/dilate.png | Bin .../image/extractor.rst | 0 .../image/hillas.rst | 0 .../image/index.rst | 0 .../image/invalid_pixels.rst | 0 .../image/modifications.rst | 0 .../image/muon.rst | 0 .../image/pixel_likelihood.rst | 0 .../image/reducers.rst | 0 .../image/toymodel.rst | 0 docs/{ctapipe_api => api-reference}/index.rst | 0 .../instrument/camera.rst | 0 .../instrument/camera_geometry.rst | 2 +- .../instrument/camera_readout.rst | 0 .../instrument/camerageometry_example.py | 0 .../instrument/config.dot | 0 .../instrument/index.rst | 0 .../instrument/optics.rst | 0 .../instrument/subarray.rst | 0 .../instrument/telescope.rst | 0 .../io/index.rst | 0 .../io/shower.png | Bin .../reco/ImPACT.rst | 0 .../reco/images/ImageTemplates.png | Bin .../reco/images/goodness.png | Bin .../reco/images/likelihood.png | Bin .../reco/images/predictions.png | Bin .../reco/index.rst | 0 .../reco/sklearn.rst | 0 .../reco/stereo_combination.rst | 0 .../tools/index.rst | 0 .../utils/index.rst | 0 .../visualization/index.rst | 0 docs/cameras.png | Bin 242690 -> 0 bytes docs/conf.py | 4 +- docs/ctapipe_logo.png | Bin 129249 -> 0 bytes docs/ctapipe_logo.webp | Bin 108648 -> 0 bytes docs/ctapipe_logo_dark.webp | Bin 99660 -> 0 bytes .../ceps/accepted/.keep | 0 .../ceps/accepted/cep-001.rst | 0 .../ceps/drafts/.keep | 0 .../ceps/index.rst | 21 ++-- .../ceps/rejected/.keep | 0 .../code-guidelines.rst | 0 .../getting-started.rst} | 10 +- .../index.rst | 10 +- .../maintainer-info.rst | 39 ++----- .../pullrequests.rst | 0 .../py-pipe-dependencies.pdf | Bin .../py-pipe-dependencies.png | Bin .../rootmigration.rst | 0 .../style-guide.rst | 2 +- .../support-libraries.rst | 0 docs/event.png | Bin 365231 -> 0 bytes docs/index.rst | 106 ++++-------------- docs/{references.txt => references.rst} | 0 docs/{ => user-guide}/FAQ.rst | 0 docs/{ => user-guide}/data_models/dl1.rst | 0 docs/{ => user-guide}/data_models/index.rst | 0 .../examples/InstrumentDescription.ipynb | 0 docs/{ => user-guide}/examples/Tools.ipynb | 0 docs/{ => user-guide}/examples/Tools.json | 0 .../examples/array_display.ipynb | 0 .../examples/camera_display.ipynb | 0 .../examples/containers.ipynb | 0 .../examples/convert_images_to_2d.ipynb | 0 .../examples/dilate_image.ipynb | 0 docs/{ => user-guide}/examples/index.rst | 0 .../examples/nd_interpolation.ipynb | 0 .../examples/provenance.ipynb | 0 .../examples/table_writer_reader.ipynb | 0 .../getting-started.rst} | 0 docs/user-guide/index.rst | 14 +++ .../{tools/index.rst => user-guide/tools.rst} | 0 .../calibrated_data_exploration.ipynb | 0 .../tutorials/coordinates_example.ipynb | 0 .../tutorials/ctapipe_handson.ipynb | 40 ++++--- .../tutorials/ctapipe_overview.ipynb | 0 .../tutorials/ground_frame.png | Bin docs/{ => user-guide}/tutorials/index.rst | 0 .../tutorials/raw_data_exploration.ipynb | 62 +++++----- .../tutorials/theta_square.ipynb | 12 +- .../tutorials/tilted_ground_frame.png | Bin 97 files changed, 142 insertions(+), 213 deletions(-) rename docs/{ctapipe_api => api-reference}/atmosphere/index.rst (100%) rename docs/{ctapipe_api/calib/index_camera.rst => api-reference/calib/camera.rst} (77%) rename docs/{ctapipe_api => api-reference}/calib/index.rst (73%) rename docs/{ctapipe_api => api-reference}/containers/index.rst (100%) rename docs/{ctapipe_api => api-reference}/coordinates/index.rst (97%) rename docs/{ctapipe_api => api-reference}/coordinates/plot_camera_frames.py (100%) rename docs/{ctapipe_api => api-reference}/core/corediagram.dot (100%) rename docs/{ctapipe_api => api-reference}/core/index.rst (100%) rename docs/{ctapipe_api => api-reference}/core/tool-component.pdf (100%) rename docs/{ctapipe_api => api-reference}/core/tool-component.png (100%) rename docs/{ctapipe_api => api-reference}/core/traits.rst (100%) rename docs/{ctapipe_api => api-reference}/image/TwoPassWindowSum_1st_pass_example.png (100%) rename docs/{ctapipe_api => api-reference}/image/cleaning.rst (100%) rename docs/{ctapipe_api => api-reference}/image/dilate.png (100%) rename docs/{ctapipe_api => api-reference}/image/extractor.rst (100%) rename docs/{ctapipe_api => api-reference}/image/hillas.rst (100%) rename docs/{ctapipe_api => api-reference}/image/index.rst (100%) rename docs/{ctapipe_api => api-reference}/image/invalid_pixels.rst (100%) rename docs/{ctapipe_api => api-reference}/image/modifications.rst (100%) rename docs/{ctapipe_api => api-reference}/image/muon.rst (100%) rename docs/{ctapipe_api => api-reference}/image/pixel_likelihood.rst (100%) rename docs/{ctapipe_api => api-reference}/image/reducers.rst (100%) rename docs/{ctapipe_api => api-reference}/image/toymodel.rst (100%) rename docs/{ctapipe_api => api-reference}/index.rst (100%) rename docs/{ctapipe_api => api-reference}/instrument/camera.rst (100%) rename docs/{ctapipe_api => api-reference}/instrument/camera_geometry.rst (98%) rename docs/{ctapipe_api => api-reference}/instrument/camera_readout.rst (100%) rename docs/{ctapipe_api => api-reference}/instrument/camerageometry_example.py (100%) rename docs/{ctapipe_api => api-reference}/instrument/config.dot (100%) rename docs/{ctapipe_api => api-reference}/instrument/index.rst (100%) rename docs/{ctapipe_api => api-reference}/instrument/optics.rst (100%) rename docs/{ctapipe_api => api-reference}/instrument/subarray.rst (100%) rename docs/{ctapipe_api => api-reference}/instrument/telescope.rst (100%) rename docs/{ctapipe_api => api-reference}/io/index.rst (100%) rename docs/{ctapipe_api => api-reference}/io/shower.png (100%) rename docs/{ctapipe_api => api-reference}/reco/ImPACT.rst (100%) rename docs/{ctapipe_api => api-reference}/reco/images/ImageTemplates.png (100%) rename docs/{ctapipe_api => api-reference}/reco/images/goodness.png (100%) rename docs/{ctapipe_api => api-reference}/reco/images/likelihood.png (100%) rename docs/{ctapipe_api => api-reference}/reco/images/predictions.png (100%) rename docs/{ctapipe_api => api-reference}/reco/index.rst (100%) rename docs/{ctapipe_api => api-reference}/reco/sklearn.rst (100%) rename docs/{ctapipe_api => api-reference}/reco/stereo_combination.rst (100%) rename docs/{ctapipe_api => api-reference}/tools/index.rst (100%) rename docs/{ctapipe_api => api-reference}/utils/index.rst (100%) rename docs/{ctapipe_api => api-reference}/visualization/index.rst (100%) delete mode 100644 docs/cameras.png delete mode 100644 docs/ctapipe_logo.png delete mode 100644 docs/ctapipe_logo.webp delete mode 100644 docs/ctapipe_logo_dark.webp rename docs/{development => developer-guide}/ceps/accepted/.keep (100%) rename docs/{development => developer-guide}/ceps/accepted/cep-001.rst (100%) rename docs/{development => developer-guide}/ceps/drafts/.keep (100%) rename docs/{development => developer-guide}/ceps/index.rst (67%) rename docs/{development => developer-guide}/ceps/rejected/.keep (100%) rename docs/{development => developer-guide}/code-guidelines.rst (100%) rename docs/{getting_started/index.rst => developer-guide/getting-started.rst} (97%) rename docs/{development => developer-guide}/index.rst (62%) rename docs/{development => developer-guide}/maintainer-info.rst (64%) rename docs/{development => developer-guide}/pullrequests.rst (100%) rename docs/{development => developer-guide}/py-pipe-dependencies.pdf (100%) rename docs/{development => developer-guide}/py-pipe-dependencies.png (100%) rename docs/{development => developer-guide}/rootmigration.rst (100%) rename docs/{development => developer-guide}/style-guide.rst (96%) rename docs/{development => developer-guide}/support-libraries.rst (100%) delete mode 100644 docs/event.png rename docs/{references.txt => references.rst} (100%) rename docs/{ => user-guide}/FAQ.rst (100%) rename docs/{ => user-guide}/data_models/dl1.rst (100%) rename docs/{ => user-guide}/data_models/index.rst (100%) rename docs/{ => user-guide}/examples/InstrumentDescription.ipynb (100%) rename docs/{ => user-guide}/examples/Tools.ipynb (100%) rename docs/{ => user-guide}/examples/Tools.json (100%) rename docs/{ => user-guide}/examples/array_display.ipynb (100%) rename docs/{ => user-guide}/examples/camera_display.ipynb (100%) rename docs/{ => user-guide}/examples/containers.ipynb (100%) rename docs/{ => user-guide}/examples/convert_images_to_2d.ipynb (100%) rename docs/{ => user-guide}/examples/dilate_image.ipynb (100%) rename docs/{ => user-guide}/examples/index.rst (100%) rename docs/{ => user-guide}/examples/nd_interpolation.ipynb (100%) rename docs/{ => user-guide}/examples/provenance.ipynb (100%) rename docs/{ => user-guide}/examples/table_writer_reader.ipynb (100%) rename docs/{getting_started_users/index.rst => user-guide/getting-started.rst} (100%) create mode 100644 docs/user-guide/index.rst rename docs/{tools/index.rst => user-guide/tools.rst} (100%) rename docs/{ => user-guide}/tutorials/calibrated_data_exploration.ipynb (100%) rename docs/{ => user-guide}/tutorials/coordinates_example.ipynb (100%) rename docs/{ => user-guide}/tutorials/ctapipe_handson.ipynb (92%) rename docs/{ => user-guide}/tutorials/ctapipe_overview.ipynb (100%) rename docs/{ => user-guide}/tutorials/ground_frame.png (100%) rename docs/{ => user-guide}/tutorials/index.rst (100%) rename docs/{ => user-guide}/tutorials/raw_data_exploration.ipynb (87%) rename docs/{ => user-guide}/tutorials/theta_square.ipynb (92%) rename docs/{ => user-guide}/tutorials/tilted_ground_frame.png (100%) diff --git a/ctapipe/calib/__init__.py b/ctapipe/calib/__init__.py index e721e039e5f..3cb1362da9f 100644 --- a/ctapipe/calib/__init__.py +++ b/ctapipe/calib/__init__.py @@ -1,7 +1,10 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst """ -Calibration +Module for calibration code """ from .camera import CameraCalibrator, GainSelector -__all__ = ["CameraCalibrator", "GainSelector"] +__all__ = [ + "CameraCalibrator", + "GainSelector", +] diff --git a/docs/ctapipe_api/atmosphere/index.rst b/docs/api-reference/atmosphere/index.rst similarity index 100% rename from docs/ctapipe_api/atmosphere/index.rst rename to docs/api-reference/atmosphere/index.rst diff --git a/docs/ctapipe_api/calib/index_camera.rst b/docs/api-reference/calib/camera.rst similarity index 77% rename from docs/ctapipe_api/calib/index_camera.rst rename to docs/api-reference/calib/camera.rst index 0827c266218..2b0618e4cd1 100644 --- a/docs/ctapipe_api/calib/index_camera.rst +++ b/docs/api-reference/calib/camera.rst @@ -22,14 +22,13 @@ CameraCalibrator The primary class in this module is the `~ctapipe.calib.camera.calibrator.CameraCalibrator`. This class handles two data level transition stages for the event: -* R1 -> DL0 (:ref:`image_reducers`) -* DL0 -> DL1 (:ref:`image_charge_extractors`) +* R1 → DL0 (:ref:`image_reducers`) +* DL0 → DL1 (:ref:`image_charge_extractors`) The class takes a ctapipe event container, and fills the next data level containers with the calibrated information. -See the `CTA High-Level Data Model Definitions SYS-QA/160517 -`_ document (CTA internal) for information about the +See the `CTA Top-Level Data Model Definitions `_ document (CTA internal) for information about the different data levels. diff --git a/docs/ctapipe_api/calib/index.rst b/docs/api-reference/calib/index.rst similarity index 73% rename from docs/ctapipe_api/calib/index.rst rename to docs/api-reference/calib/index.rst index 398acfed120..949d8ef8a84 100644 --- a/docs/ctapipe_api/calib/index.rst +++ b/docs/api-reference/calib/index.rst @@ -13,24 +13,11 @@ Introduction This module include all the functions and classes needed for the Calibration of CTA data. -It consists in four main sub-modules: - -* :ref:`calib_camera` - -* Array Calibration - -* Atmosphere Calibration - -* Pointing Calibration +Currently, only code related to :ref:`calib_camera` is implemented here. For more information on where you should implement your code, please have a look to the README.rst files inside each directory. -Getting Started -=============== - -TODO: add examples. - Submodules ========== @@ -38,7 +25,7 @@ Submodules :maxdepth: 1 :glob: - index_* + camera diff --git a/docs/ctapipe_api/containers/index.rst b/docs/api-reference/containers/index.rst similarity index 100% rename from docs/ctapipe_api/containers/index.rst rename to docs/api-reference/containers/index.rst diff --git a/docs/ctapipe_api/coordinates/index.rst b/docs/api-reference/coordinates/index.rst similarity index 97% rename from docs/ctapipe_api/coordinates/index.rst rename to docs/api-reference/coordinates/index.rst index 094d833f125..1747b342fb5 100644 --- a/docs/ctapipe_api/coordinates/index.rst +++ b/docs/api-reference/coordinates/index.rst @@ -38,7 +38,7 @@ they can be transformed to and from any other `astropy.coordinates` frame, like The three different coordinate frames are shown here: -.. plot:: ctapipe_api/coordinates/plot_camera_frames.py +.. plot:: api-reference/coordinates/plot_camera_frames.py The `CameraFrame` is used internally in ``ctapipe`` and comes from ``sim_telarray``. diff --git a/docs/ctapipe_api/coordinates/plot_camera_frames.py b/docs/api-reference/coordinates/plot_camera_frames.py similarity index 100% rename from docs/ctapipe_api/coordinates/plot_camera_frames.py rename to docs/api-reference/coordinates/plot_camera_frames.py diff --git a/docs/ctapipe_api/core/corediagram.dot b/docs/api-reference/core/corediagram.dot similarity index 100% rename from docs/ctapipe_api/core/corediagram.dot rename to docs/api-reference/core/corediagram.dot diff --git a/docs/ctapipe_api/core/index.rst b/docs/api-reference/core/index.rst similarity index 100% rename from docs/ctapipe_api/core/index.rst rename to docs/api-reference/core/index.rst diff --git a/docs/ctapipe_api/core/tool-component.pdf b/docs/api-reference/core/tool-component.pdf similarity index 100% rename from docs/ctapipe_api/core/tool-component.pdf rename to docs/api-reference/core/tool-component.pdf diff --git a/docs/ctapipe_api/core/tool-component.png b/docs/api-reference/core/tool-component.png similarity index 100% rename from docs/ctapipe_api/core/tool-component.png rename to docs/api-reference/core/tool-component.png diff --git a/docs/ctapipe_api/core/traits.rst b/docs/api-reference/core/traits.rst similarity index 100% rename from docs/ctapipe_api/core/traits.rst rename to docs/api-reference/core/traits.rst diff --git a/docs/ctapipe_api/image/TwoPassWindowSum_1st_pass_example.png b/docs/api-reference/image/TwoPassWindowSum_1st_pass_example.png similarity index 100% rename from docs/ctapipe_api/image/TwoPassWindowSum_1st_pass_example.png rename to docs/api-reference/image/TwoPassWindowSum_1st_pass_example.png diff --git a/docs/ctapipe_api/image/cleaning.rst b/docs/api-reference/image/cleaning.rst similarity index 100% rename from docs/ctapipe_api/image/cleaning.rst rename to docs/api-reference/image/cleaning.rst diff --git a/docs/ctapipe_api/image/dilate.png b/docs/api-reference/image/dilate.png similarity index 100% rename from docs/ctapipe_api/image/dilate.png rename to docs/api-reference/image/dilate.png diff --git a/docs/ctapipe_api/image/extractor.rst b/docs/api-reference/image/extractor.rst similarity index 100% rename from docs/ctapipe_api/image/extractor.rst rename to docs/api-reference/image/extractor.rst diff --git a/docs/ctapipe_api/image/hillas.rst b/docs/api-reference/image/hillas.rst similarity index 100% rename from docs/ctapipe_api/image/hillas.rst rename to docs/api-reference/image/hillas.rst diff --git a/docs/ctapipe_api/image/index.rst b/docs/api-reference/image/index.rst similarity index 100% rename from docs/ctapipe_api/image/index.rst rename to docs/api-reference/image/index.rst diff --git a/docs/ctapipe_api/image/invalid_pixels.rst b/docs/api-reference/image/invalid_pixels.rst similarity index 100% rename from docs/ctapipe_api/image/invalid_pixels.rst rename to docs/api-reference/image/invalid_pixels.rst diff --git a/docs/ctapipe_api/image/modifications.rst b/docs/api-reference/image/modifications.rst similarity index 100% rename from docs/ctapipe_api/image/modifications.rst rename to docs/api-reference/image/modifications.rst diff --git a/docs/ctapipe_api/image/muon.rst b/docs/api-reference/image/muon.rst similarity index 100% rename from docs/ctapipe_api/image/muon.rst rename to docs/api-reference/image/muon.rst diff --git a/docs/ctapipe_api/image/pixel_likelihood.rst b/docs/api-reference/image/pixel_likelihood.rst similarity index 100% rename from docs/ctapipe_api/image/pixel_likelihood.rst rename to docs/api-reference/image/pixel_likelihood.rst diff --git a/docs/ctapipe_api/image/reducers.rst b/docs/api-reference/image/reducers.rst similarity index 100% rename from docs/ctapipe_api/image/reducers.rst rename to docs/api-reference/image/reducers.rst diff --git a/docs/ctapipe_api/image/toymodel.rst b/docs/api-reference/image/toymodel.rst similarity index 100% rename from docs/ctapipe_api/image/toymodel.rst rename to docs/api-reference/image/toymodel.rst diff --git a/docs/ctapipe_api/index.rst b/docs/api-reference/index.rst similarity index 100% rename from docs/ctapipe_api/index.rst rename to docs/api-reference/index.rst diff --git a/docs/ctapipe_api/instrument/camera.rst b/docs/api-reference/instrument/camera.rst similarity index 100% rename from docs/ctapipe_api/instrument/camera.rst rename to docs/api-reference/instrument/camera.rst diff --git a/docs/ctapipe_api/instrument/camera_geometry.rst b/docs/api-reference/instrument/camera_geometry.rst similarity index 98% rename from docs/ctapipe_api/instrument/camera_geometry.rst rename to docs/api-reference/instrument/camera_geometry.rst index ddf30ae6e8c..00a8bb5307b 100644 --- a/docs/ctapipe_api/instrument/camera_geometry.rst +++ b/docs/api-reference/instrument/camera_geometry.rst @@ -79,7 +79,7 @@ with `numpy` operations, since it is quite speed-efficient. Examples -------- -.. plot:: ctapipe_api/instrument/camerageometry_example.py +.. plot:: api-reference/instrument/camerageometry_example.py :include-source: diff --git a/docs/ctapipe_api/instrument/camera_readout.rst b/docs/api-reference/instrument/camera_readout.rst similarity index 100% rename from docs/ctapipe_api/instrument/camera_readout.rst rename to docs/api-reference/instrument/camera_readout.rst diff --git a/docs/ctapipe_api/instrument/camerageometry_example.py b/docs/api-reference/instrument/camerageometry_example.py similarity index 100% rename from docs/ctapipe_api/instrument/camerageometry_example.py rename to docs/api-reference/instrument/camerageometry_example.py diff --git a/docs/ctapipe_api/instrument/config.dot b/docs/api-reference/instrument/config.dot similarity index 100% rename from docs/ctapipe_api/instrument/config.dot rename to docs/api-reference/instrument/config.dot diff --git a/docs/ctapipe_api/instrument/index.rst b/docs/api-reference/instrument/index.rst similarity index 100% rename from docs/ctapipe_api/instrument/index.rst rename to docs/api-reference/instrument/index.rst diff --git a/docs/ctapipe_api/instrument/optics.rst b/docs/api-reference/instrument/optics.rst similarity index 100% rename from docs/ctapipe_api/instrument/optics.rst rename to docs/api-reference/instrument/optics.rst diff --git a/docs/ctapipe_api/instrument/subarray.rst b/docs/api-reference/instrument/subarray.rst similarity index 100% rename from docs/ctapipe_api/instrument/subarray.rst rename to docs/api-reference/instrument/subarray.rst diff --git a/docs/ctapipe_api/instrument/telescope.rst b/docs/api-reference/instrument/telescope.rst similarity index 100% rename from docs/ctapipe_api/instrument/telescope.rst rename to docs/api-reference/instrument/telescope.rst diff --git a/docs/ctapipe_api/io/index.rst b/docs/api-reference/io/index.rst similarity index 100% rename from docs/ctapipe_api/io/index.rst rename to docs/api-reference/io/index.rst diff --git a/docs/ctapipe_api/io/shower.png b/docs/api-reference/io/shower.png similarity index 100% rename from docs/ctapipe_api/io/shower.png rename to docs/api-reference/io/shower.png diff --git a/docs/ctapipe_api/reco/ImPACT.rst b/docs/api-reference/reco/ImPACT.rst similarity index 100% rename from docs/ctapipe_api/reco/ImPACT.rst rename to docs/api-reference/reco/ImPACT.rst diff --git a/docs/ctapipe_api/reco/images/ImageTemplates.png b/docs/api-reference/reco/images/ImageTemplates.png similarity index 100% rename from docs/ctapipe_api/reco/images/ImageTemplates.png rename to docs/api-reference/reco/images/ImageTemplates.png diff --git a/docs/ctapipe_api/reco/images/goodness.png b/docs/api-reference/reco/images/goodness.png similarity index 100% rename from docs/ctapipe_api/reco/images/goodness.png rename to docs/api-reference/reco/images/goodness.png diff --git a/docs/ctapipe_api/reco/images/likelihood.png b/docs/api-reference/reco/images/likelihood.png similarity index 100% rename from docs/ctapipe_api/reco/images/likelihood.png rename to docs/api-reference/reco/images/likelihood.png diff --git a/docs/ctapipe_api/reco/images/predictions.png b/docs/api-reference/reco/images/predictions.png similarity index 100% rename from docs/ctapipe_api/reco/images/predictions.png rename to docs/api-reference/reco/images/predictions.png diff --git a/docs/ctapipe_api/reco/index.rst b/docs/api-reference/reco/index.rst similarity index 100% rename from docs/ctapipe_api/reco/index.rst rename to docs/api-reference/reco/index.rst diff --git a/docs/ctapipe_api/reco/sklearn.rst b/docs/api-reference/reco/sklearn.rst similarity index 100% rename from docs/ctapipe_api/reco/sklearn.rst rename to docs/api-reference/reco/sklearn.rst diff --git a/docs/ctapipe_api/reco/stereo_combination.rst b/docs/api-reference/reco/stereo_combination.rst similarity index 100% rename from docs/ctapipe_api/reco/stereo_combination.rst rename to docs/api-reference/reco/stereo_combination.rst diff --git a/docs/ctapipe_api/tools/index.rst b/docs/api-reference/tools/index.rst similarity index 100% rename from docs/ctapipe_api/tools/index.rst rename to docs/api-reference/tools/index.rst diff --git a/docs/ctapipe_api/utils/index.rst b/docs/api-reference/utils/index.rst similarity index 100% rename from docs/ctapipe_api/utils/index.rst rename to docs/api-reference/utils/index.rst diff --git a/docs/ctapipe_api/visualization/index.rst b/docs/api-reference/visualization/index.rst similarity index 100% rename from docs/ctapipe_api/visualization/index.rst rename to docs/api-reference/visualization/index.rst diff --git a/docs/cameras.png b/docs/cameras.png deleted file mode 100644 index 94f2585d4a88c9a3d8c73a1fe2b31329f06f72dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242690 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

~O?XdboEI)hLpYZbxMPqph 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 n?{_AEw|r_&SZz;#mliQG3*mQCdzxz(Z0- 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 z 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 diff --git a/docs/ctapipe_logo_dark.webp b/docs/ctapipe_logo_dark.webp deleted file mode 100644 index 3c210e55e18f25a57ce8c269f4f9161bb4f88a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99660 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 hOYm9l3 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 diff --git a/docs/development/ceps/accepted/.keep b/docs/developer-guide/ceps/accepted/.keep similarity index 100% rename from docs/development/ceps/accepted/.keep rename to docs/developer-guide/ceps/accepted/.keep diff --git a/docs/development/ceps/accepted/cep-001.rst b/docs/developer-guide/ceps/accepted/cep-001.rst similarity index 100% rename from docs/development/ceps/accepted/cep-001.rst rename to docs/developer-guide/ceps/accepted/cep-001.rst diff --git a/docs/development/ceps/drafts/.keep b/docs/developer-guide/ceps/drafts/.keep similarity index 100% rename from docs/development/ceps/drafts/.keep rename to docs/developer-guide/ceps/drafts/.keep diff --git a/docs/development/ceps/index.rst b/docs/developer-guide/ceps/index.rst similarity index 67% rename from docs/development/ceps/index.rst rename to docs/developer-guide/ceps/index.rst index 502fc117764..c448e955f89 100644 --- a/docs/development/ceps/index.rst +++ b/docs/developer-guide/ceps/index.rst @@ -1,29 +1,29 @@ -**************************** -Ctapipe Enhancment Proposals -**************************** +***************************** +ctapipe Enhancement Proposals +***************************** -CEPs (Ctapipe Enhancment Proposals) are short documents proposing and describing +CEPs (ctapipe Enhancment Proposals) are short documents proposing and describing a major addition or change to ctapipe. See :ref:`cep-001` for further information. Below is a list of merged CEPs, i.e. the ones that are finalised, with status "accepted" or "rejected" or "withdrawn". The ones with "draft" status, i.e. that are under discussion, -can be found on Github as `pull requests with the "CEP" label`_ . +can be found on GitHub as `pull requests with the "CEP" label`_ . Accepted CEPs ============= .. toctree:: - :maxdepth: 1 + :maxdepth: 1 :glob: accepted/* Proposed CEPs ============= -.. +.. toctree:: - :maxdepth: 1 + :maxdepth: 1 :glob: proposed/* @@ -31,13 +31,12 @@ Proposed CEPs Rejected CEPs ============= -.. +.. toctree:: - :maxdepth: 1 + :maxdepth: 1 :glob: rejected/* .. _pull requests with the "cep" label: https://github.com/cta-observatory/ctapipe/issues?q=label%3ACEP - diff --git a/docs/development/ceps/rejected/.keep b/docs/developer-guide/ceps/rejected/.keep similarity index 100% rename from docs/development/ceps/rejected/.keep rename to docs/developer-guide/ceps/rejected/.keep diff --git a/docs/development/code-guidelines.rst b/docs/developer-guide/code-guidelines.rst similarity index 100% rename from docs/development/code-guidelines.rst rename to docs/developer-guide/code-guidelines.rst diff --git a/docs/getting_started/index.rst b/docs/developer-guide/getting-started.rst similarity index 97% rename from docs/getting_started/index.rst rename to docs/developer-guide/getting-started.rst index 59e17983f46..a2ed877bd8c 100644 --- a/docs/getting_started/index.rst +++ b/docs/developer-guide/getting-started.rst @@ -1,5 +1,5 @@ -.. _getting_started: +.. _getting_started_dev: ****************************** Getting Started For Developers @@ -9,10 +9,10 @@ We strongly recommend using the `mambaforge conda distribution `_:: diff --git a/docs/development/index.rst b/docs/developer-guide/index.rst similarity index 62% rename from docs/development/index.rst rename to docs/developer-guide/index.rst index e214e31ad00..dc1d1474c4f 100644 --- a/docs/development/index.rst +++ b/docs/developer-guide/index.rst @@ -1,14 +1,16 @@ -.. _guidelines: +.. _dev-guide: -Coding Guidelines -================= +Developer Guide +=============== .. toctree:: + :maxdepth: 2 + getting-started style-guide code-guidelines - support-libraries pullrequests + support-libraries maintainer-info ceps/index rootmigration diff --git a/docs/development/maintainer-info.rst b/docs/developer-guide/maintainer-info.rst similarity index 64% rename from docs/development/maintainer-info.rst rename to docs/developer-guide/maintainer-info.rst index c7b00f5ac1c..044e1892597 100644 --- a/docs/development/maintainer-info.rst +++ b/docs/developer-guide/maintainer-info.rst @@ -26,44 +26,19 @@ of numpy. E.g. for the astropy quantity interoperability, we required 1.17 earli How to update the online docs? ------------------------------ -The docs are automatically build by travis and uploaded to github pages. +The docs are automatically using readthedocs and deployed there. -To do it manually, follow these instructions: - -First install `ghp-import `__ - -.. code-block:: bash - - pip install ghp-import - -Then build the docs: - -.. code-block:: bash - - python setup.py build_docs --clean-docs - -If there's no warnings, you can publish the docs with this command - -.. code-block:: bash - - ghp-import -n -p -m 'Update gh-pages docs' docs/_build/html - -which is equivalent to this make target so that you don't have to remember it: - -.. code-block:: bash - - make doc-publish - -Only ctapipe maintainers can do this, because you need write permission to the main repo. How to make a release? ---------------------- -1. Open a new PR to generate a meaningfull changelog. Run ``towncrier`` in order to - do this: +1. Open a new pull request to prepare the release. + This should be the last pull request to be merged before making the actual release. + + Run ``towncrier`` in order to do this: -.. code-block:: bash + .. code-block:: bash - towncrier build --version= + towncrier build --version= 2. Create a new github release, a good starting point should already be made by the diff --git a/docs/development/pullrequests.rst b/docs/developer-guide/pullrequests.rst similarity index 100% rename from docs/development/pullrequests.rst rename to docs/developer-guide/pullrequests.rst diff --git a/docs/development/py-pipe-dependencies.pdf b/docs/developer-guide/py-pipe-dependencies.pdf similarity index 100% rename from docs/development/py-pipe-dependencies.pdf rename to docs/developer-guide/py-pipe-dependencies.pdf diff --git a/docs/development/py-pipe-dependencies.png b/docs/developer-guide/py-pipe-dependencies.png similarity index 100% rename from docs/development/py-pipe-dependencies.png rename to docs/developer-guide/py-pipe-dependencies.png diff --git a/docs/development/rootmigration.rst b/docs/developer-guide/rootmigration.rst similarity index 100% rename from docs/development/rootmigration.rst rename to docs/developer-guide/rootmigration.rst diff --git a/docs/development/style-guide.rst b/docs/developer-guide/style-guide.rst similarity index 96% rename from docs/development/style-guide.rst rename to docs/developer-guide/style-guide.rst index a8db3d5cabf..b442eafe6a4 100644 --- a/docs/development/style-guide.rst +++ b/docs/developer-guide/style-guide.rst @@ -8,7 +8,7 @@ Code follows the Python `PEP8 `_ style guide. This is enforced via the `black formatter `_ -and the pre-commit hook set up in :doc:`/getting_started/index`. +and the pre-commit hook set up in :ref:`getting_started_dev`. You can also use ``black \`` to reformat your code by hand or install editor plugins. diff --git a/docs/development/support-libraries.rst b/docs/developer-guide/support-libraries.rst similarity index 100% rename from docs/development/support-libraries.rst rename to docs/developer-guide/support-libraries.rst diff --git a/docs/event.png b/docs/event.png deleted file mode 100644 index 82bdbe1db240bbd1418830af4cd6480e5f9457b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365231 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 z 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

{key}bn|M9lYWUT)UnxA(>uPFgaPQCKia;wQ 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 z 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

vE3DGIzD3FbN1Y}FOxJe`8dNr2fY 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 W%HXY;)mKEmAFpSuTcCaV%D({m9^FI$ diff --git a/docs/index.rst b/docs/index.rst index 84dec76af64..dd18205f56c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,4 +1,4 @@ -.. include:: references.txt +.. include:: references.rst :html_theme.sidebar_secondary.remove: true :html_theme.sidebar_primary.remove: true @@ -13,30 +13,32 @@ Prototype CTA Pipeline Framework (``ctapipe``) | -.. image:: ctapipe_logo.webp +.. image:: _static/ctapipe_logo.webp :class: only-light :align: center :width: 90% :alt: The ctapipe logo. -.. image:: ctapipe_logo_dark.webp +.. image:: _static/ctapipe_logo_dark.webp :class: only-dark :align: center :width: 90% :alt: The ctapipe logo. -| -**Date**: |today| **Version**: |version| + +**Version**: |version| **Date**: |today| **Useful links**: `Source Repository `__ | `Issue Tracker `__ | `Discussions `__ -**License**: BSD-3 **Python**: |python_requires| +**License**: BSD-3 + +**Python**: |python_requires| + -| ``ctapipe`` is a framework for prototyping the low-level data processing algorithms for the Cherenkov Telescope Array. @@ -46,17 +48,11 @@ Prototype CTA Pipeline Framework (``ctapipe``) :maxdepth: 1 :hidden: - User Guide - Developer Guide - development/index - ctapipe_api/index - tutorials/index - examples/index - tools/index - FAQ - data_models/index - bibliography + user-guide/index + developer-guide/index + api-reference/index changelog + bibliography @@ -65,7 +61,7 @@ Prototype CTA Pipeline Framework (``ctapipe``) .. grid-item-card:: :octicon:`book;40px` - + User Guide ^^^^^^^^^^ @@ -74,7 +70,7 @@ Prototype CTA Pipeline Framework (``ctapipe``) +++ - .. button-ref:: getting_started_users/index + .. button-ref:: user-guide/index :expand: :color: primary :click-parent: @@ -85,7 +81,7 @@ Prototype CTA Pipeline Framework (``ctapipe``) .. grid-item-card:: :octicon:`person-add;40px` - + Developer Guide ^^^^^^^^^^^^^^^ @@ -95,90 +91,30 @@ Prototype CTA Pipeline Framework (``ctapipe``) +++ - .. button-ref:: getting_started/index + .. button-ref:: developer-guide/index :expand: :color: primary :click-parent: To the developer guide - - .. grid-item-card:: - - :octicon:`git-pull-request;40px` - - Coding Guidelines - ^^^^^^^^^^^^^^^^^ - - These guidelines explain the coding style and the workflow. The ctapipe - enhancement proposals (CEPs) can also be found here. - - +++ - - .. button-ref:: development/index - :expand: - :color: primary - :click-parent: - - To the development guidelines - .. grid-item-card:: - + :octicon:`code;40px` API Docs ^^^^^^^^ The API docs contain detailed descriptions of - of the various modules and functions included - in ctapipe. + of the various modules, classes and functions + included in ctapipe. +++ - .. button-ref:: ctapipe_api/index + .. button-ref:: api-reference/index :expand: :color: primary :click-parent: To API docs - - - .. grid-item-card:: - - :octicon:`mortar-board;40px` - - Tutorials - ^^^^^^^^^ - - A collection of tutorials aimed at new users - and developers to familiarize with ctapipe. - - +++ - - .. button-ref:: tutorials/index - :expand: - :color: primary - :click-parent: - - To the tutorials - - - .. grid-item-card:: - - :octicon:`light-bulb;40px` - - Examples - ^^^^^^^^ - - Some lower-level examples of features included in the ctapipe API. - - +++ - - .. button-ref:: examples/index - :expand: - :color: primary - :click-parent: - - To the examples - diff --git a/docs/references.txt b/docs/references.rst similarity index 100% rename from docs/references.txt rename to docs/references.rst diff --git a/docs/FAQ.rst b/docs/user-guide/FAQ.rst similarity index 100% rename from docs/FAQ.rst rename to docs/user-guide/FAQ.rst diff --git a/docs/data_models/dl1.rst b/docs/user-guide/data_models/dl1.rst similarity index 100% rename from docs/data_models/dl1.rst rename to docs/user-guide/data_models/dl1.rst diff --git a/docs/data_models/index.rst b/docs/user-guide/data_models/index.rst similarity index 100% rename from docs/data_models/index.rst rename to docs/user-guide/data_models/index.rst diff --git a/docs/examples/InstrumentDescription.ipynb b/docs/user-guide/examples/InstrumentDescription.ipynb similarity index 100% rename from docs/examples/InstrumentDescription.ipynb rename to docs/user-guide/examples/InstrumentDescription.ipynb diff --git a/docs/examples/Tools.ipynb b/docs/user-guide/examples/Tools.ipynb similarity index 100% rename from docs/examples/Tools.ipynb rename to docs/user-guide/examples/Tools.ipynb diff --git a/docs/examples/Tools.json b/docs/user-guide/examples/Tools.json similarity index 100% rename from docs/examples/Tools.json rename to docs/user-guide/examples/Tools.json diff --git a/docs/examples/array_display.ipynb b/docs/user-guide/examples/array_display.ipynb similarity index 100% rename from docs/examples/array_display.ipynb rename to docs/user-guide/examples/array_display.ipynb diff --git a/docs/examples/camera_display.ipynb b/docs/user-guide/examples/camera_display.ipynb similarity index 100% rename from docs/examples/camera_display.ipynb rename to docs/user-guide/examples/camera_display.ipynb diff --git a/docs/examples/containers.ipynb b/docs/user-guide/examples/containers.ipynb similarity index 100% rename from docs/examples/containers.ipynb rename to docs/user-guide/examples/containers.ipynb diff --git a/docs/examples/convert_images_to_2d.ipynb b/docs/user-guide/examples/convert_images_to_2d.ipynb similarity index 100% rename from docs/examples/convert_images_to_2d.ipynb rename to docs/user-guide/examples/convert_images_to_2d.ipynb diff --git a/docs/examples/dilate_image.ipynb b/docs/user-guide/examples/dilate_image.ipynb similarity index 100% rename from docs/examples/dilate_image.ipynb rename to docs/user-guide/examples/dilate_image.ipynb diff --git a/docs/examples/index.rst b/docs/user-guide/examples/index.rst similarity index 100% rename from docs/examples/index.rst rename to docs/user-guide/examples/index.rst diff --git a/docs/examples/nd_interpolation.ipynb b/docs/user-guide/examples/nd_interpolation.ipynb similarity index 100% rename from docs/examples/nd_interpolation.ipynb rename to docs/user-guide/examples/nd_interpolation.ipynb diff --git a/docs/examples/provenance.ipynb b/docs/user-guide/examples/provenance.ipynb similarity index 100% rename from docs/examples/provenance.ipynb rename to docs/user-guide/examples/provenance.ipynb diff --git a/docs/examples/table_writer_reader.ipynb b/docs/user-guide/examples/table_writer_reader.ipynb similarity index 100% rename from docs/examples/table_writer_reader.ipynb rename to docs/user-guide/examples/table_writer_reader.ipynb diff --git a/docs/getting_started_users/index.rst b/docs/user-guide/getting-started.rst similarity index 100% rename from docs/getting_started_users/index.rst rename to docs/user-guide/getting-started.rst diff --git a/docs/user-guide/index.rst b/docs/user-guide/index.rst new file mode 100644 index 00000000000..853408d8363 --- /dev/null +++ b/docs/user-guide/index.rst @@ -0,0 +1,14 @@ +.. _user-guide: + +User Guide +========== + +.. toctree:: + :maxdepth: 2 + + getting-started + tools + data_models/index + tutorials/index + examples/index + FAQ diff --git a/docs/tools/index.rst b/docs/user-guide/tools.rst similarity index 100% rename from docs/tools/index.rst rename to docs/user-guide/tools.rst diff --git a/docs/tutorials/calibrated_data_exploration.ipynb b/docs/user-guide/tutorials/calibrated_data_exploration.ipynb similarity index 100% rename from docs/tutorials/calibrated_data_exploration.ipynb rename to docs/user-guide/tutorials/calibrated_data_exploration.ipynb diff --git a/docs/tutorials/coordinates_example.ipynb b/docs/user-guide/tutorials/coordinates_example.ipynb similarity index 100% rename from docs/tutorials/coordinates_example.ipynb rename to docs/user-guide/tutorials/coordinates_example.ipynb diff --git a/docs/tutorials/ctapipe_handson.ipynb b/docs/user-guide/tutorials/ctapipe_handson.ipynb similarity index 92% rename from docs/tutorials/ctapipe_handson.ipynb rename to docs/user-guide/tutorials/ctapipe_handson.ipynb index 68115dfd9f5..f3c27873309 100644 --- a/docs/tutorials/ctapipe_handson.ipynb +++ b/docs/user-guide/tutorials/ctapipe_handson.ipynb @@ -26,6 +26,7 @@ "from ctapipe import utils\n", "from matplotlib import pyplot as plt\n", "import numpy as np\n", + "\n", "%matplotlib inline" ] }, @@ -146,8 +147,8 @@ "metadata": {}, "outputs": [], "source": [ - "plt.plot(r0tel.waveform[0,brightest_pixel], label=\"channel 0 (high-gain)\")\n", - "plt.plot(r0tel.waveform[1,brightest_pixel], label=\"channel 1 (low-gain)\")\n", + "plt.plot(r0tel.waveform[0, brightest_pixel], label=\"channel 0 (high-gain)\")\n", + "plt.plot(r0tel.waveform[1, brightest_pixel], label=\"channel 1 (low-gain)\")\n", "plt.legend()" ] }, @@ -159,6 +160,7 @@ "source": [ "from ipywidgets import interact\n", "\n", + "\n", "@interact\n", "def view_waveform(chan=0, pix_id=brightest_pixel):\n", " plt.plot(r0tel.waveform[chan, pix_id])" @@ -187,7 +189,7 @@ "metadata": {}, "outputs": [], "source": [ - "subarray = source.subarray " + "subarray = source.subarray" ] }, { @@ -325,7 +327,9 @@ "outputs": [], "source": [ "disp = CameraDisplay(tel.camera.geometry)\n", - "disp.image = r0tel.waveform[0,:,10] # display channel 0, sample 0 (try others like 10)" + "disp.image = r0tel.waveform[\n", + " 0, :, 10\n", + "] # display channel 0, sample 0 (try others like 10)" ] }, { @@ -367,7 +371,7 @@ "outputs": [], "source": [ "for event in EventSource(path, max_events=5):\n", - " calib(event) # fills in r1, dl0, and dl1\n", + " calib(event) # fills in r1, dl0, and dl1\n", " print(event.dl1.tel.keys())" ] }, @@ -395,7 +399,7 @@ "metadata": {}, "outputs": [], "source": [ - "dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855" + "dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855" ] }, { @@ -468,7 +472,7 @@ "outputs": [], "source": [ "cleaned = image.copy()\n", - "cleaned[~mask] = 0 " + "cleaned[~mask] = 0" ] }, { @@ -505,7 +509,7 @@ "disp.add_colorbar()\n", "plt.xlim(0.5, 1.0)\n", "plt.ylim(-1.0, 0.0)\n", - "disp.overlay_moments(params, color='white', lw=2)" + "disp.overlay_moments(params, color=\"white\", lw=2)" ] }, { @@ -557,8 +561,8 @@ "metadata": {}, "outputs": [], "source": [ - "data = utils.get_dataset_path(\"gamma_prod5.simtel.zst\") \n", - "source = EventSource(data) # remove the max_events limit to get more stats" + "data = utils.get_dataset_path(\"gamma_prod5.simtel.zst\")\n", + "source = EventSource(data) # remove the max_events limit to get more stats" ] }, { @@ -569,7 +573,7 @@ "source": [ "for event in source:\n", " calib(event)\n", - " \n", + "\n", " for tel_id, tel_data in event.dl1.tel.items():\n", " tel = source.subarray.tel[tel_id]\n", " mask = tailcuts_clean(tel.camera.geometry, tel_data.image)\n", @@ -583,7 +587,7 @@ "metadata": {}, "outputs": [], "source": [ - "from ctapipe.io import HDF5TableWriter\n" + "from ctapipe.io import HDF5TableWriter" ] }, { @@ -592,12 +596,12 @@ "metadata": {}, "outputs": [], "source": [ - "with HDF5TableWriter(filename='hillas.h5', group_name='dl1', overwrite=True) as writer:\n", - " \n", - " source = EventSource(data, allowed_tels=[1,2,3,4], max_events=10)\n", + "with HDF5TableWriter(filename=\"hillas.h5\", group_name=\"dl1\", overwrite=True) as writer:\n", + "\n", + " source = EventSource(data, allowed_tels=[1, 2, 3, 4], max_events=10)\n", " for event in source:\n", " calib(event)\n", - " \n", + "\n", " for tel_id, tel_data in event.dl1.tel.items():\n", " tel = source.subarray.tel[tel_id]\n", " mask = tailcuts_clean(tel.camera.geometry, tel_data.image)\n", @@ -629,7 +633,7 @@ "source": [ "import pandas as pd\n", "\n", - "hillas = pd.read_hdf(\"hillas.h5\", key='/dl1/hillas')\n", + "hillas = pd.read_hdf(\"hillas.h5\", key=\"/dl1/hillas\")\n", "hillas" ] }, @@ -639,7 +643,7 @@ "metadata": {}, "outputs": [], "source": [ - "_ = hillas.hist(figsize=(8,8))" + "_ = hillas.hist(figsize=(8, 8))" ] }, { diff --git a/docs/tutorials/ctapipe_overview.ipynb b/docs/user-guide/tutorials/ctapipe_overview.ipynb similarity index 100% rename from docs/tutorials/ctapipe_overview.ipynb rename to docs/user-guide/tutorials/ctapipe_overview.ipynb diff --git a/docs/tutorials/ground_frame.png b/docs/user-guide/tutorials/ground_frame.png similarity index 100% rename from docs/tutorials/ground_frame.png rename to docs/user-guide/tutorials/ground_frame.png diff --git a/docs/tutorials/index.rst b/docs/user-guide/tutorials/index.rst similarity index 100% rename from docs/tutorials/index.rst rename to docs/user-guide/tutorials/index.rst diff --git a/docs/tutorials/raw_data_exploration.ipynb b/docs/user-guide/tutorials/raw_data_exploration.ipynb similarity index 87% rename from docs/tutorials/raw_data_exploration.ipynb rename to docs/user-guide/tutorials/raw_data_exploration.ipynb index 4a5595c4b28..1f2a23c978b 100644 --- a/docs/tutorials/raw_data_exploration.ipynb +++ b/docs/user-guide/tutorials/raw_data_exploration.ipynb @@ -170,7 +170,7 @@ "metadata": {}, "outputs": [], "source": [ - "event.simulation.shower.energy.to('GeV')" + "event.simulation.shower.energy.to(\"GeV\")" ] }, { @@ -179,7 +179,7 @@ "metadata": {}, "outputs": [], "source": [ - "event.simulation.shower.energy.to('J')" + "event.simulation.shower.energy.to(\"J\")" ] }, { @@ -237,10 +237,10 @@ "source": [ "plt.pcolormesh(teldata.waveform[0])\n", "plt.colorbar()\n", - "plt.ylim(700,750)\n", + "plt.ylim(700, 750)\n", "plt.xlabel(\"sample number\")\n", "plt.ylabel(\"pixel_id\")\n", - "print(\"waveform[0] is an array of shape (N_pix,N_slice) =\",teldata.waveform[0].shape)" + "print(\"waveform[0] is an array of shape (N_pix,N_slice) =\", teldata.waveform[0].shape)" ] }, { @@ -258,8 +258,8 @@ "metadata": {}, "outputs": [], "source": [ - "trace = teldata.waveform[0][719] \n", - "plt.plot(trace, drawstyle='steps')" + "trace = teldata.waveform[0][719]\n", + "plt.plot(trace, drawstyle=\"steps\")" ] }, { @@ -277,8 +277,10 @@ "metadata": {}, "outputs": [], "source": [ - "for pix_id in range(718,723):\n", - " plt.plot(teldata.waveform[0][pix_id], label=\"pix {}\".format(pix_id), drawstyle='steps')\n", + "for pix_id in range(718, 723):\n", + " plt.plot(\n", + " teldata.waveform[0][pix_id], label=\"pix {}\".format(pix_id), drawstyle=\"steps\"\n", + " )\n", "plt.legend()" ] }, @@ -300,10 +302,10 @@ "metadata": {}, "outputs": [], "source": [ - "for pix_id in range(718,723):\n", - " plt.plot(teldata.waveform[0][pix_id],'+-')\n", - "plt.fill_betweenx([0,1600],19,24,color='red',alpha=0.3, label='Ped window')\n", - "plt.fill_betweenx([0,1600],5,9,color='green',alpha=0.3, label='Signal window')\n", + "for pix_id in range(718, 723):\n", + " plt.plot(teldata.waveform[0][pix_id], \"+-\")\n", + "plt.fill_betweenx([0, 1600], 19, 24, color=\"red\", alpha=0.3, label=\"Ped window\")\n", + "plt.fill_betweenx([0, 1600], 5, 9, color=\"green\", alpha=0.3, label=\"Signal window\")\n", "plt.legend()" ] }, @@ -323,7 +325,7 @@ "source": [ "data = teldata.waveform[0]\n", "peds = data[:, 19:24].mean(axis=1) # mean of samples 20 to 29 for all pixels\n", - "sums = data[:, 5:9].sum(axis=1)/(13-8) # simple sum integration" + "sums = data[:, 5:9].sum(axis=1) / (13 - 8) # simple sum integration" ] }, { @@ -332,7 +334,7 @@ "metadata": {}, "outputs": [], "source": [ - "phist = plt.hist(peds, bins=50, range=[0,150])\n", + "phist = plt.hist(peds, bins=50, range=[0, 150])\n", "plt.title(\"Pedestal Distribution of all pixels for a single event\")" ] }, @@ -368,8 +370,8 @@ "outputs": [], "source": [ "# we can also subtract the pedestals from the traces themselves, which would be needed to compare peaks properly\n", - "for ii in range(270,280):\n", - " plt.plot(data[ii] - peds[ii], drawstyle='steps', label=\"pix{}\".format(ii))\n", + "for ii in range(270, 280):\n", + " plt.plot(data[ii] - peds[ii], drawstyle=\"steps\", label=\"pix{}\".format(ii))\n", "plt.legend()" ] }, @@ -399,9 +401,9 @@ "metadata": {}, "outputs": [], "source": [ - "title=\"CT24, run {} event {} ped-sub\".format(event.index.obs_id,event.index.event_id)\n", - "disp = CameraDisplay(camgeom,title=title)\n", - "disp.image = sums - peds \n", + "title = \"CT24, run {} event {} ped-sub\".format(event.index.obs_id, event.index.event_id)\n", + "disp = CameraDisplay(camgeom, title=title)\n", + "disp.image = sums - peds\n", "disp.cmap = plt.cm.RdBu_r\n", "disp.add_colorbar()\n", "disp.set_limits_percent(95) # autoscale" @@ -429,8 +431,10 @@ "for tel in event.r0.tel.keys():\n", " plt.figure()\n", " camgeom = source.subarray.tel[tel].camera.geometry\n", - " title=\"CT{}, run {} event {}\".format(tel,event.index.obs_id,event.index.event_id)\n", - " disp = CameraDisplay(camgeom,title=title)\n", + " title = \"CT{}, run {} event {}\".format(\n", + " tel, event.index.obs_id, event.index.event_id\n", + " )\n", + " disp = CameraDisplay(camgeom, title=title)\n", " disp.image = event.r0.tel[tel].waveform[0].sum(axis=1)\n", " disp.cmap = plt.cm.RdBu_r\n", " disp.add_colorbar()\n", @@ -466,13 +470,17 @@ "pix_ids = np.arange(len(data))\n", "has_signal = sums > 300\n", "\n", - "widths = np.array([8,]) # peak widths to search for (let's fix it at 8 samples, about the width of the peak)\n", - "peaks = [signal.find_peaks_cwt(trace,widths) for trace in data[has_signal] ]\n", + "widths = np.array(\n", + " [\n", + " 8,\n", + " ]\n", + ") # peak widths to search for (let's fix it at 8 samples, about the width of the peak)\n", + "peaks = [signal.find_peaks_cwt(trace, widths) for trace in data[has_signal]]\n", "\n", - "for p,s in zip(pix_ids[has_signal],peaks):\n", - " print(\"pix{} has peaks at sample {}\".format(p,s))\n", - " plt.plot(data[p], drawstyle='steps-mid')\n", - " plt.scatter(np.array(s),data[p,s])" + "for p, s in zip(pix_ids[has_signal], peaks):\n", + " print(\"pix{} has peaks at sample {}\".format(p, s))\n", + " plt.plot(data[p], drawstyle=\"steps-mid\")\n", + " plt.scatter(np.array(s), data[p, s])" ] }, { diff --git a/docs/tutorials/theta_square.ipynb b/docs/user-guide/tutorials/theta_square.ipynb similarity index 92% rename from docs/tutorials/theta_square.ipynb rename to docs/user-guide/tutorials/theta_square.ipynb index 91191ae275a..6e2c7652f33 100644 --- a/docs/tutorials/theta_square.ipynb +++ b/docs/user-guide/tutorials/theta_square.ipynb @@ -75,7 +75,7 @@ "source": [ "source = EventSource(\n", " \"dataset://gamma_prod5.simtel.zst\",\n", - "# allowed_tels={1, 2, 3, 4},\n", + " # allowed_tels={1, 2, 3, 4},\n", ")\n", "\n", "subarray = source.subarray\n", @@ -105,12 +105,14 @@ " image_processor(event)\n", " shower_processor(event)\n", "\n", - " reco_result = event.dl2.stereo.geometry['HillasReconstructor']\n", + " reco_result = event.dl2.stereo.geometry[\"HillasReconstructor\"]\n", "\n", " # get angular offset between reconstructed shower direction and MC\n", " # generated shower direction\n", " true_shower = event.simulation.shower\n", - " off_angle = angular_separation(true_shower.az, true_shower.alt, reco_result.az, reco_result.alt)\n", + " off_angle = angular_separation(\n", + " true_shower.az, true_shower.alt, reco_result.az, reco_result.alt\n", + " )\n", "\n", " # Appending all estimated off angles\n", " off_angles.append(off_angle.to(u.deg).value)" @@ -140,7 +142,7 @@ "outputs": [], "source": [ "off_angles = np.array(off_angles)\n", - "thetasquare = off_angles[np.isfinite(off_angles)]**2" + "thetasquare = off_angles[np.isfinite(off_angles)] ** 2" ] }, { @@ -167,7 +169,7 @@ "outputs": [], "source": [ "plt.hist(thetasquare, bins=10, range=[0, 0.4])\n", - "plt.xlabel(r'$\\theta^2$ (deg)')\n", + "plt.xlabel(r\"$\\theta^2$ (deg)\")\n", "plt.ylabel(\"# of events\")\n", "plt.show()" ] diff --git a/docs/tutorials/tilted_ground_frame.png b/docs/user-guide/tutorials/tilted_ground_frame.png similarity index 100% rename from docs/tutorials/tilted_ground_frame.png rename to docs/user-guide/tutorials/tilted_ground_frame.png From 25743507eb6f138f763f0a963db36a0845dd4edc Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 21 Jul 2023 15:09:37 +0200 Subject: [PATCH 068/264] Add version switcher step to release process --- docs/developer-guide/maintainer-info.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/developer-guide/maintainer-info.rst b/docs/developer-guide/maintainer-info.rst index 044e1892597..12fdd1f0e8b 100644 --- a/docs/developer-guide/maintainer-info.rst +++ b/docs/developer-guide/maintainer-info.rst @@ -34,17 +34,21 @@ How to make a release? 1. Open a new pull request to prepare the release. This should be the last pull request to be merged before making the actual release. - Run ``towncrier`` in order to do this: + Run ``towncrier`` in to render the changelog: - .. code-block:: bash + .. code-block:: console - towncrier build --version= + $ git fetch + $ git switch -c prepare_ origin/main + $ towncrier build --version= + Add the planned new version to the ``docs/_static/switcher.json`` file, so it will be + available from the version dropdown once the documentation is built. 2. Create a new github release, a good starting point should already be made by the release drafter plugin. -3. The PyPI upload will be done automatically by travis +3. The PyPI upload will be done automatically by Github Actions 4. conda packages are built by conda-forge, the recipe is maintained here: https://github.com/conda-forge/ctapipe-feedstock/ - An pull request to update the recipe should be opened automatically by a conda-forge bot when a new version is published to PyPi. + A pull request to update the recipe should be opened automatically by a conda-forge bot when a new version is published to PyPi. This can take a couple of hours. From deed6aec14793634e634863ca9b6e0992d6c5b07 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 21 Jul 2023 17:10:02 +0200 Subject: [PATCH 069/264] Update developer docs --- docs/conf.py | 2 +- docs/developer-guide/getting-started.rst | 326 ++++++++++++++--------- docs/developer-guide/maintainer-info.rst | 23 +- docs/developer-guide/pullrequests.rst | 49 ++-- docs/user-guide/getting-started.rst | 53 ++-- 5 files changed, 258 insertions(+), 195 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 3734405ced6..6a4a5ee4859 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -219,7 +219,7 @@ def setup(app): version_match = "latest" # We want to keep the relative reference if we are in dev mode # but we want the whole url if we are effectively in a released version - json_url = "_static/switcher.json" + json_url = "/_static/switcher.json" else: version_match = release diff --git a/docs/developer-guide/getting-started.rst b/docs/developer-guide/getting-started.rst index a2ed877bd8c..1ebacb3af1a 100644 --- a/docs/developer-guide/getting-started.rst +++ b/docs/developer-guide/getting-started.rst @@ -1,9 +1,8 @@ .. _getting_started_dev: -****************************** Getting Started For Developers -****************************** +============================== We strongly recommend using the `mambaforge conda distribution `_. @@ -15,10 +14,6 @@ We strongly recommend using the `mambaforge conda distribution `_ the main ctapipe -repository (cta-observatory/ctapipe). - -First, it's useful to make a directory where you have can check out -cta GIT repos (this is optinal - you can put it anywhere) - -.. code-block:: console - - $ mkdir ctasoft - $ cd ctasoft - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Step 1: Fork the Master CTA-Observatory ctapipe repository -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Follow the instructions in the link above to make a *fork* of the -ctapipe repo in your own GitHub userspace. That fork will be then -called *yourusername*/ctapipe (it's as simple as clicking the fork button on `main ctapipe github page `_. - -You only need to make this fork once, when you first start developing, and -you can use it from then on. - -+++++++++++++++++++++++++++++++++++++++++ -Step 2: clone your forked version locally -+++++++++++++++++++++++++++++++++++++++++ +The instructions below have versions for both approaches, select the tab that applies to your +setup. -Next, you need to clone (copy to your local machine) the newly forked -ctapipe repo (make sure you put in your own username there): -.. code-block:: console +Cloning the repository +---------------------- - $ git clone https://github.com/[YOUR-GITHUB-USERNAME]/ctapipe.git - $ cd ctapipe +The examples below use ssh, assuming you setup an ssh key to access GitHub. +See `the GitHub documentation `_ if you haven't done so already. +.. tab-set:: -If you are using a fork, the default remote repository will be the one in your user account on GitHub. -To be able to synchronize with the official copy in the cta-observatory account, -you need to add an upstream remote as follows: + .. tab-item:: Working in the main repository + :sync: main -.. code-block:: console + Clone the repository: - $ git remote add upstream https://github.com/cta-observatory/ctapipe.git + .. code-block:: console -If that worked, you should see an *upstream* remote in -addition to *origin* when typing ``git remote -v``. + $ git clone git@github.com:cta-observatory/ctapipe.git + $ cd ctapipe -To get changes from the main repository, run: -.. code-block:: console + .. tab-item:: Working a fork + :sync: fork - $ git fetch upstream + In order to checkout the software so that you can push changes to GitHub without + having write access to the main repository at ``cta-observatory/ctapipe``, you + `need to fork `_ it. -Then, update a local branch using + After that, clone your fork of the repository and add the main reposiory as a second + remote called ``upstream``, so that you can keep your fork synchronized with the main repository. -.. code-block:: console + .. code-block:: console - $ git merge upstream/main + $ git clone https://github.com/[YOUR-GITHUB-USERNAME]/ctapipe.git + $ cd ctapipe + $ git remote add upstream https://github.com/cta-observatory/ctapipe.git -or -.. code-block:: console - - $ git rebase upstream/main -For differences between rebasing and merging and when to use which, see `this tutorial `_. +Setting up the development environment +-------------------------------------- - - -+++++++++++++++++++++++++++++++++++++++ -Step 4: Set up your package environment -+++++++++++++++++++++++++++++++++++++++ - -Change to the directory where you cloned ``ctapipe``, and type: +We provide a conda environment with all packages needed for development of ctapipe and a couple of additonal helpful pacakages (like ipython, jupyter and vitables): .. code-block:: console $ mamba env create -f environment.yml -This will create a conda environment called ``cta-dev`` with all -the ctapipe dependencies and a few useful packages for development and -interaction. Next, switch to this new virtual environment: +Next, switch to this new virtual environment: .. code-block:: console $ mamba activate cta-dev -You will need to type that last command any time you open a new -terminal to activate the conda environment. +You will need to run that last command any time you open a new +terminal to activate the conda environment. -+++++++++++++++++++++++++++++++++++++ -Step 5: Setup ctapipe for development -+++++++++++++++++++++++++++++++++++++ +Installing ctapipe in development mode +-------------------------------------- Now setup this cloned version for development. -The following command will use editable installation feature of python packages. +The following command will use the editable installation feature of python packages. From then on, all the ctapipe executables and the library itself will be usable from anywhere, given you have activated the ``cta-dev`` conda environment. @@ -162,6 +114,16 @@ test plugin via $ pip install -e ./test_plugin + +We are using the ``black`` and ``isort`` auto-formatters for automatic +adherence to the code style (see our :doc:`/developer-guide/style-guide`). +To enforce running these tools whenever you make a commit, setup the +`pre-commit hook `_: + +.. code-block:: console + + $ pre-commit install + Run the tests to make sure everything is OK: .. code-block:: console @@ -181,7 +143,7 @@ Run the example Python scripts: $ cd examples $ python xxx_example.py -try running some command line tools: +Try running some command line tools: .. code-block:: console @@ -191,49 +153,81 @@ try running some command line tools: To update to the latest development version (merging in remote changes to your local working copy): -.. code-block:: console - $ git fetch upstream - $ git merge upstream/main # or rebase, see above +.. tab-set:: ---------------------------------------- -Developing a new feature or code change ---------------------------------------- + .. tab-item:: Working in the main repository + :sync: main -We are using the ``black`` and ``isort`` auto-formatters for automatic -adherence to the code style (see our :doc:`/developer-guide/style-guide`). -To enforce running these tools whenever you make a commit, setup the -`pre-commit hook `_:: + .. code-block:: console - $ pre-commit install + $ git pull + + .. tab-item:: Working a fork + :sync: fork + + .. code-block:: console + + $ git fetch upstream + $ git merge upstream/main --ff-only + $ git push + + Note: you can also press the "Sync fork" button on the main page of your fork on the github + and then just use ``git pull``. + +Developing a new feature or code change +--------------------------------------- You should always create a new branch when developing some new code. Make a new branch for each new feature, so that you can make pull-requests for each one separately and not mix code from each. +It is much easier to review and merge small, well-defined contributions than +a collection of multiple, unrelated changes. + +Most importantly, you should *never* add commits to the ``main`` branch of your fork, +as the main branch will often be updated in the main ``cta-observatory`` repository +and having a diverging history in the main branch of a fork will create issues when trying +to keep forks in sync. + Remember that ``git switch `` [#switch]_ switches between branches, -``git switch -c `` creates a new branch, and ``git branch`` on it's own -will tell you which branches are available and which one you are currently on. +``git switch -c `` creates a new branch and switches to it, +and ``git branch`` on it's own will tell you which branches are available +and which one you are currently on. + +Create a feature branch +^^^^^^^^^^^^^^^^^^^^^^^ First think of a name for your code change, here we'll use *implement_feature_1* as an example. -+++++++++++++++++++++++++++ -1. Create a feature branch: -+++++++++++++++++++++++++++ To ensure you are starting your work from an up-to-date ``main`` branch, we recommend starting a new branch like this: -.. code-block:: console - $ git fetch upstream # get latest changes from main repository - $ git switch -c upstream/main # start new branch at upstream/main +.. tab-set:: + .. tab-item:: Working in the main repository + :sync: main -++++++++++++++++ -2. Edit the code -++++++++++++++++ + .. code-block:: console + + $ git fetch # get the latest changes + $ git switch -c origin/main # start a new branch from main + + .. tab-item:: Working a fork + :sync: fork + + .. code-block:: console + + $ git fetch upstream # get latest changes from main repository + $ git switch -c upstream/main # start new branch from upstream/main + + + +Edit the code +^^^^^^^^^^^^^ and make as many commits as you want (more than one is generally better for large changes!). @@ -244,13 +238,13 @@ better for large changes!). $ git commit [type descriptive message in window that pops up] -and repeat. The commit message should follow the *GIT conventions*: -the first line is a short description, followed by a blank line, +and repeat. The commit message should follow the *Git conventions*: +use the imperative, the first line is a short description, followed by a blank line, followed by details if needed (in a bullet list if applicable). You may even refer to GitHub issue ids, and they will be automatically linked to the commit in the issue tracker. An example commit message:: - fixed bug #245 + fix bug #245 - changed the order of if statements to avoid logical error - added unit test to check for regression @@ -262,8 +256,8 @@ sub-module), check the style, and make sure the docs render correctly .. note:: A git commit should ideally contain one and only one feature change - (e.g it should not mix changes that are logically different - together). Therefore it's best to group related changes with ``git + (e.g it should not mix changes that are logically different). + Therefore it's best to group related changes with ``git add ``. You may even commit only *parts* of a changed file using and ``git add -p``. If you want to keep your git commit history clean, learn to use commands like ``git commit --ammend`` @@ -273,9 +267,8 @@ sub-module), check the style, and make sure the docs render correctly A clean history and a chain of well-written commit messages will make it easier on code reviews to see what you did. -++++++++++++++++++++++++++++++++++++++++++ -3. Push your branch to your fork on github -++++++++++++++++++++++++++++++++++++++++++ +Push your changes +^^^^^^^^^^^^^^^^^ The first time you push a new branch, you need to specify to which remote the branch should be pushed [#push]_. Normally this will be ``origin``: @@ -295,9 +288,67 @@ You can do this at any time and more than once. It just moves the changes from your local branch on your development machine to your fork on github. -++++++++++++++++++++++++++ -4. Create a *Pull Request* -++++++++++++++++++++++++++ +Integrating changes from the ``main`` branch. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In case of updates to the ``main`` branch during your development, +it might be necessary to update your branch to integrate those changes, +especially in case of conflicts. + +To get the latest changes, run: + +.. tab-set:: + + .. tab-item:: Working in the main repository + :sync: main + + .. code-block:: console + + $ git fetch + + .. tab-item:: Working a fork + :sync: fork + + .. code-block:: console + + $ git fetch upstream + +Then, update a local branch using: + +.. tab-set:: + + .. tab-item:: Working in the main repository + :sync: main + + .. code-block:: console + + $ git rebase origin/main + + or + + .. code-block:: console + + $ git merge origin/main + + .. tab-item:: Working a fork + :sync: fork + + .. code-block:: console + + $ git rebase upstream/main + + or + + .. code-block:: console + + $ git merge upstream/main + +For differences between rebasing and merging and when to use which, see `this tutorial `_. + + + +Create a *Pull Request* +^^^^^^^^^^^^^^^^^^^^^^^ When you're happy, you create PR on on your github fork page by clicking "pull request". You can also do this via *GitHub Desktop* if you have @@ -308,9 +359,8 @@ Make sure to describe all the changes and give examples and use cases! See the :ref:`pullrequests` section for more info. -+++++++++++++++++++++++++ -5. Wait for a code review -+++++++++++++++++++++++++ +Wait for a code review +^^^^^^^^^^^^^^^^^^^^^^ Keep in mind the following: @@ -335,28 +385,42 @@ commit`` them and then run ``git push`` and the reviewer will see the changes. When the PR is accepted, the reviewer will merge your branch into the *master* repo on cta-observatory's account. -+++++++++++++++++++++++++++++ -6. Delete your feature branch -+++++++++++++++++++++++++++++ +Delete your feature branch +^^^^^^^^^^^^^^^^^^^^^^^^^^ since it is no longer needed (assuming it was accepted and merged in): -.. code-block:: sh +.. code-block:: console - git switch main # switch back to your master branch + $ git switch main # switch back to your master branch pull in the upstream changes, which should include your new features, and remove the branch from the local and remote (github). -.. code-block:: sh +.. tab-set:: - git fetch upstream - git rebase upstream/main - git branch --delete --remotes implement_feature_1 + .. tab-item:: Working in the main repository + :sync: main + + .. code-block:: console + + $ git pull + + .. tab-item:: Working a fork + :sync: fork + + .. code-block:: console + + $ git fetch upstream + $ git merge upstream/main --ff-only + +And then delete your branch: + +.. code-block:: console + + $ git branch --delete --remotes implement_feature_1 -Note the last step can also be done on the GitHub website. -------------------- Debugging Your Code ------------------- @@ -393,3 +457,5 @@ even allow you to issue pull-requests. $ git config --global branch.autoSetupMerge simple $ git config --global push.autoSetupRemote true + + diff --git a/docs/developer-guide/maintainer-info.rst b/docs/developer-guide/maintainer-info.rst index 12fdd1f0e8b..6922c8dcbe7 100644 --- a/docs/developer-guide/maintainer-info.rst +++ b/docs/developer-guide/maintainer-info.rst @@ -1,6 +1,5 @@ -*************** Maintainer info -*************** +=============== This is a collection of some notes for maintainers. @@ -12,12 +11,16 @@ ctapipe follows `NEP 29 `_. -Once you created a new virtual environment, you can install ``ctapipe`` with the following command:: - mamba install -c conda-forge ctapipe +To install ``ctapipe`` into an existing conda environment, use: + +.. code-block:: console + + $ mamba install -c conda-forge ctapipe + +You can also directly create a new environment like this (add more packages as you like): + +.. code-block:: console -or with pip:: + $ mamba create -n ctapipe -c conda-forge python ctapipe - pip install ctapipe +or with pip: + +.. code-block:: console + + $ pip install ctapipe -+++++++++++++++++++++++++++++ How to get a specific version -+++++++++++++++++++++++++++++ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To install a specific version of ``ctapipe`` you can use the following command: + +.. code-block:: console + + $ mamba install -c conda-forge ctapipe=0.17.0 -To install a specific version of ``ctapipe`` you can use the following command:: - - mamba install -c conda-forge ctapipe==0.17.0 +or with pip: -or with pip:: +.. code-block:: console - pip install ctapipe==0.17.0 + $ pip install ctapipe==0.17.0 From 48250a5837e204b351e7878bbeb2667a2db3727f Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 21 Jul 2023 17:28:18 +0200 Subject: [PATCH 070/264] Fix json_url, kind of... see https://github.com/pydata/pydata-sphinx-theme/issues/1389 --- docs/conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 6a4a5ee4859..013d575931e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -210,19 +210,19 @@ def setup(app): json_url = "https://ctapipe.readthedocs.io/en/latest/_static/switcher.json" # Define the version we use for matching in the version switcher. -version_match = os.environ.get("READTHEDOCS_VERSION") +version_match = os.getenv("READTHEDOCS_VERSION") # If READTHEDOCS_VERSION doesn't exist, we're not on RTD # If it is an integer, we're in a PR build and the version isn't correct. if not version_match or version_match.isdigit(): # For local development, infer the version to match from the package. if "dev" in release or "rc" in release: version_match = "latest" - # We want to keep the relative reference if we are in dev mode - # but we want the whole url if we are effectively in a released version - json_url = "/_static/switcher.json" else: version_match = release + # We want to keep the relative reference when on a pull request or locally + json_url = "_static/switcher.json" + # -- Options for HTML output ---------------------------------------------- From 49eeb22eb2f17bae0e73158008821383c923ae70 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 21 Jul 2023 17:30:15 +0200 Subject: [PATCH 071/264] Fix title syntax --- docs/developer-guide/getting-started.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/developer-guide/getting-started.rst b/docs/developer-guide/getting-started.rst index 1ebacb3af1a..4b85a3a4a14 100644 --- a/docs/developer-guide/getting-started.rst +++ b/docs/developer-guide/getting-started.rst @@ -431,7 +431,6 @@ not give you access to runtime variables at the point where your code fails, we using ``pdb`` or ``ipdb`` for an IPython shell. A nice introduction can be found `here `_. ---------------------- More Development help --------------------- @@ -457,5 +456,3 @@ even allow you to issue pull-requests. $ git config --global branch.autoSetupMerge simple $ git config --global push.autoSetupRemote true - - From 205869352ceb196423d09dc7a53135b69bd46d87 Mon Sep 17 00:00:00 2001 From: TjarkMiener Date: Thu, 10 Aug 2023 11:18:39 +0200 Subject: [PATCH 072/264] added R0 and R1 merging (closes #2368) --- ctapipe/io/hdf5merger.py | 22 ++++++++++++++++++++++ ctapipe/tools/merge.py | 12 ++++++++++++ 2 files changed, 34 insertions(+) diff --git a/ctapipe/io/hdf5merger.py b/ctapipe/io/hdf5merger.py index f8c6ca7aca7..8e97d43982b 100644 --- a/ctapipe/io/hdf5merger.py +++ b/ctapipe/io/hdf5merger.py @@ -37,6 +37,8 @@ class NodeType(enum.Enum): "/simulation/event/telescope/impact": NodeType.TEL_GROUP, "/simulation/event/telescope/images": NodeType.TEL_GROUP, "/simulation/event/telescope/parameters": NodeType.TEL_GROUP, + "/r0/event/telescope": NodeType.TEL_GROUP, + "/r1/event/telescope": NodeType.TEL_GROUP, "/dl1/event/subarray/trigger": NodeType.TABLE, "/dl1/event/telescope/trigger": NodeType.TABLE, "/dl1/event/telescope/images": NodeType.TEL_GROUP, @@ -115,6 +117,16 @@ class HDF5Merger(Component): help="Whether to include parameters calculated on true images in merged output", ).tag(config=True) + r0_waveforms = traits.Bool( + True, + help="Whether to include r0 waveforms in merged output", + ).tag(config=True) + + r1_waveforms = traits.Bool( + True, + help="Whether to include r1 waveforms in merged output", + ).tag(config=True) + dl1_images = traits.Bool( True, help="Whether to include dl1 images in merged output", @@ -296,6 +308,16 @@ def _append(self, other): ): self._append_table_group(other, other.root[key]) + # R0 + key = "/r0/event/telescope/" + if self.telescope_events and self.r0_waveforms and key in other.root: + self._append_table_group(other, other.root[key]) + + # R1 + key = "/r1/event/telescope/" + if self.telescope_events and self.r1_waveforms and key in other.root: + self._append_table_group(other, other.root[key]) + # DL1 key = "/dl1/event/subarray/trigger" if key in other.root: diff --git a/ctapipe/tools/merge.py b/ctapipe/tools/merge.py index 9c9dd82e295..5dada6d8883 100644 --- a/ctapipe/tools/merge.py +++ b/ctapipe/tools/merge.py @@ -95,6 +95,18 @@ class MergeTool(Tool): "Include telescope-wise data", "Exclude telescope-wise data", ), + **flag( + "r0-waveforms", + "HDF5Merger.r0_waveforms", + "Include r0 waveforms", + "Exclude r0 waveforms", + ), + **flag( + "r1-waveforms", + "HDF5Merger.r1_waveforms", + "Include r1 waveforms", + "Exclude r1 waveforms", + ), **flag( "dl1-images", "HDF5Merger.dl1_images", From 9ac2219e8990f1b109c366859a015528702c4d7a Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 18 Aug 2023 20:08:56 +0200 Subject: [PATCH 073/264] Replace deprecated provision-with-micromamba action with setup-micromamba --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4a04165d9d..248d26a8fac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,10 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' - uses: mamba-org/provision-with-micromamba@v14 + uses: mamba-org/setup-micromamba@v1 + with: + environment-file: environment.yml + cache-downloads: true - name: Python setup if: matrix.install-method == 'pip' From 7b15a908042f53c8f1fee9e511f0697736c58523 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 15:53:36 +0200 Subject: [PATCH 074/264] Fixed pixel likelihood formulation --- ctapipe/image/pixel_likelihood.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index c29db09ac94..8a8412d151d 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -30,6 +30,7 @@ import numpy as np from scipy.integrate import quad from scipy.stats import poisson +from scipy.special import factorial __all__ = [ "neg_log_likelihood_approx", @@ -95,13 +96,14 @@ def neg_log_likelihood_approx(image, prediction, spe_width, pedestal): """ theta = pedestal**2 + prediction * (1 + spe_width**2) - neg_log_l = np.log(theta + EPSILON) + (image - prediction) ** 2 / theta + # This is really 2 times the full log likelihood + neg_log_l = np.log(2 * np.pi * theta + EPSILON) + (image - prediction) ** 2 / theta return np.sum(neg_log_l) def neg_log_likelihood_numeric( - image, prediction, spe_width, pedestal, confidence=(0.001, 0.999) + image, prediction, spe_width, pedestal, confidence=0.999 ): """ Calculate likelihood of prediction given the measured signal, @@ -131,7 +133,7 @@ def neg_log_likelihood_numeric( likelihood = epsilon - ns = np.arange(*poisson(np.max(prediction)).ppf(confidence)) + ns = np.arange(poisson(np.max(prediction)).ppf(confidence) + 1) ns = ns[ns >= 0] @@ -140,7 +142,8 @@ def neg_log_likelihood_numeric( _l = ( prediction**n * np.exp(-prediction) - / theta + / np.sqrt(2 * np.pi * theta) + / factorial(n) * np.exp(-((image - n) ** 2) / (2 * theta)) ) likelihood += _l From 6766c7946bb0f9a5d5cd5b73fd07bdb0dca81fb8 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 16:07:13 +0200 Subject: [PATCH 075/264] Fixed tests, passing now --- ctapipe/image/pixel_likelihood.py | 5 +++-- ctapipe/image/tests/test_pixel_likelihood.py | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index 8a8412d151d..fec2247d876 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -96,8 +96,9 @@ def neg_log_likelihood_approx(image, prediction, spe_width, pedestal): """ theta = pedestal**2 + prediction * (1 + spe_width**2) - # This is really 2 times the full log likelihood - neg_log_l = np.log(2 * np.pi * theta + EPSILON) + (image - prediction) ** 2 / theta + neg_log_l = 0.5 * ( + np.log(2 * np.pi * theta + EPSILON) + (image - prediction) ** 2 / theta + ) return np.sum(neg_log_l) diff --git a/ctapipe/image/tests/test_pixel_likelihood.py b/ctapipe/image/tests/test_pixel_likelihood.py index 9a2b5bff49e..3ea62b8f855 100644 --- a/ctapipe/image/tests/test_pixel_likelihood.py +++ b/ctapipe/image/tests/test_pixel_likelihood.py @@ -2,6 +2,7 @@ from ctapipe.image import ( neg_log_likelihood, neg_log_likelihood_approx, + neg_log_likelihood_numeric, mean_poisson_likelihood_gaussian, chi_squared, mean_poisson_likelihood_full, @@ -56,11 +57,11 @@ def test_full_likelihood(): full_like_small = neg_log_likelihood(image_small, expectation_small, spe, pedestal) exp_diff = full_like_small - np.sum( - np.asarray([2.75630505, 2.62168656, 3.39248449]) + np.asarray([1.37815294, 1.31084662, 1.69627197]) ) # Check against known values - assert exp_diff / np.sum(full_like_small) < 1e-4 + assert np.abs(exp_diff / np.sum(full_like_small)) < 1e-4 image_large = np.array([40, 50, 60]) expectation_large = np.array([50, 50, 50]) @@ -68,15 +69,21 @@ def test_full_likelihood(): full_like_large = neg_log_likelihood(image_large, expectation_large, spe, pedestal) # Check against known values exp_diff = full_like_large - np.sum( - np.asarray([7.45489137, 5.99305388, 7.66226007]) + np.asarray([3.72744569, 2.99652694, 3.83113004]) ) - assert exp_diff / np.sum(full_like_large) < 1e-4 + assert np.abs(exp_diff / np.sum(full_like_large)) < 3e-4 gaus_like_large = neg_log_likelihood_approx( image_large, expectation_large, spe, pedestal ) + numeric_like_large = neg_log_likelihood_numeric( + image_large, expectation_large, spe, pedestal + ) + # Check thats in large signal case the full expectation is equal to the # gaussian approximation (to 5%) - assert np.all(np.abs((full_like_large - gaus_like_large) / full_like_large) < 0.05) + assert np.all( + np.abs((numeric_like_large - gaus_like_large) / numeric_like_large) < 0.05 + ) From db009423eda3a61f880614d84af799ec7f8f04b8 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 16:20:37 +0200 Subject: [PATCH 076/264] Sort imports --- ctapipe/image/pixel_likelihood.py | 3 ++- ctapipe/image/tests/test_pixel_likelihood.py | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index fec2247d876..b2361e213a6 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -29,8 +29,9 @@ import numpy as np from scipy.integrate import quad -from scipy.stats import poisson from scipy.special import factorial +from scipy.stats import poisson + __all__ = [ "neg_log_likelihood_approx", diff --git a/ctapipe/image/tests/test_pixel_likelihood.py b/ctapipe/image/tests/test_pixel_likelihood.py index 3ea62b8f855..b5a8373557a 100644 --- a/ctapipe/image/tests/test_pixel_likelihood.py +++ b/ctapipe/image/tests/test_pixel_likelihood.py @@ -1,11 +1,11 @@ import numpy as np from ctapipe.image import ( + chi_squared, + mean_poisson_likelihood_full, + mean_poisson_likelihood_gaussian, neg_log_likelihood, neg_log_likelihood_approx, neg_log_likelihood_numeric, - mean_poisson_likelihood_gaussian, - chi_squared, - mean_poisson_likelihood_full, ) From 592d3146132b00363c65c78a5f9043dda24fe079 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 16:23:19 +0200 Subject: [PATCH 077/264] Added changelog --- docs/changes/2388.bug.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2388.bug.rst diff --git a/docs/changes/2388.bug.rst b/docs/changes/2388.bug.rst new file mode 100644 index 00000000000..0d7d716c1aa --- /dev/null +++ b/docs/changes/2388.bug.rst @@ -0,0 +1 @@ +Fixed a bug in the calculation of the full numeric pixel likelihood and the corresponding tests. \ No newline at end of file From afd557add3dc04f49f69433291b884d8aa15db17 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 16:56:01 +0200 Subject: [PATCH 078/264] Changed cofidence docstring --- ctapipe/image/pixel_likelihood.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index b2361e213a6..0c36e58d7b4 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -121,8 +121,9 @@ def neg_log_likelihood_numeric( Width of single p.e. peak (:math:`σ_γ`). pedestal: ndarray Width of pedestal (:math:`σ_p`). - confidence: tuple(float, float), 0 < x < 1 - Confidence interval of poisson integration. + confidence: loat, 0 < x < 1 + Upper end of Poisson confidence interval of maximum prediction. + Determines upper end of poisson integration. Returns ------- From 7c0cf914b991e4736789fa7ff4b43aa3b5967a16 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 17:12:38 +0200 Subject: [PATCH 079/264] black+isort --- ctapipe/image/pixel_likelihood.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index 0c36e58d7b4..cb47226d66b 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -32,7 +32,6 @@ from scipy.special import factorial from scipy.stats import poisson - __all__ = [ "neg_log_likelihood_approx", "neg_log_likelihood_numeric", From 77992f3ca096af8802fb11abcd74eaf42e06d21e Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 24 Aug 2023 17:12:38 +0200 Subject: [PATCH 080/264] black+isort --- ctapipe/image/pixel_likelihood.py | 1 - ctapipe/image/tests/test_pixel_likelihood.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index 0c36e58d7b4..cb47226d66b 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -32,7 +32,6 @@ from scipy.special import factorial from scipy.stats import poisson - __all__ = [ "neg_log_likelihood_approx", "neg_log_likelihood_numeric", diff --git a/ctapipe/image/tests/test_pixel_likelihood.py b/ctapipe/image/tests/test_pixel_likelihood.py index b5a8373557a..cf2f1f2447c 100644 --- a/ctapipe/image/tests/test_pixel_likelihood.py +++ b/ctapipe/image/tests/test_pixel_likelihood.py @@ -1,4 +1,5 @@ import numpy as np + from ctapipe.image import ( chi_squared, mean_poisson_likelihood_full, From 76f881aa63224fd98b484c567b193caf536587b3 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Fri, 25 Aug 2023 08:12:00 +0200 Subject: [PATCH 081/264] Variable rename --- ctapipe/image/pixel_likelihood.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index cb47226d66b..dff6cfa2270 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -135,11 +135,11 @@ def neg_log_likelihood_numeric( likelihood = epsilon - ns = np.arange(poisson(np.max(prediction)).ppf(confidence) + 1) + n_signal = np.arange(poisson(np.max(prediction)).ppf(confidence) + 1) - ns = ns[ns >= 0] + n_signal = n_signal[n_signal >= 0] - for n in ns: + for n in n_signal: theta = pedestal**2 + n * spe_width**2 _l = ( prediction**n From cfc144a7c3f0593f733853b884cf07a5a749dc3d Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 25 Aug 2023 15:54:07 +0200 Subject: [PATCH 082/264] Add section on pre-commit hooks Co-authored-by: Tomas Bylund --- docs/developer-guide/getting-started.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/developer-guide/getting-started.rst b/docs/developer-guide/getting-started.rst index 4b85a3a4a14..146058d49ea 100644 --- a/docs/developer-guide/getting-started.rst +++ b/docs/developer-guide/getting-started.rst @@ -124,6 +124,12 @@ To enforce running these tools whenever you make a commit, setup the $ pre-commit install +The pre-commit hook will then execute the tools with the same settings as when the a pull request is checked on github, +and if any problems are reported the commit will be rejected. +You then have to fix the reported issues before tying to commit again. +Note that a common problem is code not complying with the style guide, and that whenever this was the only problem found, +simply adding the changes resulting from the pre-commit hook to the commit will result in your changes being accepted. + Run the tests to make sure everything is OK: .. code-block:: console From 327a49a57ef901a1d57f51aec3534dbc093a4385 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Tue, 29 Aug 2023 16:28:46 +0200 Subject: [PATCH 083/264] Fix typo and factor 2 in mean full mean likelihood --- ctapipe/image/pixel_likelihood.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index dff6cfa2270..b02bbb30d4c 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -120,7 +120,7 @@ def neg_log_likelihood_numeric( Width of single p.e. peak (:math:`σ_γ`). pedestal: ndarray Width of pedestal (:math:`σ_p`). - confidence: loat, 0 < x < 1 + confidence: float, 0 < x < 1 Upper end of Poisson confidence interval of maximum prediction. Determines upper end of poisson integration. @@ -227,7 +227,7 @@ def _integral_poisson_likelihood_full(image, prediction, spe_width, ped): image = np.asarray(image) prediction = np.asarray(prediction) like = neg_log_likelihood(image, prediction, spe_width, ped) - return like * np.exp(-0.5 * like) + return 2 * like * np.exp(-like) def mean_poisson_likelihood_full(prediction, spe_width, ped): From dedd1809cd0c966d84939b1c909086e563fff15f Mon Sep 17 00:00:00 2001 From: gschwefer Date: Tue, 29 Aug 2023 17:07:11 +0200 Subject: [PATCH 084/264] Add unit test for mean gaussian likelihood --- ctapipe/image/tests/test_pixel_likelihood.py | 28 +++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/ctapipe/image/tests/test_pixel_likelihood.py b/ctapipe/image/tests/test_pixel_likelihood.py index cf2f1f2447c..97561b8cc3c 100644 --- a/ctapipe/image/tests/test_pixel_likelihood.py +++ b/ctapipe/image/tests/test_pixel_likelihood.py @@ -24,7 +24,7 @@ def test_chi_squared(): def test_mean_poisson_likelihoood_gaussian(): - prediction = np.array([1, 1, 1], dtype="float") + prediction = np.array([50, 50, 50], dtype="float") spe = 0.5 small_mean_likelihood = mean_poisson_likelihood_gaussian(prediction, spe, 0) @@ -32,13 +32,35 @@ def test_mean_poisson_likelihoood_gaussian(): assert small_mean_likelihood < large_mean_likelihood + # Test that the mean likelihood of abunch of samples drawn from the gaussian + # behind the aprroximate log likelihood is indeed the precalculated mean + + rng = np.random.default_rng(123456) + + ped = 1 + + mean_likelihood = mean_poisson_likelihood_gaussian(prediction[0], spe, ped) + + distribution_width = np.sqrt(ped**2 + prediction[0] * (1 + spe**2)) + + normal_samples = rng.normal( + loc=prediction[0], scale=distribution_width, size=100000 + ) + + rel_diff = ( + 2 * neg_log_likelihood_approx(normal_samples, prediction[0], spe, ped) / 100000 + - mean_likelihood + ) / mean_likelihood + + assert np.abs(rel_diff) < 5e-4 + def test_mean_poisson_likelihood_full(): - prediction = np.array([30.0, 30.0]) + prediction = np.array([10.0, 10.0]) spe = np.array([0.5]) - small_mean_likelihood = mean_poisson_likelihood_full(prediction, spe, [0]) + small_mean_likelihood = mean_poisson_likelihood_full(prediction, spe, [0.1]) large_mean_likelihood = mean_poisson_likelihood_full(prediction, spe, [1]) assert small_mean_likelihood < large_mean_likelihood From ed57223201edab96da357c398d5aef6905d2b70d Mon Sep 17 00:00:00 2001 From: gschwefer Date: Tue, 29 Aug 2023 17:11:06 +0200 Subject: [PATCH 085/264] Updated docstring --- ctapipe/image/pixel_likelihood.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index b02bbb30d4c..1d124d63852 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -72,11 +72,8 @@ def neg_log_likelihood_approx(image, prediction, spe_width, pedestal): - \\ln{P} = \\frac{\\ln{2 π} + \\ln{θ}}{2} + \\frac{(s - μ)^2}{2 θ} - and since we can remove constants and factors in the minimization: - - .. math:: - - - \\ln{P} = \\ln{θ} + \\frac{(s - μ)^2}{θ} + We keep the constants in this because the actual value of the likelihood can be used + to calculate a goodness-of-fit value Parameters From 1d664a6a2999bce6cbad66ca11b19da5a176fffb Mon Sep 17 00:00:00 2001 From: gschwefer Date: Tue, 29 Aug 2023 17:11:06 +0200 Subject: [PATCH 086/264] Updated docstring --- ctapipe/image/pixel_likelihood.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index b02bbb30d4c..2da4ee6c070 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -72,11 +72,8 @@ def neg_log_likelihood_approx(image, prediction, spe_width, pedestal): - \\ln{P} = \\frac{\\ln{2 π} + \\ln{θ}}{2} + \\frac{(s - μ)^2}{2 θ} - and since we can remove constants and factors in the minimization: - - .. math:: - - - \\ln{P} = \\ln{θ} + \\frac{(s - μ)^2}{θ} + We keep the constants in this because the actual value of the likelihood + can be used to calculate a goodness-of-fit value Parameters From bfb8278d953cf15255c104b24025773f70db5870 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 31 Aug 2023 16:19:11 +0200 Subject: [PATCH 087/264] Remove no-longer needed importlib_resources --- ctapipe/tools/quickstart.py | 6 +----- ctapipe/tools/tests/test_merge.py | 6 +----- ctapipe/utils/datasets.py | 6 +----- setup.cfg | 1 - 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/ctapipe/tools/quickstart.py b/ctapipe/tools/quickstart.py index 3aab1aa459b..317d5723ab2 100644 --- a/ctapipe/tools/quickstart.py +++ b/ctapipe/tools/quickstart.py @@ -2,11 +2,7 @@ Create a working directory for ctapipe-process containing standard configuration files. """ -try: - from importlib.resources import files -except ImportError: - from importlib_resources import files - +from importlib.resources import files from pathlib import Path from ..core import Provenance, Tool, traits diff --git a/ctapipe/tools/tests/test_merge.py b/ctapipe/tools/tests/test_merge.py index aa295ed2e01..1e09ad044d3 100644 --- a/ctapipe/tools/tests/test_merge.py +++ b/ctapipe/tools/tests/test_merge.py @@ -1,5 +1,6 @@ import shutil import tempfile +from importlib.resources import files from io import StringIO from pathlib import Path @@ -14,11 +15,6 @@ from ctapipe.io.tests.test_astropy_helpers import assert_table_equal from ctapipe.tools.process import ProcessorTool -try: - from importlib.resources import files -except ImportError: - from importlib_resources import files - def run_stage1(input_path, cwd, output_path=None): config = files("ctapipe").joinpath("resources", "stage1_config.json") diff --git a/ctapipe/utils/datasets.py b/ctapipe/utils/datasets.py index 4248809a681..cf50c1415ef 100644 --- a/ctapipe/utils/datasets.py +++ b/ctapipe/utils/datasets.py @@ -19,11 +19,7 @@ except ImportError: has_resources = False -try: - from importlib.resources import files -except ImportError: - from importlib_resources import files - +from importlib.resources import files from ..core import Provenance diff --git a/setup.cfg b/setup.cfg index 73574ddac5d..767a6b458f6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,7 +29,6 @@ install_requires= docutils eventio >=1.9.1, <2.0.0a0 iminuit >=2 - importlib_resources ; python_version < "3.9" importlib_metadata ; python_version < "3.10" joblib matplotlib ~=3.0 From a6bded3c7f9910aa814aa5c97868f49813886499 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 4 Sep 2023 11:57:06 +0200 Subject: [PATCH 088/264] Improve docstrings in SubarrayDescription --- ctapipe/instrument/subarray.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ctapipe/instrument/subarray.py b/ctapipe/instrument/subarray.py index e664dacc4ae..0466d102f3d 100644 --- a/ctapipe/instrument/subarray.py +++ b/ctapipe/instrument/subarray.py @@ -56,13 +56,15 @@ class SubarrayDescription: ---------- name: str name of subarray - tel_coords: astropy.coordinates.SkyCoord + tel_coords: ctapipe.coordinates.GroundFrame coordinates of all telescopes tels: dict of TelescopeDescription for each telescope in the subarray """ + #: Current version number of the format written by `SubarrayDescription.to_hdf` CURRENT_TAB_VERSION = "2.0" + #: Version numbers supported by `SubarrayDescription.from_hdf` COMPATIBLE_VERSIONS = {"2.0"} def __init__( @@ -148,7 +150,7 @@ def info(self, printer=print): @lazyproperty def tel_coords(self): - """returns telescope positions as astropy.coordinates.SkyCoord""" + """Telescope positions in `~ctapipe.coordinates.GroundFrame`""" pos_x = [p[0].to_value(u.m) for p in self.positions.values()] pos_y = [p[1].to_value(u.m) for p in self.positions.values()] @@ -160,13 +162,12 @@ def tel_coords(self): @lazyproperty def tel_ids(self): - """telescope IDs as an array""" + """Array of telescope ids in order of telescope indices""" return np.array(list(self.tel.keys())) @lazyproperty def tel_indices(self): - """returns dict mapping tel_id to tel_index, useful for unpacking - lists based on tel_ids into fixed-length arrays""" + """dictionary mapping telescope ids to telescope index""" return {tel_id: ii for ii, tel_id in enumerate(self.tels.keys())} @lazyproperty From 89b8d678f8ddc978f4913ddd4f8c3617ace2be53 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 4 Sep 2023 11:57:57 +0200 Subject: [PATCH 089/264] Use int minval as invalid telescope id marker instead of -1 --- ctapipe/instrument/subarray.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ctapipe/instrument/subarray.py b/ctapipe/instrument/subarray.py index 0466d102f3d..5cefde4ff4c 100644 --- a/ctapipe/instrument/subarray.py +++ b/ctapipe/instrument/subarray.py @@ -173,13 +173,17 @@ def tel_indices(self): @lazyproperty def tel_index_array(self): """ - returns an expanded array that maps tel_id to tel_index. I.e. for a given - telescope, this array maps the tel_id to a flat index starting at 0 for - the first telescope. ``tel_index = tel_id_to_index_array[tel_id]`` - If the tel_ids are not contiguous, gaps will be filled in by -1. + Array of telescope indices that can be indexed by telescope id + + I.e. for a given telescope, this array maps the tel_id to a flat index + starting at 0 for the first telescope. + ``tel_index = subarray.tel_index_array[tel_id]`` + + If the tel_ids are not contiguous, gaps will be filled in by int minval. For a more compact representation use the `tel_indices` """ - idx = np.zeros(np.max(self.tel_ids) + 1, dtype=int) - 1 # start with -1 + invalid = np.iinfo(int).min + idx = np.full(np.max(self.tel_ids) + 1, invalid, dtype=int) for key, val in self.tel_indices.items(): idx[key] = val return idx From a8ea8c64e25d06c88d41d7d1a758988223ce0478 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 4 Sep 2023 12:28:36 +0200 Subject: [PATCH 090/264] Add changelog entry --- docs/changes/2376.api.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/changes/2376.api.rst diff --git a/docs/changes/2376.api.rst b/docs/changes/2376.api.rst new file mode 100644 index 00000000000..62bab6f6cc3 --- /dev/null +++ b/docs/changes/2376.api.rst @@ -0,0 +1,2 @@ +Change the fill value for invalid telescope ids in ``SubarrayDescription.tel_index_array`` +from ``-1`` to ``np.iinfo(int).minval`` to prevent ``-1`` being used as an index resulting in the last element being used for invalid telescope ids. From 2da4866e32963b124f56174c641ce4d6278d58dc Mon Sep 17 00:00:00 2001 From: gschwefer Date: Wed, 22 Feb 2023 11:40:20 +0100 Subject: [PATCH 091/264] Restrict nominal frame angle to below 45 deg --- ctapipe/reco/hillas_intersection.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index ea8e4f742a9..30de7452ad5 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -218,6 +218,15 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): src_fov_lon, src_fov_lat, err_fov_lon, err_fov_lat = self.reconstruct_nominal( hillas_dict_mod ) + + # Catch events reconstructed at great angular distance from camera center + # and retrun INVALID container to prevent SkyCoord error below. + if ( + np.abs(src_fov_lat) * u.rad > 45 * u.deg + or np.abs(src_fov_lon) * u.rad > 45 * u.deg + ): + return INVALID + core_x, core_y, core_err_x, core_err_y = self.reconstruct_tilted( hillas_dict_mod, tel_x, tel_y ) From 157376d9e6ec8e97a01a845bb3e5cf02a31ec93e Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 23 Feb 2023 17:35:37 +0100 Subject: [PATCH 092/264] Check of angular distnce in FoV now in function --- ctapipe/reco/hillas_intersection.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index 30de7452ad5..8f6b5d8babd 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -43,6 +43,29 @@ prefix="HillasIntersection", ) +FOV_ANGULAR_DISTANCE_LIMIT = 45 * u.deg + + +def far_outside_fov(fov_lat, fov_lon): + """ + Check if a given latitude or longiude in the FoV is further away from + the FoV center than `FOV_ANGULAR_DISTANCE_LIMIT` + + Parameters + ---------- + fov_lat : u.Quantity[angle] + Latitude in TelescopeFrame or NominalFrame + fov_lon : u.Quantity[angle] + Longitude in TelescopeFrame or NominalFrame + + Returns + ------- + bool + """ + lat_outside_fov = np.abs(fov_lat) > FOV_ANGULAR_DISTANCE_LIMIT + lon_outside_fov = np.abs(fov_lon) > FOV_ANGULAR_DISTANCE_LIMIT + return lat_outside_fov or lon_outside_fov + class HillasIntersection(HillasGeometryReconstructor): """ @@ -221,10 +244,7 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): # Catch events reconstructed at great angular distance from camera center # and retrun INVALID container to prevent SkyCoord error below. - if ( - np.abs(src_fov_lat) * u.rad > 45 * u.deg - or np.abs(src_fov_lon) * u.rad > 45 * u.deg - ): + if far_outside_fov(src_fov_lat * u.rad, src_fov_lon * u.rad): return INVALID core_x, core_y, core_err_x, core_err_y = self.reconstruct_tilted( From 239f1151c9559feb9cd475c187c94bfdcdbfdd1e Mon Sep 17 00:00:00 2001 From: gschwefer Date: Thu, 23 Feb 2023 19:13:39 +0100 Subject: [PATCH 093/264] First version of test --- .../reco/tests/test_hillas_intersection.py | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/ctapipe/reco/tests/test_hillas_intersection.py b/ctapipe/reco/tests/test_hillas_intersection.py index bee68188481..d8b01674e47 100644 --- a/ctapipe/reco/tests/test_hillas_intersection.py +++ b/ctapipe/reco/tests/test_hillas_intersection.py @@ -1,10 +1,11 @@ import astropy.units as u import numpy as np -from astropy.coordinates import SkyCoord +from astropy.coordinates import AltAz, EarthLocation, SkyCoord from numpy.testing import assert_allclose from ctapipe.containers import HillasParametersContainer -from ctapipe.coordinates import AltAz, CameraFrame, NominalFrame +from ctapipe.coordinates import CameraFrame, NominalFrame +from ctapipe.instrument import SubarrayDescription from ctapipe.reco.hillas_intersection import HillasIntersection @@ -216,6 +217,51 @@ def test_intersection_nominal_reconstruction(example_subarray): ) +def test_badly_reconstructed_event(prod5_mst_flashcam): + """ + Test that events reconstructed at large angular distance + from FoV center return INVALID + """ + tel_pos = {1: np.array([-50, 0, 0]) * u.m, 2: np.array([50, 0, 0]) * u.m} + tel_desc = {1: prod5_mst_flashcam, 2: prod5_mst_flashcam} + reference_location = EarthLocation( + lon=-17.890879 * u.deg, + lat=28.761579 * u.deg, + height=2199 * u.m, + ) + two_tel_subarray = SubarrayDescription( + "two_tel_subarray", + tel_positions=tel_pos, + tel_descriptions=tel_desc, + reference_location=reference_location, + ) + hill_inter = HillasIntersection(two_tel_subarray) + + hillas_tel_1 = HillasParametersContainer( + fov_lon=1 * u.deg, + fov_lat=1 * u.deg, + intensity=100, + psi=85.3 * u.deg, + length=0.5 * u.deg, + width=0.3 * u.deg, + ) + + hillas_tel_2 = HillasParametersContainer( + fov_lon=0 * u.deg, + fov_lat=0 * u.deg, + intensity=100, + psi=85.0 * u.deg, + length=0.5 * u.deg, + width=0.3 * u.deg, + ) + + hillas_dir = {1: hillas_tel_1, 2: hillas_tel_2} + pointing = AltAz(alt=70 * u.deg, az=0 * u.deg) + reco_event = hill_inter._predict(hillas_dict=hillas_dir, array_pointing=pointing) + + assert not reco_event.is_valid + + def test_reconstruction_works(subarray_and_event_gamma_off_axis_500_gev): subarray, event = subarray_and_event_gamma_off_axis_500_gev reconstructor = HillasIntersection(subarray) From e6408eaccca5e3ec202d3fcb77feaf56487db597 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Fri, 24 Feb 2023 11:06:54 +0100 Subject: [PATCH 094/264] Updated test event details --- .../reco/tests/test_hillas_intersection.py | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/ctapipe/reco/tests/test_hillas_intersection.py b/ctapipe/reco/tests/test_hillas_intersection.py index d8b01674e47..94492aba3d6 100644 --- a/ctapipe/reco/tests/test_hillas_intersection.py +++ b/ctapipe/reco/tests/test_hillas_intersection.py @@ -220,14 +220,15 @@ def test_intersection_nominal_reconstruction(example_subarray): def test_badly_reconstructed_event(prod5_mst_flashcam): """ Test that events reconstructed at large angular distance - from FoV center return INVALID + from FoV center return INVALID. Event and array loosely follow an + actual simulation event. """ - tel_pos = {1: np.array([-50, 0, 0]) * u.m, 2: np.array([50, 0, 0]) * u.m} + tel_pos = {1: np.array([150, 75, 0]) * u.m, 2: np.array([150, -240, 0]) * u.m} tel_desc = {1: prod5_mst_flashcam, 2: prod5_mst_flashcam} reference_location = EarthLocation( - lon=-17.890879 * u.deg, - lat=28.761579 * u.deg, - height=2199 * u.m, + lon=-70.32 * u.deg, + lat=-24.68 * u.deg, + height=2147 * u.m, ) two_tel_subarray = SubarrayDescription( "two_tel_subarray", @@ -238,21 +239,21 @@ def test_badly_reconstructed_event(prod5_mst_flashcam): hill_inter = HillasIntersection(two_tel_subarray) hillas_tel_1 = HillasParametersContainer( - fov_lon=1 * u.deg, - fov_lat=1 * u.deg, - intensity=100, + fov_lon=0.6 * u.deg, + fov_lat=-0.3 * u.deg, + intensity=95, psi=85.3 * u.deg, - length=0.5 * u.deg, - width=0.3 * u.deg, + length=0.09 * u.deg, + width=0.05 * u.deg, ) hillas_tel_2 = HillasParametersContainer( - fov_lon=0 * u.deg, - fov_lat=0 * u.deg, - intensity=100, + fov_lon=-0.1 * u.deg, + fov_lat=-0.4 * u.deg, + intensity=119, psi=85.0 * u.deg, - length=0.5 * u.deg, - width=0.3 * u.deg, + length=0.15 * u.deg, + width=0.04 * u.deg, ) hillas_dir = {1: hillas_tel_1, 2: hillas_tel_2} From 5af2276da337727ccc3d0e6f4c81935c5ceee4d3 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Wed, 8 Mar 2023 16:29:28 +0100 Subject: [PATCH 095/264] Adressed comments: No units and private method --- ctapipe/reco/hillas_intersection.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index 8f6b5d8babd..8d27af8c9ea 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -43,10 +43,10 @@ prefix="HillasIntersection", ) -FOV_ANGULAR_DISTANCE_LIMIT = 45 * u.deg +FOV_ANGULAR_DISTANCE_LIMIT_RAD = (45 * u.deg).to_value(u.rad) -def far_outside_fov(fov_lat, fov_lon): +def _far_outside_fov(fov_lat, fov_lon): """ Check if a given latitude or longiude in the FoV is further away from the FoV center than `FOV_ANGULAR_DISTANCE_LIMIT` @@ -244,7 +244,7 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): # Catch events reconstructed at great angular distance from camera center # and retrun INVALID container to prevent SkyCoord error below. - if far_outside_fov(src_fov_lat * u.rad, src_fov_lon * u.rad): + if _far_outside_fov(src_fov_lat, src_fov_lon): return INVALID core_x, core_y, core_err_x, core_err_y = self.reconstruct_tilted( From 29a1033b571fbed878e464cd49517ebcb7d67ce4 Mon Sep 17 00:00:00 2001 From: gschwefer Date: Wed, 8 Mar 2023 16:29:28 +0100 Subject: [PATCH 096/264] Adressed comments: No units and private method --- ctapipe/reco/hillas_intersection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index 8d27af8c9ea..d7288b58576 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -62,8 +62,8 @@ def _far_outside_fov(fov_lat, fov_lon): ------- bool """ - lat_outside_fov = np.abs(fov_lat) > FOV_ANGULAR_DISTANCE_LIMIT - lon_outside_fov = np.abs(fov_lon) > FOV_ANGULAR_DISTANCE_LIMIT + lat_outside_fov = np.abs(fov_lat) > FOV_ANGULAR_DISTANCE_LIMIT_RAD + lon_outside_fov = np.abs(fov_lon) > FOV_ANGULAR_DISTANCE_LIMIT_RAD return lat_outside_fov or lon_outside_fov From 25577091740df0548aeab8b6864d71db99c1d17a Mon Sep 17 00:00:00 2001 From: gschwefer Date: Tue, 14 Mar 2023 11:14:41 +0100 Subject: [PATCH 097/264] Added changelog --- docs/changes/2265.bugfix.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/changes/2265.bugfix.rst diff --git a/docs/changes/2265.bugfix.rst b/docs/changes/2265.bugfix.rst new file mode 100644 index 00000000000..7e637ed4f3e --- /dev/null +++ b/docs/changes/2265.bugfix.rst @@ -0,0 +1,2 @@ +The ```HillasIntersection``` method used to fail when individual events were reconstructed to originate from a FoV offset of more than 90 degrees. +This is now fixed by returning an INVALID container for a reconstructed offset of larger than 45 degrees. \ No newline at end of file From 28789b9e5505ff00c0bbea414d2e35a83d3aeda8 Mon Sep 17 00:00:00 2001 From: TjarkMiener Date: Tue, 5 Sep 2023 11:03:01 +0200 Subject: [PATCH 098/264] added a changelog entry --- docs/changes/2386.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2386.feature.rst diff --git a/docs/changes/2386.feature.rst b/docs/changes/2386.feature.rst new file mode 100644 index 00000000000..eaf9d2f5748 --- /dev/null +++ b/docs/changes/2386.feature.rst @@ -0,0 +1 @@ +Add support for including r1 and r0 waveforms in the ``ctapipe-merge`` tool. From afd1aa29b042001e13008b6035e2313fdb883092 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 4 Apr 2023 11:28:01 +0200 Subject: [PATCH 099/264] Start writing cep2 --- docs/development/ceps/proposed/.keep | 0 docs/development/ceps/proposed/cep-002.rst | 66 ++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 docs/development/ceps/proposed/.keep create mode 100644 docs/development/ceps/proposed/cep-002.rst diff --git a/docs/development/ceps/proposed/.keep b/docs/development/ceps/proposed/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/development/ceps/proposed/cep-002.rst b/docs/development/ceps/proposed/cep-002.rst new file mode 100644 index 00000000000..0991aae8fe7 --- /dev/null +++ b/docs/development/ceps/proposed/cep-002.rst @@ -0,0 +1,66 @@ +.. _cep-002: + + +*********************** +CEP 2 - Event Structure +*********************** + +* Status: draft +* Discussion: NA +* Date accepted: NA +* Last revised: 2023-04-04 +* Author: Maximilian Linhoff +* Created: 2023-04-04 + +Abstract +======== + +Currently, the hierarchy of the ctapipe ``ArrayEvent`` container has the data +levels first and then each data level has a ``Map`` ``tel`` for telescope specific +information in subcontainers. +This CEP proposes to change this structure to have a container ``TelescopeEvent`` +as parent for all telescope-wise information that then contains the data levels. + +Proposed new structure +====================== + +Thhis CEP proposes to change the current layout of ``ArrayEvent`` from having multiple +data levels each with a ``Map`` containing telescope-wise data to a structure +where each ``ArrayEvent`` is composed of one to many ``TelescopeEvents`` containing +all telescope-wise information for all data levels. + +The ``ArrayEvent`` should also be renamed to ``SubarrayEvent``, to match with other naming +patterns in ctapipe, such as the ``SubarrayDescription``, making it clear that the array is split +into multiple subarrays, each observing their own observation block. + +The main structure after the change will look like this: + +.. code-block:: + + SubarrayEvent + - index + - trigger + - simulation + - dl0 + - dl1 + - dl2 + - tel: Map[tel_id -> TelescopeEvent] + + TelescopeEvent + - index + - trigger + - simulation + - r0 + - r1 + - dl0 + - dl1 + - dl2 + +Advantages of the new structure +=============================== + + +Advantages of the old structure +=============================== + +.. _PEP 481: https://www.python.org/dev/peps/pep-0481/ From 706d93f4d43056ff7d3bc3425f212ebb92eae286 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 5 Apr 2023 15:38:51 +0200 Subject: [PATCH 100/264] Add first draft of cep-002 --- docs/developer-guide/ceps/index.rst | 14 ++++---- .../ceps/proposed/cep-002.rst | 33 +++++++++++++++++-- docs/development/ceps/proposed/.keep | 0 3 files changed, 38 insertions(+), 9 deletions(-) rename docs/{development => developer-guide}/ceps/proposed/cep-002.rst (50%) delete mode 100644 docs/development/ceps/proposed/.keep diff --git a/docs/developer-guide/ceps/index.rst b/docs/developer-guide/ceps/index.rst index c448e955f89..505e8fe0004 100644 --- a/docs/developer-guide/ceps/index.rst +++ b/docs/developer-guide/ceps/index.rst @@ -13,18 +13,18 @@ can be found on GitHub as `pull requests with the "CEP" label`_ . Accepted CEPs ============= -.. toctree:: - :maxdepth: 1 - :glob: - accepted/* +.. .. toctree:: +.. :maxdepth: 1 +.. :glob: + +.. accepted/* Proposed CEPs ============= -.. - toctree:: + +.. toctree:: :maxdepth: 1 - :glob: proposed/* diff --git a/docs/development/ceps/proposed/cep-002.rst b/docs/developer-guide/ceps/proposed/cep-002.rst similarity index 50% rename from docs/development/ceps/proposed/cep-002.rst rename to docs/developer-guide/ceps/proposed/cep-002.rst index 0991aae8fe7..3477e071fb1 100644 --- a/docs/development/ceps/proposed/cep-002.rst +++ b/docs/developer-guide/ceps/proposed/cep-002.rst @@ -24,7 +24,7 @@ as parent for all telescope-wise information that then contains the data levels. Proposed new structure ====================== -Thhis CEP proposes to change the current layout of ``ArrayEvent`` from having multiple +This CEP proposes to change the current layout of ``ArrayEvent`` from having multiple data levels each with a ``Map`` containing telescope-wise data to a structure where each ``ArrayEvent`` is composed of one to many ``TelescopeEvents`` containing all telescope-wise information for all data levels. @@ -44,6 +44,7 @@ The main structure after the change will look like this: - dl0 - dl1 - dl2 + - dl3 - tel: Map[tel_id -> TelescopeEvent] TelescopeEvent @@ -55,12 +56,40 @@ The main structure after the change will look like this: - dl0 - dl1 - dl2 + - dl3 + +Which each data level container having subcontainers for specific fields, including monitoring +information (interpolated / chosen for that specific event). + Advantages of the new structure =============================== +The new proposed scheme makes it easier to parallelize over array events and move loops +over telescopes out of code paths that only deal with a single telescope. +E.g. in the ``CameraCalibrator``, ``ImageProcessor`` and more classes, +we currently have to provide the ``ArrayEvent``, +so that higher data levels can be filled from lower data levels, although only one telescope +is processed at a time. + +Using the new structure, these classes could get a single ``TelescopeEvent`` and the loop +could be moved outside those classes to a single place, which then also makes it possible +to distribute over multiple threads without having to add threading to each and every +individual class. + +It also makes writing ``EventSource`` implementations simpler, +as reading data of different telescopes might require opening multiple files (as e.g. foreseen for the CTAO DL0 files). +Each of those files could read the corresponding information into independent ``TelescopeEvent`` instances, that are then joined into single ``SubarrayEvent``. + +Previous discussions +==================== + +Previous discussion of this issue has occurred over multiple issues, +most importantly `Issue 1165`_. + Advantages of the old structure =============================== -.. _PEP 481: https://www.python.org/dev/peps/pep-0481/ +By having the data level first in the hierarchy, it is easier to drop certain data levels for +all telescopes. diff --git a/docs/development/ceps/proposed/.keep b/docs/development/ceps/proposed/.keep deleted file mode 100644 index e69de29bb2d..00000000000 From e2f200aaaba781faa44bc97f4e9b07610c288bc7 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 16 May 2023 14:55:49 +0200 Subject: [PATCH 101/264] Expand cep2 with code-exampls --- .../developer-guide/ceps/proposed/cep-002.rst | 159 ++++++++++++++---- 1 file changed, 129 insertions(+), 30 deletions(-) diff --git a/docs/developer-guide/ceps/proposed/cep-002.rst b/docs/developer-guide/ceps/proposed/cep-002.rst index 3477e071fb1..76c5de0f8ca 100644 --- a/docs/developer-guide/ceps/proposed/cep-002.rst +++ b/docs/developer-guide/ceps/proposed/cep-002.rst @@ -15,50 +15,58 @@ CEP 2 - Event Structure Abstract ======== -Currently, the hierarchy of the ctapipe ``ArrayEvent`` container has the data -levels first and then each data level has a ``Map`` ``tel`` for telescope specific +Currently, the hierarchy of the ctapipe ``ArrayEventContainer`` container has the data +levels first and then each data level has a ``Map`` ``.tel`` for telescope specific information in subcontainers. -This CEP proposes to change this structure to have a container ``TelescopeEvent`` +This CEP proposes to change this structure to have a container ``TelescopeEventContainer`` as parent for all telescope-wise information that then contains the data levels. +This has the following advantages: + +* At lower data levels, many processing steps can be performed independently for each + telescope event, which is easier if all data from a single telescope is in a single container. +* The current proposed ACADA-DPPS ICD fore-sees event and monitoring files per telescope. + This maps nicely to readers filling a ``TelescopeEventContainer`` which are then + joined together with array level information into an ``ArrayEventContainer``. + Proposed new structure ====================== -This CEP proposes to change the current layout of ``ArrayEvent`` from having multiple +This CEP proposes to change the current layout of ``ArrayEventContainer`` from having multiple data levels each with a ``Map`` containing telescope-wise data to a structure -where each ``ArrayEvent`` is composed of one to many ``TelescopeEvents`` containing +where each ``ArrayEventContainer`` is composed of one to many ``TelescopeEvents`` containing all telescope-wise information for all data levels. -The ``ArrayEvent`` should also be renamed to ``SubarrayEvent``, to match with other naming +The ``ArrayEventContainer`` should also be renamed to ``SubarrayEventContainer``, to match with other naming patterns in ctapipe, such as the ``SubarrayDescription``, making it clear that the array is split into multiple subarrays, each observing their own observation block. -The main structure after the change will look like this: +The main structure after the change will look like this (Container-suffix left out for readability): .. code-block:: SubarrayEvent - - index - - trigger - - simulation - - dl0 - - dl1 - - dl2 - - dl3 - - tel: Map[tel_id -> TelescopeEvent] + - index: SubarrayEventIndex + - trigger: SubarrayTrigger + - simulation: SimulatedShower + - dl0: DL0Subarray + - dl1: DL1Subarray + - dl2: DL2Subarray + - dl3: DL3Subarray + - tel: Map[int, TelescopeEvent] # or just a list? TelescopeEvent stores the tel_id TelescopeEvent - - index - - trigger - - simulation - - r0 - - r1 - - dl0 - - dl1 - - dl2 - - dl3 - -Which each data level container having subcontainers for specific fields, including monitoring + - index: TelescopeEventIndex + - trigger: TelescopeTrigger + - simulation: TelescopeSimulation + - r0: R0Telescope + - r1: R1Telescope + - dl0: DL0Telescope + - dl1: DL1Telescope + - dl2: DL2Telescope + - dl3: DL3Telescope + +Which each data level container having specific fields and/or subcontainers including monitoring information (interpolated / chosen for that specific event). @@ -68,24 +76,115 @@ Advantages of the new structure The new proposed scheme makes it easier to parallelize over array events and move loops over telescopes out of code paths that only deal with a single telescope. E.g. in the ``CameraCalibrator``, ``ImageProcessor`` and more classes, -we currently have to provide the ``ArrayEvent``, +we currently have to provide the ``ArrayEventContainer``, so that higher data levels can be filled from lower data levels, although only one telescope is processed at a time. -Using the new structure, these classes could get a single ``TelescopeEvent`` and the loop -could be moved outside those classes to a single place, which then also makes it possible +In the current scheme (simplified from ctapipe-process) it looks like this: + +.. code-block:: python + + for array_event in source: + calibrator(array_event) + image_processor(array_event) + shower_processor(array_event) + +This looks simple, but there are hidden loops over the telescopes in both the ``CameraCalibrator`` +and the ``ImageProcessor`` here, although both of these do not access any subarray-wide data at all. + +Using the new structure, these classes will get a single ``TelescopeEventContainer`` and the loop +can to be moved outside those classes to a single place, which then also makes it possible to distribute over multiple threads without having to add threading to each and every individual class. +.. code-block:: python + + for array_event in source: + for telescope_event in array_event.tel.values(): + calibrator(telescope_event) + image_processor(telescope_event) + + shower_processor(array_event) + +Clearly separating the components working on the telescope level from the ones working on +the subarray level. + +By removing the hidden loops in the telescope level components, it now would also be easy to +parallelize the processing of telescope events: + +.. code-block:: python + + def process_telescope_event(telescope_event): + calibrator(telescope_event) + image_processor(telescope_event) + + with ThreadPool(8) as pool: + for array_event in source: + pool.map(proces_telescope_events, array_event.tel.values()) + shower_processor(array_event) + + It also makes writing ``EventSource`` implementations simpler, as reading data of different telescopes might require opening multiple files (as e.g. foreseen for the CTAO DL0 files). Each of those files could read the corresponding information into independent ``TelescopeEvent`` instances, that are then joined into single ``SubarrayEvent``. +Since ``sim_telarray`` files use the same organization, it might also simplify some code in the ``SimTelEventSource``. + +For code directly accessing information from the array event, this mostly means inverting the order of ``.tel`` and the data level. + +Before: ``event.dl1.tel[1].image``, +After: ``event.tel[1].dl1.image`` + +Before: + +.. code-block:: python + + hillas_dicts = { + tel_id: dl1.parameters.hillas + for tel_id, dl1 in event.dl1.items() + } + +After: + +.. code-block:: python + + hillas_dicts = { + tel_id: tel_event.dl1.parameters.hillas + for tel_id, tel_event in event.tel.items() + } + +Or in our loops, code like this: + +.. code-block:: python + + for tel_id in event.trigger.tels_with_trigger: + dl0 = event.dl0.tel[tel_id] + dl1 = event.dl1.tel[tel_id] + + # do something with dl0 and dl1 + +will become: + +.. code-block:: python + + for telescope_event in event.tel.values(): + dl0 = telescope_event.dl0 + dl1 = telescope_event.dl1 + + # do something with dl0 and dl1 + +which is more idiomatic python and does not require repeated lookup via tel_id. + + Previous discussions ==================== Previous discussion of this issue has occurred over multiple issues, -most importantly `Issue 1165`_. +most importantly `#1165 `_, +but also in `#1301 `_, +and `722 `_. + + Advantages of the old structure From 32f50f04c9ff041e812630fb7525d5dce1ada4fd Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 2 Jun 2023 14:15:58 +0200 Subject: [PATCH 102/264] Add comments showing the hidden loops in the sub-components --- docs/developer-guide/ceps/proposed/cep-002.rst | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/developer-guide/ceps/proposed/cep-002.rst b/docs/developer-guide/ceps/proposed/cep-002.rst index 76c5de0f8ca..56299b871d0 100644 --- a/docs/developer-guide/ceps/proposed/cep-002.rst +++ b/docs/developer-guide/ceps/proposed/cep-002.rst @@ -86,16 +86,24 @@ In the current scheme (simplified from ctapipe-process) it looks like this: for array_event in source: calibrator(array_event) + # calibrator internally has two hidden loops like this: + # for tel_id, r1 in array_event.r1.tel.items(): + # calibrate r1 to dl0 + # for tel_id, dl0 in array_event.dl0.tel.items(): + # calibrate dl0 to dl1 + image_processor(array_event) + # image processor also has an internal loop over the telescope events + # for tel_id, dl1 in array_event.dl1.tel.items(): + # image cleaning and parametrization + shower_processor(array_event) This looks simple, but there are hidden loops over the telescopes in both the ``CameraCalibrator`` and the ``ImageProcessor`` here, although both of these do not access any subarray-wide data at all. Using the new structure, these classes will get a single ``TelescopeEventContainer`` and the loop -can to be moved outside those classes to a single place, which then also makes it possible -to distribute over multiple threads without having to add threading to each and every -individual class. +can to be moved outside those classes to a single place: .. code-block:: python From 3e6588285e60b639fc9dff1c0a9a59084c2b3a26 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 2 Jun 2023 16:37:01 +0200 Subject: [PATCH 103/264] Use map, add quality query in hillas dict example --- docs/developer-guide/ceps/proposed/cep-002.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/developer-guide/ceps/proposed/cep-002.rst b/docs/developer-guide/ceps/proposed/cep-002.rst index 56299b871d0..a3d6108575e 100644 --- a/docs/developer-guide/ceps/proposed/cep-002.rst +++ b/docs/developer-guide/ceps/proposed/cep-002.rst @@ -53,7 +53,7 @@ The main structure after the change will look like this (Container-suffix left o - dl1: DL1Subarray - dl2: DL2Subarray - dl3: DL3Subarray - - tel: Map[int, TelescopeEvent] # or just a list? TelescopeEvent stores the tel_id + - tel: Map[tel_id -> TelescopeEvent] TelescopeEvent - index: TelescopeEventIndex @@ -149,6 +149,7 @@ Before: hillas_dicts = { tel_id: dl1.parameters.hillas for tel_id, dl1 in event.dl1.items() + if all(self.quality_query(parameters=dl1.parameters)) } After: @@ -158,6 +159,7 @@ After: hillas_dicts = { tel_id: tel_event.dl1.parameters.hillas for tel_id, tel_event in event.tel.items() + if all(self.quality_query(parameters=tel_event.dl1.parameters)) } Or in our loops, code like this: From 5e00773bdcdcbfe12c75204aef92e8a2d9bf9976 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 6 Jul 2023 09:54:59 +0200 Subject: [PATCH 104/264] Remove trigger, should be part of DL0 --- docs/developer-guide/ceps/proposed/cep-002.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/developer-guide/ceps/proposed/cep-002.rst b/docs/developer-guide/ceps/proposed/cep-002.rst index a3d6108575e..02121dbc9ad 100644 --- a/docs/developer-guide/ceps/proposed/cep-002.rst +++ b/docs/developer-guide/ceps/proposed/cep-002.rst @@ -47,7 +47,6 @@ The main structure after the change will look like this (Container-suffix left o SubarrayEvent - index: SubarrayEventIndex - - trigger: SubarrayTrigger - simulation: SimulatedShower - dl0: DL0Subarray - dl1: DL1Subarray @@ -57,7 +56,6 @@ The main structure after the change will look like this (Container-suffix left o TelescopeEvent - index: TelescopeEventIndex - - trigger: TelescopeTrigger - simulation: TelescopeSimulation - r0: R0Telescope - r1: R1Telescope From cae8dd33d4431d97b67ce576775b6085ea2a09a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Thu, 6 Jul 2023 09:07:06 +0200 Subject: [PATCH 105/264] convert .ipynb to py and move --- .github/workflows/ci.yml | 2 +- docs/conf.py | 19 + .../examples/InstrumentDescription.ipynb | 374 ------ docs/user-guide/examples/Tools.ipynb | 618 --------- docs/user-guide/examples/array_display.ipynb | 377 ------ docs/user-guide/examples/camera_display.ipynb | 560 -------- docs/user-guide/examples/containers.ipynb | 396 ------ .../examples/convert_images_to_2d.ipynb | 208 --- docs/user-guide/examples/dilate_image.ipynb | 128 -- docs/user-guide/examples/index.rst | 36 - .../examples/nd_interpolation.ipynb | 207 --- docs/user-guide/examples/provenance.ipynb | 199 --- .../examples/table_writer_reader.ipynb | 456 ------- .../calibrated_data_exploration.ipynb | 398 ------ .../tutorials/coordinates_example.ipynb | 649 --------- .../tutorials/ctapipe_handson.ipynb | 678 ---------- .../tutorials/ctapipe_overview.ipynb | 1180 ----------------- docs/user-guide/tutorials/index.rst | 14 - .../tutorials/raw_data_exploration.ipynb | 522 -------- docs/user-guide/tutorials/theta_square.ipynb | 212 --- environment.yml | 1 + examples/examples/algorithms/README.rst | 4 + .../algorithms/convert_images_to_2d.py | 89 ++ examples/examples/algorithms/dilate_image.py | 68 + .../examples/algorithms/nd_interpolation.py | 146 ++ .../examples/core/InstrumentDescription.py | 161 +++ examples/examples/core/README.rst | 4 + examples/examples/core/Tools.py | 357 +++++ examples/examples/core/containers.py | 202 +++ examples/examples/core/provenance.py | 115 ++ examples/examples/core/table_writer_reader.py | 281 ++++ examples/examples/index.rst | 9 + examples/examples/visualization/README.rst | 4 + .../examples/visualization/array_display.py | 225 ++++ .../examples/visualization/camera_display.py | 416 ++++++ examples/tutorials/README.txt | 6 + .../tutorials/calibrated_data_exploration.py | 206 +++ examples/tutorials/coordinates_example.py | 414 ++++++ examples/tutorials/ctapipe_handson.py | 254 ++++ examples/tutorials/ctapipe_overview.py | 675 ++++++++++ examples/tutorials/ground_frame.png | Bin 0 -> 100340 bytes examples/tutorials/raw_data_exploration.py | 303 +++++ examples/tutorials/theta_square.py | 77 ++ examples/tutorials/tilted_ground_frame.png | Bin 0 -> 129772 bytes 44 files changed, 4037 insertions(+), 7213 deletions(-) delete mode 100644 docs/user-guide/examples/InstrumentDescription.ipynb delete mode 100644 docs/user-guide/examples/Tools.ipynb delete mode 100644 docs/user-guide/examples/array_display.ipynb delete mode 100644 docs/user-guide/examples/camera_display.ipynb delete mode 100644 docs/user-guide/examples/containers.ipynb delete mode 100644 docs/user-guide/examples/convert_images_to_2d.ipynb delete mode 100644 docs/user-guide/examples/dilate_image.ipynb delete mode 100644 docs/user-guide/examples/index.rst delete mode 100644 docs/user-guide/examples/nd_interpolation.ipynb delete mode 100644 docs/user-guide/examples/provenance.ipynb delete mode 100644 docs/user-guide/examples/table_writer_reader.ipynb delete mode 100644 docs/user-guide/tutorials/calibrated_data_exploration.ipynb delete mode 100644 docs/user-guide/tutorials/coordinates_example.ipynb delete mode 100644 docs/user-guide/tutorials/ctapipe_handson.ipynb delete mode 100644 docs/user-guide/tutorials/ctapipe_overview.ipynb delete mode 100644 docs/user-guide/tutorials/index.rst delete mode 100644 docs/user-guide/tutorials/raw_data_exploration.ipynb delete mode 100644 docs/user-guide/tutorials/theta_square.ipynb create mode 100644 examples/examples/algorithms/README.rst create mode 100644 examples/examples/algorithms/convert_images_to_2d.py create mode 100644 examples/examples/algorithms/dilate_image.py create mode 100644 examples/examples/algorithms/nd_interpolation.py create mode 100644 examples/examples/core/InstrumentDescription.py create mode 100644 examples/examples/core/README.rst create mode 100644 examples/examples/core/Tools.py create mode 100644 examples/examples/core/containers.py create mode 100644 examples/examples/core/provenance.py create mode 100644 examples/examples/core/table_writer_reader.py create mode 100644 examples/examples/index.rst create mode 100644 examples/examples/visualization/README.rst create mode 100644 examples/examples/visualization/array_display.py create mode 100644 examples/examples/visualization/camera_display.py create mode 100644 examples/tutorials/README.txt create mode 100644 examples/tutorials/calibrated_data_exploration.py create mode 100644 examples/tutorials/coordinates_example.py create mode 100644 examples/tutorials/ctapipe_handson.py create mode 100644 examples/tutorials/ctapipe_overview.py create mode 100644 examples/tutorials/ground_frame.png create mode 100644 examples/tutorials/raw_data_exploration.py create mode 100644 examples/tutorials/theta_square.py create mode 100644 examples/tutorials/tilted_ground_frame.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 248d26a8fac..8c7d0abe22c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -151,7 +151,7 @@ jobs: - name: Install doc dependencies run: | sudo apt update --yes && sudo apt install --yes git build-essential pandoc graphviz ffmpeg - pip install -U pip towncrier + pip install -U pip towncrier sphinx-gallery pip install -e .[docs] pip install ./test_plugin git describe --tags diff --git a/docs/conf.py b/docs/conf.py index 013d575931e..854b46773d6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -55,6 +55,7 @@ "numpydoc", "sphinx_design", "IPython.sphinxext.ipython_console_highlighting", + "sphinx_gallery.gen_gallery", ] @@ -142,6 +143,20 @@ def setup(app): ("py:class", "ctapipe.compat.StrEnum"), ] +# Sphinx gallery config +sphinx_gallery_conf = { + "examples_dirs": [ + "../examples/examples", + "../examples/tutorials", + ], # path to your example scripts + "gallery_dirs": [ + "examples", + "tutorials", + ], # path to where to save gallery generated output + "nested_sections": True, + "copyfile_regex": r"index.rst", +} + # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: @@ -195,6 +210,10 @@ def setup(app): ".DS_Store", "**.ipynb_checkpoints", "changes", + "examples/*/*.ipynb", + "examples/*/*.py", + "tutorials/*.ipynb", + "tutorials/*.py", ] # The name of the Pygments (syntax highlighting) style to use. diff --git a/docs/user-guide/examples/InstrumentDescription.ipynb b/docs/user-guide/examples/InstrumentDescription.ipynb deleted file mode 100644 index 2c3b6bd7ea0..00000000000 --- a/docs/user-guide/examples/InstrumentDescription.ipynb +++ /dev/null @@ -1,374 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Working with Instrumental Descriptions\n", - "\n", - "the instrumental description is loaded by the event source, and consists of a hierarchy of classes in the ctapipe.instrument module, the base of which is the `SubarrayDescription`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.utils.datasets import get_dataset_path\n", - "from ctapipe.io import EventSource\n", - "import numpy as np\n", - "\n", - "filename = get_dataset_path(\"gamma_prod5.simtel.zst\")\n", - "\n", - "with EventSource(filename, max_events=1) as source:\n", - " subarray = source.subarray" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## the SubarrayDescription:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.info()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.to_table()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also get a table of just the `OpticsDescriptions` (`CameraGeometry` is more complex and can't be stored on a single table row, so each one can be converted to a table separately)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.to_table(kind=\"optics\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a sub-array with only SC-type telescopes:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sc_tels = [tel_id for tel_id, tel in subarray.tel.items() if tel.optics.n_mirrors == 2]\n", - "newsub = subarray.select_subarray(sc_tels, name=\"SCTels\")\n", - "newsub.info()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "can also do this by using `Table.group_by`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Explore some of the details of the telescopes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel = subarray.tel[1]\n", - "tel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.optics.mirror_area" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.optics.n_mirror_tiles" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.optics.equivalent_focal_length" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.camera" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.camera.geometry.pix_x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from ctapipe.visualization import CameraDisplay\n", - "\n", - "CameraDisplay(tel.camera.geometry)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(subarray.tel[98].camera.geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot the subarray\n", - "\n", - "We'll make a subarray by telescope type and plot each separately, so they appear in different colors. We also calculate the radius using the mirror area (and exagerate it a bit).\n", - "\n", - "This is just for debugging and info, for any \"real\" use, a `visualization.ArrayDisplay` should be used" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.footprint" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get info about the subarray in general" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.telescope_types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.camera_types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.optics_types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from astropy.coordinates import SkyCoord\n", - "from ctapipe.coordinates import GroundFrame\n", - "\n", - "center = SkyCoord(\"10.0 m\", \"2.0 m\", \"0.0 m\", frame=\"groundframe\")\n", - "coords = subarray.tel_coords # a flat list of coordinates by tel_index\n", - "coords.separation(center)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Telescope IDs vs Indices\n", - "\n", - "Note that `subarray.tel` is a dict mapped by `tel_id` (the indentifying number of a telescope). It is possible to have telescope IDs that do not start at 0, are not contiguouous (e.g. if a subarray is selected). Some functions and properties like `tel_coords` are numpy arrays (not dicts) so they are not mapped to the telescope ID, but rather the *index* within this SubarrayDescription. To convert between the two concepts you can do:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel_ids_to_indices([1, 5, 23])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "or you can get the indexing array directly in numpy or dict form:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel_index_array" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel_index_array[[1, 5, 23]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel_indices[\n", - " 1\n", - "] # this is a dict of tel_id -> tel_index, so we can only do one at once" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ids = subarray.get_tel_ids_for_type(subarray.telescope_types[0])\n", - "ids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "idx = subarray.tel_ids_to_indices(ids)\n", - "idx" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel_coords[idx]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "so, with that method you can quickly get many telescope positions at once (the alternative is to use the dict `positions` which maps `tel_id` to a position on the ground" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.positions[1]" - ] - } - ], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/user-guide/examples/Tools.ipynb b/docs/user-guide/examples/Tools.ipynb deleted file mode 100644 index 02eb2b8f3c1..00000000000 --- a/docs/user-guide/examples/Tools.ipynb +++ /dev/null @@ -1,618 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Creating command-line Tools" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.core import Tool, Component, TelescopeComponent\n", - "from ctapipe.core.traits import (\n", - " Integer,\n", - " Float,\n", - " List,\n", - " Dict,\n", - " Unicode,\n", - " TraitError,\n", - " observe,\n", - " FloatTelescopeParameter,\n", - " Path,\n", - ")\n", - "import logging\n", - "from time import sleep\n", - "from astropy import units as u\n", - "from ctapipe.utils import get_dataset_path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "GAMMA_FILE = get_dataset_path(\"gamma_prod5.simtel.zst\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "see https://github.com/ipython/traitlets/blob/master/examples/myapp.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup:\n", - "\n", - "Create a few `Component`s that we will use later in a `Tool`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class MyComponent(Component):\n", - " \"\"\"A Component that does stuff\"\"\"\n", - "\n", - " value = Integer(default_value=-1, help=\"Value to use\").tag(config=True)\n", - "\n", - " def do_thing(self):\n", - " self.log.debug(\"Did thing\")\n", - "\n", - "\n", - "# in order to have 2 of the same components at once\n", - "class SecondaryMyComponent(MyComponent):\n", - " \"\"\"A second component\"\"\"\n", - "\n", - " pass\n", - "\n", - "\n", - "class AdvancedComponent(Component):\n", - " \"\"\"An advanced technique\"\"\"\n", - "\n", - " value1 = Integer(default_value=-1, help=\"Value to use\").tag(config=True)\n", - " infile = Path(\n", - " help=\"input file name\",\n", - " exists=None, # set to True to require existing, False for requiring non-existing\n", - " directory_ok=False,\n", - " ).tag(config=True)\n", - " outfile = Path(help=\"output file name\", exists=False, directory_ok=False).tag(\n", - " config=True\n", - " )\n", - "\n", - " def __init__(self, config=None, parent=None, **kwargs):\n", - " super().__init__(config=config, parent=parent, **kwargs)\n", - " # components can have sub components, but these must have\n", - " # then parent=self as argument and be assigned as member\n", - " # so the full config can be received later\n", - " self.subcompent = MyComponent(parent=self)\n", - "\n", - " @observe(\"outfile\")\n", - " def on_outfile_changed(self, change):\n", - " self.log.warning(\"Outfile was changed to '{}'\".format(change))\n", - "\n", - "\n", - "class TelescopeWiseComponent(TelescopeComponent):\n", - " \"\"\"a component that contains parameters that are per-telescope configurable\"\"\"\n", - "\n", - " param = FloatTelescopeParameter(\n", - " help=\"Something configurable with telescope patterns\", default_value=5.0\n", - " ).tag(config=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "MyComponent()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "AdvancedComponent(infile=\"test.foo\", outfile=\"out.foo\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`TelescopeComponents` need to have a subarray given to them in order to work (since they need one to turn a `TelescopeParameter` into a concrete list of values for each telescope. Here we will give a dummy one:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.instrument import SubarrayDescription, TelescopeDescription\n", - "\n", - "subarray = SubarrayDescription.read(GAMMA_FILE)\n", - "subarray.info()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "TelescopeWiseComponent(subarray=subarray)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This TelescopeParameters can then be set using a list of patterns like:\n", - "```python\n", - "component.param = [ \n", - " (\"type\", \"LST*\",3.0), \n", - " (\"type\", \"MST*\", 2.0), \n", - " (id, 25, 4.0) \n", - "]\n", - "```\n", - "\n", - "These get translated into per-telescope-id values once the subarray is registered. After that one acccess the per-telescope id values via:\n", - "```python\n", - "component.param.tel[tel_id]\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Now create an executable Tool that contains the Components\n", - "Note that all the components we wish to be configured via the tool must be added to the `classes` attribute." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class MyTool(Tool):\n", - " name = \"mytool\"\n", - " description = \"do some things and stuff\"\n", - " aliases = dict(\n", - " infile=\"AdvancedComponent.infile\",\n", - " outfile=\"AdvancedComponent.outfile\",\n", - " iterations=\"MyTool.iterations\",\n", - " )\n", - "\n", - " # Which classes are registered for configuration\n", - " classes = [\n", - " MyComponent,\n", - " AdvancedComponent,\n", - " SecondaryMyComponent,\n", - " TelescopeWiseComponent,\n", - " ]\n", - "\n", - " # local configuration parameters\n", - " iterations = Integer(5, help=\"Number of times to run\", allow_none=False).tag(\n", - " config=True\n", - " )\n", - "\n", - " def setup(self):\n", - " self.comp = MyComponent(parent=self)\n", - " self.comp2 = SecondaryMyComponent(parent=self)\n", - " self.comp3 = TelescopeWiseComponent(parent=self, subarray=subarray)\n", - " self.advanced = AdvancedComponent(parent=self)\n", - "\n", - " def start(self):\n", - " self.log.info(\"Performing {} iterations...\".format(self.iterations))\n", - " for ii in range(self.iterations):\n", - " self.log.info(\"ITERATION {}\".format(ii))\n", - " self.comp.do_thing()\n", - " self.comp2.do_thing()\n", - " sleep(0.1)\n", - "\n", - " def finish(self):\n", - " self.log.warning(\"Shutting down.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get Help info\n", - "\n", - "The following allows you to print the help info within a Jupyter notebook, but this same inforamtion would be displayed if the user types:\n", - "```\n", - " mytool --help\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool = MyTool()\n", - "tool" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.print_help()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following is equivalant to the user typing `mytool --help-all`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.print_help(classes=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run the tool\n", - "\n", - "here we pass in argv since it is a Notebook, but if argv is not specified it's read from `sys.argv`, so the following is the same as running:\n", - "\n", - "```sh\n", - "mytool --log_level=INFO --infile gamma_test.simtel.gz --iterations=3\n", - "```\n", - "\n", - "As Tools are intended to be exectutables, they are raising `SystemExit` on exit.\n", - "Here, we use them to demonstrate how it would work, so we catch the `SystemExit`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " tool.run(argv=[\"--infile\", str(GAMMA_FILE), \"--outfile\", \"out.csv\"])\n", - "except SystemExit as e:\n", - " assert e.code == 0, f\"Tool returned with error status {e}\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.log_format = \"%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s\"\n", - "\n", - "\n", - "try:\n", - " tool.run(\n", - " argv=[\n", - " \"--log-level\",\n", - " \"INFO\",\n", - " \"--infile\",\n", - " str(GAMMA_FILE),\n", - " \"--outfile\",\n", - " \"out.csv\",\n", - " \"--iterations\",\n", - " \"3\",\n", - " ]\n", - " )\n", - "except SystemExit as e:\n", - " assert e.code == 0, f\"Tool returned with error status {e}\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "here we change the log-level to DEBUG:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " tool.run(\n", - " argv=[\n", - " \"--log-level\",\n", - " \"DEBUG\",\n", - " \"--infile\",\n", - " str(GAMMA_FILE),\n", - " \"--outfile\",\n", - " \"out.csv\",\n", - " ]\n", - " )\n", - "except SystemExit as e:\n", - " assert e.code == 0, f\"Tool returned with error status {e}\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "you can also set parameters directly in the class, rather than using the argument/configfile parser. This is useful if you are calling the Tool from a script rather than the command-line" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.iterations = 1\n", - "tool.log_level = 0\n", - "\n", - "try:\n", - " tool.run([\"--infile\", str(GAMMA_FILE), \"--outfile\", \"out.csv\"])\n", - "except SystemExit as e:\n", - " assert e.code == 0, f\"Tool returned with error status {e}\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "see what happens when a value is set that is not of the correct type:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " tool.iterations = \"badval\"\n", - "except TraitError as E:\n", - " print(\"bad value:\", E)\n", - "except SystemExit as e:\n", - " assert e.code == 0, f\"Tool returned with error status {e}\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Example of what happens when you change a parameter that is being \"observed\" in a class. It's handler is called:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.advanced.outfile = \"Another.txt\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "we see that the handler for `outfile` was called, and it receive a change dict that shows the old and new values." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "create a tool using a config file:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool2 = MyTool()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " tool2.run(argv=[\"--config\", \"Tools.json\"])\n", - "except SystemExit as e:\n", - " assert e.code == 0, f\"Tool returned with error status {e}\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(tool2.advanced.infile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(tool2.config)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool2.is_setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool3 = MyTool()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool3.is_setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool3.initialize(argv=[])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool3.is_setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.setup()\n", - "tool" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.comp2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Getting the configuration of an instance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.get_current_config()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tool.iterations = 12\n", - "tool.get_current_config()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Writing a Sample Config File" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(tool.generate_config_file())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/examples/array_display.ipynb b/docs/user-guide/examples/array_display.ipynb deleted file mode 100644 index 6e7ca08f78e..00000000000 --- a/docs/user-guide/examples/array_display.ipynb +++ /dev/null @@ -1,377 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "fb302dc9-65c4-41b0-b8d3-865c0f7845a7", - "metadata": {}, - "source": [ - "# Array Displays\n", - "\n", - "Like `CameraDisplays`, ctapipe provides a way to display information related to the array on the ground: `ArrayDisplay`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1217a94e-f541-4dfe-8f4f-ec9dd70296fd", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from ctapipe.visualization import ArrayDisplay\n", - "from ctapipe.instrument import SubarrayDescription\n", - "from ctapipe.coordinates import GroundFrame, EastingNorthingFrame\n", - "from ctapipe.containers import HillasParametersContainer\n", - "\n", - "from astropy.coordinates import SkyCoord\n", - "from astropy import units as u\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "plt.rcParams[\"figure.figsize\"] = (8, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c7c6775d-ce49-4d83-a3c6-e7f5ed55abfd", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "tel_ids = list(range(1, 5)) + list(range(5, 20)) # just LSTs + one set of MSTs\n", - "\n", - "subarray = SubarrayDescription.read(\n", - " \"dataset://gamma_20deg_0deg_run1___cta-prod5-lapalma_desert-2158m-LaPalma-dark_100evts.simtel.zst\"\n", - ").select_subarray(tel_ids)" - ] - }, - { - "cell_type": "markdown", - "id": "d3b103fc-6b8c-4233-939a-09c5f5d0e60d", - "metadata": {}, - "source": [ - "An array display is created for example in `subarray.peek()`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a32c4646-9c74-4665-bfaa-81aa1de88dc8", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "subarray.peek()" - ] - }, - { - "cell_type": "markdown", - "id": "a27ed92a-268c-404c-8b96-039a739ea26a", - "metadata": {}, - "source": [ - "However, you can make one manually with a bit more flexibility:" - ] - }, - { - "cell_type": "markdown", - "id": "503dea3f-fff3-4cd2-b938-c0d524a6069c", - "metadata": {}, - "source": [ - "## Constructing an ArrayDisplay" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e27d5c28-dfc7-424b-b511-bcb0a1f35729", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "disp = ArrayDisplay(subarray)" - ] - }, - { - "cell_type": "markdown", - "id": "ea297d1c-4777-4945-81d0-e7807605b742", - "metadata": {}, - "source": [ - "You can specify the Frame you want as long as it is compatible with `GroundFrame`. `EastingNorthingFrame` is probably the most useful. You can also add telescope labels" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "46acf3bd-6cf3-42bb-8a76-163b44d3cc23", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "disp = ArrayDisplay(subarray, frame=EastingNorthingFrame())\n", - "disp.add_labels()" - ] - }, - { - "cell_type": "markdown", - "id": "2925e1f6-eb29-43a7-bda1-c647424e7cf7", - "metadata": {}, - "source": [ - "## Using color to show information \n", - "\n", - "By default the color of the telescope circles correlates to telescope type. However, you can use color to convey other information by setting the `values` attribute, like a trigger pattern" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "141ef1eb-82ca-4e45-a3ae-2b11828c601c", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "plt.set_cmap(\"rainbow\") # the array display will use the current colormap for values\n", - "\n", - "ad = ArrayDisplay(subarray)\n", - "ad.telescopes.set_linewidth(0) # to turn off the telescope borders\n", - "\n", - "trigger_pattern = np.zeros(subarray.n_tels)\n", - "trigger_pattern[\n", - " [\n", - " 1,\n", - " 4,\n", - " 5,\n", - " 6,\n", - " ]\n", - "] = 1\n", - "ad.values = trigger_pattern # display certain telescopes in a color\n", - "ad.add_labels()" - ] - }, - { - "cell_type": "markdown", - "id": "a2c0cec8-46b8-4ea4-b4a5-70d943ed474c", - "metadata": {}, - "source": [ - "or for example, you could use color to represent the telescope distance to the impact point" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8422c9da-df65-44c4-b8bf-da49d95b16fb", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "shower_impact = SkyCoord(200 * u.m, -200 * u.m, 0 * u.m, frame=EastingNorthingFrame())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e9e87e72-d000-4c14-99eb-665849d83e56", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "plt.set_cmap(\"rainbow\") # the array display will use the current colormap for values\n", - "ad = ArrayDisplay(subarray)\n", - "ad.telescopes.set_linewidth(0) # to turn off the telescope borders\n", - "plt.scatter(shower_impact.easting, shower_impact.northing, marker=\"+\", s=200)\n", - "\n", - "distances = np.hypot(\n", - " subarray.tel_coords.cartesian.x - shower_impact.cartesian.x,\n", - " subarray.tel_coords.cartesian.y - shower_impact.cartesian.y,\n", - ")\n", - "ad.values = distances\n", - "plt.colorbar(ad.telescopes, label=\"Distance (m)\")" - ] - }, - { - "cell_type": "markdown", - "id": "359935df-f551-40cf-8432-b191986c8213", - "metadata": {}, - "source": [ - "## Overlaying vectors\n", - "\n", - "For plotting reconstruction quantities, it's useful to overlay vectors on the telescope positions. `ArrayDisplay` provides functions:\n", - "* `set_vector_uv` to set by cartesian coordinates from the center of each telescope\n", - "* `set_vector_rho_phi` to set by polar coorinates from the center of each telescope\n", - "* `set_vector_hillas` to set vectors from a `dict[int,HillasParameters]` mapping tel_id (not index!) to a set of parameters. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "040a0f4c-ffee-4a25-a419-7d90f5f16a6f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "np.random.seed(0)\n", - "phis = np.random.uniform(0, 180.0, size=subarray.n_tels) * u.deg\n", - "rhos = np.ones(subarray.n_tels) * 200 * u.m\n", - "\n", - "\n", - "ad = ArrayDisplay(subarray, frame=EastingNorthingFrame(), tel_scale=2)\n", - "ad.set_vector_rho_phi(rho=rhos, phi=phis)" - ] - }, - { - "cell_type": "markdown", - "id": "980be561-28f6-41e6-94cd-ec19d260fe3b", - "metadata": { - "tags": [] - }, - "source": [ - "## Overlaying Image Axes\n", - "\n", - "For the common use case of plotting image axis on an `ArrayDisplay`, the `set_line_hillas()` method is provided for convenience. The following example shows its use: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cb0b242c-4fc4-48ff-b8f2-2d57b852deea", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "from astropy.coordinates import SkyCoord\n", - "from ctapipe.calib import CameraCalibrator\n", - "from ctapipe.image import ImageProcessor\n", - "from ctapipe.io import EventSource\n", - "from ctapipe.reco import ShowerProcessor\n", - "from ctapipe.utils import get_dataset_path\n", - "from ctapipe.visualization import ArrayDisplay\n", - "from IPython import display\n", - "from matplotlib.animation import FuncAnimation\n", - "\n", - "input_url = \"dataset://gamma_LaPalma_baseline_20Zd_180Az_prod3b_test.simtel.gz\"" - ] - }, - { - "cell_type": "markdown", - "id": "f073a3a5-5db3-43fa-8734-deea0de7b7b4", - "metadata": { - "tags": [] - }, - "source": [ - "First, we define a function to plot the array with overlaid lines for the image axes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b24b2c6b-60fb-4a5c-b433-9be76ab26cee", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def plot_event(event, subarray, ax):\n", - " \"\"\"\n", - " Draw an ArrayDisplay with image axes and the\n", - " true and reconstructed impact position overlaid\n", - " \"\"\"\n", - "\n", - " array_pointing = SkyCoord(\n", - " az=event.pointing.array_azimuth,\n", - " alt=event.pointing.array_altitude,\n", - " frame=\"altaz\",\n", - " )\n", - "\n", - " angle_offset = event.pointing.array_azimuth\n", - " disp = ArrayDisplay(subarray, axes=ax)\n", - "\n", - " hillas_dict = {tid: tel.parameters.hillas for tid, tel in event.dl1.tel.items()}\n", - " core_dict = {tid: tel.parameters.core.psi for tid, tel in event.dl1.tel.items()}\n", - "\n", - " disp.set_line_hillas(\n", - " hillas_dict,\n", - " core_dict,\n", - " 500,\n", - " )\n", - "\n", - " reco_shower = event.dl2.stereo.geometry[\"HillasReconstructor\"]\n", - "\n", - " ax.scatter(\n", - " event.simulation.shower.core_x,\n", - " event.simulation.shower.core_y,\n", - " s=200,\n", - " c=\"k\",\n", - " marker=\"x\",\n", - " label=\"True Impact\",\n", - " )\n", - " ax.scatter(\n", - " reco_shower.core_x,\n", - " reco_shower.core_y,\n", - " s=200,\n", - " c=\"r\",\n", - " marker=\"x\",\n", - " label=\"Estimated Impact\",\n", - " )\n", - "\n", - " ax.legend()" - ] - }, - { - "cell_type": "markdown", - "id": "47c2e70a-f1f3-4922-92e6-12fffe0566a4", - "metadata": {}, - "source": [ - "Now, we can loop through some events and plot them. Here we apply default calibration, image processing, and reconstruction, however it is better to use `ctapipe-process` with a well-defined configuration to do this in reality. Note that some events will not have images bright enough to do parameterization or reconstruction, so they will have no image axis lines or no estimated impact position." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "502fe577-3e8a-4e6d-90f3-8db8fbb57b90", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(5, 3, figsize=(20, 40), constrained_layout=True)\n", - "ax = ax.ravel()\n", - "\n", - "with EventSource(input_url, max_events=15, focal_length_choice=\"EQUIVALENT\") as source:\n", - " calib = CameraCalibrator(subarray=source.subarray)\n", - " process_images = ImageProcessor(subarray=source.subarray)\n", - " process_shower = ShowerProcessor(subarray=source.subarray)\n", - "\n", - " for i, event in enumerate(source):\n", - " calib(event)\n", - " process_images(event)\n", - " process_shower(event)\n", - " plot_event(event, source.subarray, ax=ax[i])" - ] - } - ], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/user-guide/examples/camera_display.ipynb b/docs/user-guide/examples/camera_display.ipynb deleted file mode 100644 index 3d1274ee515..00000000000 --- a/docs/user-guide/examples/camera_display.ipynb +++ /dev/null @@ -1,560 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Displaying Camera Images" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import astropy.coordinates as c\n", - "import astropy.units as u\n", - "import matplotlib.pylab as plt\n", - "import numpy as np\n", - "from ctapipe.coordinates import CameraFrame, EngineeringCameraFrame, TelescopeFrame\n", - "from ctapipe.image import hillas_parameters, tailcuts_clean, toymodel\n", - "from ctapipe.instrument import SubarrayDescription\n", - "from ctapipe.visualization import CameraDisplay" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, let's create a fake Cherenkov image from a given `CameraGeometry` and fill it with some data that we can draw later." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# load an example camera geometry from a simulation file\n", - "subarray = SubarrayDescription.read(\"dataset://gamma_prod5.simtel.zst\")\n", - "geom = subarray.tel[100].camera.geometry\n", - "\n", - "# create a fake camera image to display:\n", - "model = toymodel.Gaussian(\n", - " x=0.2 * u.m,\n", - " y=0.0 * u.m,\n", - " width=0.05 * u.m,\n", - " length=0.15 * u.m,\n", - " psi=\"35d\",\n", - ")\n", - "\n", - "image, sig, bg = model.generate_image(geom, intensity=1500, nsb_level_pe=10)\n", - "mask = tailcuts_clean(geom, image, picture_thresh=15, boundary_thresh=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geom" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Displaying Images\n", - "\n", - "The simplest plot is just to generate a CameraDisplay with an image in its constructor. A figure and axis will be created automatically" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(geom)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also specify the initial `image`, `cmap` and `norm` (colomap and normalization, see below), `title` to use. You can specify `ax` if you want to draw the camera on an existing *matplotlib* `Axes` object (otherwise one is created).\n", - "\n", - "To change other options, or to change options dynamically, you can call the relevant functions of the `CameraDisplay` object that is returned. For example to add a color bar, call `add_colorbar()`, or to change the color scale, modify the `cmap` or `norm` properties directly. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Choosing a coordinate frame\n", - "\n", - "The `CameraGeometry` object contains a `ctapipe.coordinates.Frame` used by `CameraDisplay` to draw the camera in the correct orientation and distance units. The default frame is the `CameraFrame`, which will display the camera in units of *meters* and with an orientation that the top of the camera (when parked) is aligned to the X-axis. To show the camera in another orientation, it's useful to apply a coordinate transform to the `CameraGeometry` before passing it to the `CameraDisplay`. The following `Frames` are supported:\n", - "* `EngineeringCameraFrame` : similar to CameraFrame, but with the top of the camera aligned to the Y axis\n", - "* `TelescopeFrame`: In *degrees* (on the sky) coordinates relative to the telescope Alt/Az pointing position, with the Alt axis pointing upward. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 3, figsize=(15, 4))\n", - "CameraDisplay(geom, image=image, ax=ax[0])\n", - "CameraDisplay(geom.transform_to(EngineeringCameraFrame()), image=image, ax=ax[1])\n", - "CameraDisplay(geom.transform_to(TelescopeFrame()), image=image, ax=ax[2])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note the the name of the Frame appears in the lower-right corner" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the rest of this demo, let's use the `TelescopeFrame`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geom_camframe = geom\n", - "geom = geom_camframe.transform_to(EngineeringCameraFrame())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Changing the color map and scale" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "CameraDisplay supports any [matplotlib color map](https://matplotlib.org/stable/tutorials/colors/colormaps.html)\n", - "It is **highly recommended** to use a *perceptually uniform* map, unless you have a good reason not to." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 3, figsize=(15, 4))\n", - "for ii, cmap in enumerate([\"PuOr_r\", \"rainbow\", \"twilight\"]):\n", - " disp = CameraDisplay(geom, image=image, ax=ax[ii], title=cmap)\n", - " disp.add_colorbar()\n", - " disp.cmap = cmap" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "By default the minimum and maximum of the color bar are set automatically by the data in the image. To choose fixed limits, use:`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 3, figsize=(15, 4))\n", - "for ii, minmax in enumerate([(10, 50), (-10, 10), (1, 100)]):\n", - " disp = CameraDisplay(geom, image=image, ax=ax[ii], title=minmax)\n", - " disp.add_colorbar()\n", - " disp.set_limits_minmax(minmax[0], minmax[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or you can set the maximum limit by percentile of the charge distribution:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 3, figsize=(15, 4))\n", - "for ii, pct in enumerate([30, 50, 90]):\n", - " disp = CameraDisplay(geom, image=image, ax=ax[ii], title=f\"{pct} %\")\n", - " disp.add_colorbar()\n", - " disp.set_limits_percent(pct)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using different normalizations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can choose from several preset normalizations (lin, log, symlog) and also provide a custom normalization, for example a `PowerNorm`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.colors import PowerNorm\n", - "\n", - "fig, axes = plt.subplots(2, 2, figsize=(14, 10))\n", - "norms = [\"lin\", \"log\", \"symlog\", PowerNorm(0.5)]\n", - "\n", - "for norm, ax in zip(norms, axes.flatten()):\n", - " disp = CameraDisplay(geom, image=image, ax=ax)\n", - " disp.norm = norm\n", - " disp.add_colorbar()\n", - " ax.set_title(str(norm))\n", - "\n", - "axes[1, 1].set_title(\"PowerNorm(0.5)\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overlays" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Marking pixels\n", - "\n", - "here we will mark pixels in the image mask. That will change their outline color" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 2, figsize=(10, 4))\n", - "disp = CameraDisplay(\n", - " geom, image=image, cmap=\"gray\", ax=ax[0], title=\"Image mask in green\"\n", - ")\n", - "disp.highlight_pixels(mask, alpha=0.8, linewidth=2, color=\"green\")\n", - "\n", - "disp = CameraDisplay(\n", - " geom, image=image, cmap=\"gray\", ax=ax[1], title=\"Image mask in green (zoom)\"\n", - ")\n", - "disp.highlight_pixels(mask, alpha=1, linewidth=3, color=\"green\")\n", - "\n", - "ax[1].set_ylim(-0.5, 0.5)\n", - "ax[1].set_xlim(-0.5, 0.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Drawing a Hillas-parameter ellipse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For this, we will first compute some Hillas Parameters in the current frame:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "clean_image = image.copy()\n", - "clean_image[~mask] = 0\n", - "hillas = hillas_parameters(geom, clean_image)\n", - "\n", - "plt.figure(figsize=(6, 6))\n", - "disp = CameraDisplay(geom, image=image, cmap=\"gray_r\")\n", - "disp.highlight_pixels(mask, alpha=0.5, color=\"dodgerblue\")\n", - "disp.overlay_moments(hillas, color=\"red\", linewidth=3, with_label=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Drawing a marker at a coordinate\n", - "\n", - "This depends on the coordinate frame of the `CameraGeometry`. Here we will sepcify the coordinate the `EngineerngCameraFrame`, but if you have enough information to do the coordinate transform, you could use `ICRS` coordinates and overlay star positions. `CameraDisplay` will convert the coordinate you pass in to the `Frame` of the display automatically (if sufficient frame attributes are set). \n", - "\n", - "Note that the parameter `keep_old` is False by default, meaning adding a new point will clear the previous ones (useful for animations, but perhaps unexpected for a static plot). Set it to `True` to plot multiple markers." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(6, 6))\n", - "disp = CameraDisplay(geom, image=image, cmap=\"gray_r\")\n", - "\n", - "coord = c.SkyCoord(x=0.5 * u.m, y=0.7 * u.m, frame=geom.frame)\n", - "coord_in_another_frame = c.SkyCoord(x=0.5 * u.m, y=0.7 * u.m, frame=CameraFrame())\n", - "disp.overlay_coordinate(coord, markersize=20, marker=\"*\")\n", - "disp.overlay_coordinate(\n", - " coord_in_another_frame, markersize=20, marker=\"*\", keep_old=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generating an animation\n", - "\n", - "Here we will make an animation of fake events by re-using a single display (much faster than generating a new one each time) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython import display\n", - "from matplotlib.animation import FuncAnimation\n", - "\n", - "subarray = SubarrayDescription.read(\"dataset://gamma_prod5.simtel.zst\")\n", - "geom = subarray.tel[1].camera.geometry\n", - "\n", - "fov = 1.0\n", - "maxwid = 0.05\n", - "maxlen = 0.1\n", - "\n", - "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", - "disp = CameraDisplay(geom, ax=ax) # we only need one display (it can be re-used)\n", - "disp.cmap = \"inferno\"\n", - "disp.add_colorbar(ax=ax)\n", - "\n", - "\n", - "def update(frame):\n", - " \"\"\"this function will be called for each frame of the animation\"\"\"\n", - " x, y = np.random.uniform(-fov, fov, size=2)\n", - " width = np.random.uniform(0.01, maxwid)\n", - " length = np.random.uniform(width, maxlen)\n", - " angle = np.random.uniform(0, 180)\n", - " intens = width * length * (5e4 + 1e5 * np.random.exponential(2))\n", - "\n", - " model = toymodel.Gaussian(\n", - " x=x * u.m,\n", - " y=y * u.m,\n", - " width=width * u.m,\n", - " length=length * u.m,\n", - " psi=angle * u.deg,\n", - " )\n", - " image, _, _ = model.generate_image(\n", - " geom,\n", - " intensity=intens,\n", - " nsb_level_pe=5,\n", - " )\n", - " disp.image = image\n", - "\n", - "\n", - "# Create the animation and convert to a displayable video:\n", - "anim = FuncAnimation(fig, func=update, frames=10, interval=200)\n", - "plt.close(fig) # so it doesn't display here\n", - "video = anim.to_html5_video()\n", - "display.display(display.HTML(video))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using CameraDisplays interactively\n", - "\n", - "`CameraDisplays` can be used interactivly whe displayed in a window, and also when using Jupyter notebooks/lab with appropriate backends. \n", - "\n", - "When this is the case, the same `CameraDisplay` object can be re-used. We can't show this here in the documentation, but creating an animation when in a matplotlib window is quite easy! Try this in an interactive ipython session:\n", - "\n", - "### Running interactive displays in a matplotlib window\n", - "\n", - "```sh\n", - "ipython -i --maplotlib=auto\n", - "```\n", - "\n", - "That will open an ipython session with matplotlib graphics in a separate thread, meaning that you can type code and interact with plots simultaneneously. \n", - "\n", - "In the ipython session try running the following code and you will see an animation (here in the documentation, it will of course be static)\n", - "\n", - "First we load some real data so we have a nice image to view:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "from ctapipe.io import EventSource\n", - "from ctapipe.visualization import CameraDisplay\n", - "import numpy as np\n", - "\n", - "DATA = \"dataset://gamma_20deg_0deg_run1___cta-prod5-lapalma_desert-2158m-LaPalma-dark_100evts.simtel.zst\"\n", - "\n", - "with EventSource(\n", - " DATA,\n", - " max_events=1,\n", - " focal_length_choice=\"EQUIVALENT\",\n", - ") as source:\n", - " event = next(iter(source))\n", - "\n", - "tel_id = list(event.r0.tel.keys())[0]\n", - "geom = source.subarray.tel[tel_id].camera.geometry\n", - "waveform = event.r0.tel[tel_id].waveform\n", - "n_chan, n_pix, n_samp = waveform.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Running the following the will bring up a window and animate the shower image as a function of time. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(geom)\n", - "\n", - "for ii in range(n_samp):\n", - " disp.image = waveform[0, :, ii]\n", - " plt.pause(0.1) # this lets matplotlib re-draw the scene" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output will be similar to the static animation created as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1)\n", - "disp = CameraDisplay(geom, ax=ax)\n", - "disp.add_colorbar()\n", - "disp.autoscale = False\n", - "\n", - "\n", - "def draw_sample(frame):\n", - " ax.set_title(f\"sample: {frame}\")\n", - " disp.set_limits_minmax(200, 400)\n", - " disp.image = waveform[0, :, frame]\n", - "\n", - "\n", - "anim = FuncAnimation(fig, func=draw_sample, frames=n_samp, interval=100)\n", - "plt.close(fig) # so it doesn't display here\n", - "video = anim.to_html5_video()\n", - "display.display(display.HTML(video))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Making it clickable \n", - "\n", - "Also when running in a window, you can enable the `disp.enable_pixel_picker()` option. This will then allow the user to click a pixel and a function will run. By default the function simply prints the pixel and value to stdout, however you can override the function `on_pixel_clicked(pix_id)` to do anything you want by making a subclass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class MyCameraDisplay(CameraDisplay):\n", - " def on_pixel_clicked(self, pix_id):\n", - " print(f\"{pix_id=} has value {self.image[pix_id]:.2f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = MyCameraDisplay(geom, image=image)\n", - "disp.enable_pixel_picker()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "then, when a user clicks a pixel it would print:\n", - "```\n", - "pixel 5 has value 2.44\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/examples/containers.ipynb b/docs/user-guide/examples/containers.ipynb deleted file mode 100644 index 603139f6f41..00000000000 --- a/docs/user-guide/examples/containers.ipynb +++ /dev/null @@ -1,396 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using Container classes\n", - "\n", - "`ctapipe.core.Container` is the base class for all event-wise data classes in ctapipe. It works like a object-relational mapper, in that it defines a set of `Fields` along with their metadata (description, unit, default), which can be later translated automatially into an output table using a `ctapipe.io.TableWriter`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.core import Container, Field, Map\n", - "import numpy as np\n", - "from astropy import units as u\n", - "from functools import partial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's define a few example containers with some dummy fields in them:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class SubContainer(Container):\n", - " junk = Field(-1, \"Some junk\")\n", - " value = Field(0.0, \"some value\", unit=u.deg)\n", - "\n", - "\n", - "class TelContainer(Container):\n", - " # defaults should match the other requirements, e.g. the defaults\n", - " # should have the correct unit. It most often also makes sense to use\n", - " # an invalid value marker like nan for floats or -1 for positive integers\n", - " # as default\n", - " tel_id = Field(-1, \"telescope ID number\")\n", - "\n", - " # For mutable structures like lists, arrays or containers, use a `default_factory` function or class\n", - " # not an instance to assure each container gets a fresh instance and there is no hidden\n", - " # shared state between containers.\n", - " image = Field(default_factory=lambda: np.zeros(10), description=\"camera pixel data\")\n", - "\n", - "\n", - "class EventContainer(Container):\n", - " event_id = Field(-1, \"event id number\")\n", - "\n", - " tels_with_data = Field(\n", - " default_factory=list, description=\"list of telescopes with data\"\n", - " )\n", - " sub = Field(\n", - " default_factory=SubContainer, description=\"stuff\"\n", - " ) # a sub-container in the hierarchy\n", - "\n", - " # A Map is like a defaultdictionary with a specific container type as default.\n", - " # This can be used to e.g. store a container per telescope\n", - " # we use partial here to automatically get a function that creates a map with the correct container type\n", - " # as default\n", - " tel = Field(default_factory=partial(Map, TelContainer), description=\"telescopes\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev = EventContainer()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check that default values are automatically filled in" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(ev.event_id)\n", - "print(ev.sub)\n", - "print(ev.tel)\n", - "print(ev.tel.keys())\n", - "\n", - "# default dict access will create container:\n", - "print(ev.tel[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "print the dict representation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(ev)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also get docstrings \"for free\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "?EventContainer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "?SubContainer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "values can be set as normal for a class:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.event_id = 100\n", - "ev.event_id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.as_dict() # by default only shows the bare items, not sub-containers (See later)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.as_dict(recursive=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and we can add a few of these to the parent container inside the tel dict:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.tel[10] = TelContainer()\n", - "ev.tel[5] = TelContainer()\n", - "ev.tel[42] = TelContainer()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# because we are using a default_factory to handle mutable defaults, the images are actually different:\n", - "ev.tel[42].image is ev.tel[32]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Be careful to use the `default_factory` mechanism for mutable fields, see this **negative** example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class DangerousContainer(Container):\n", - " image = Field(\n", - " np.zeros(10),\n", - " description=\"Attention!!!! Globally mutable shared state. Use default_factory instead\",\n", - " )\n", - "\n", - "\n", - "c1 = DangerousContainer()\n", - "c2 = DangerousContainer()\n", - "\n", - "c1.image[5] = 9999\n", - "\n", - "print(c1.image)\n", - "print(c2.image)\n", - "print(c1.image is c2.image)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.tel" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Converion to dictionaries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.as_dict()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.as_dict(recursive=True, flatten=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "for serialization to a table, we can even flatten the output into a single set of columns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.as_dict(recursive=True, flatten=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setting and clearing values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.tel[5].image[:] = 9\n", - "print(ev)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ev.reset()\n", - "ev.as_dict(recursive=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## look at a pre-defined Container" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.containers import SimulatedShowerContainer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "?SimulatedShowerContainer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "shower = SimulatedShowerContainer()\n", - "shower" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Container prefixes\n", - "\n", - "To store the same container in the same table in a file or give more information, containers support setting\n", - "a custom prefix:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1 = SubContainer(junk=5, value=3, prefix=\"foo\")\n", - "c2 = SubContainer(junk=10, value=9001, prefix=\"bar\")\n", - "\n", - "# create a common dict with data from both containers:\n", - "d = c1.as_dict(add_prefix=True)\n", - "d.update(c2.as_dict(add_prefix=True))\n", - "d" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/examples/convert_images_to_2d.ipynb b/docs/user-guide/examples/convert_images_to_2d.ipynb deleted file mode 100644 index a38e135ab2d..00000000000 --- a/docs/user-guide/examples/convert_images_to_2d.ipynb +++ /dev/null @@ -1,208 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Convert camera images to pixels on a s square grid" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.utils import get_dataset_path\n", - "from ctapipe.visualization import CameraDisplay\n", - "from ctapipe.instrument import SubarrayDescription\n", - "from ctapipe.io import EventSource\n", - "from ctapipe.image.toymodel import Gaussian\n", - "import matplotlib.pyplot as plt\n", - "import astropy.units as u" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# get the subarray from an example file\n", - "subarray = SubarrayDescription.read(\"dataset://gamma_prod5.simtel.zst\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Geometries with square pixels\n", - "\n", - "Define a camera geometry and generate a dummy image:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geom = subarray.tel[40].camera.geometry\n", - "model = Gaussian(\n", - " x=0.05 * u.m,\n", - " y=0.05 * u.m,\n", - " width=0.01 * u.m,\n", - " length=0.05 * u.m,\n", - " psi=\"30d\",\n", - ")\n", - "_, image, _ = model.generate_image(geom, intensity=500, nsb_level_pe=3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(geom, image)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `CameraGeometry` has functions to convert the 1d image arrays to 2d arrays and back to the 1d array:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "image_square = geom.image_to_cartesian_representation(image)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imshow(image_square)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "image_1d = geom.image_from_cartesian_representation(image_square)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(geom, image_1d)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Geometries with hexagonal pixels\n", - "\n", - "Define a camera geometry and generate a dummy image:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geom = subarray.tel[1].camera.geometry\n", - "model = Gaussian(\n", - " x=0.5 * u.m,\n", - " y=0.5 * u.m,\n", - " width=0.1 * u.m,\n", - " length=0.2 * u.m,\n", - " psi=\"30d\",\n", - ")\n", - "_, image, _ = model.generate_image(geom, intensity=5000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(geom, image)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "image_square = geom.image_to_cartesian_representation(image)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conversion into square geometry\n", - "\n", - "Since the resulting array has square pixels, the pixel grid has to be rotated and distorted.\n", - "This is reversible (The `image_from_cartesian_representation` method takes care of this):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imshow(image_square)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "image_1d = geom.image_from_cartesian_representation(image_square)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(geom, image_1d)" - ] - } - ], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/examples/dilate_image.ipynb b/docs/user-guide/examples/dilate_image.ipynb deleted file mode 100644 index e833a07f142..00000000000 --- a/docs/user-guide/examples/dilate_image.ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Basic Image Cleaning and Dilation\n", - "\n", - "Here we create an example shower image, do a tail-cuts (picture/boundary) cleaning, and then dilate the resulting cleaning mask by several neighbor pixels" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from matplotlib import pyplot as plt\n", - "import astropy.units as u" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.instrument import SubarrayDescription\n", - "from ctapipe.visualization import CameraDisplay\n", - "from ctapipe.image import toymodel, tailcuts_clean, dilate\n", - "\n", - "# Load a camera from an example file\n", - "subarray = SubarrayDescription.read(\"dataset://gamma_prod5.simtel.zst\")\n", - "geom = subarray.tel[100].camera.geometry\n", - "\n", - "# Create a fake camera image to display:\n", - "model = toymodel.Gaussian(\n", - " x=0.2 * u.m,\n", - " y=0.0 * u.m,\n", - " width=0.05 * u.m,\n", - " length=0.15 * u.m,\n", - " psi=\"35d\",\n", - ")\n", - "\n", - "image, sig, bg = model.generate_image(geom, intensity=1500, nsb_level_pe=5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Apply the image cleaning:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cleanmask = tailcuts_clean(geom, image, picture_thresh=10, boundary_thresh=5)\n", - "clean = image.copy()\n", - "clean[~cleanmask] = 0.0\n", - "\n", - "disp = CameraDisplay(geom, image=image)\n", - "disp.highlight_pixels(cleanmask, color=\"red\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now dialte the mask a few times:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.image.cleaning import dilate" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def show_dilate(mask, times=1):\n", - " m = mask.copy()\n", - " for ii in range(times):\n", - " m = dilate(geom, m)\n", - " CameraDisplay(\n", - " geom, image=(m.astype(int) + mask.astype(int)), title=\"dilate{}\".format(times)\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(18, 3))\n", - "\n", - "for ii in range(0, 6):\n", - " plt.subplot(1, 7, ii + 1)\n", - " show_dilate(cleanmask.copy(), times=ii)" - ] - } - ], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/user-guide/examples/index.rst b/docs/user-guide/examples/index.rst deleted file mode 100644 index 71eb0c33078..00000000000 --- a/docs/user-guide/examples/index.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _examples: - -======== -Examples -======== - -Some lower-level examples of features of the ctapipe API (see -the Tutorials section for more complete examples) - - -.. toctree:: - :maxdepth: 1 - :caption: Visualization - - camera_display - array_display - - -.. toctree:: - :maxdepth: 1 - :caption: Algorithms - - dilate_image - nd_interpolation - convert_images_to_2d - - -.. toctree:: - :maxdepth: 1 - :caption: Core functionality - - InstrumentDescription - containers - Tools - provenance - table_writer_reader diff --git a/docs/user-guide/examples/nd_interpolation.ipynb b/docs/user-guide/examples/nd_interpolation.ipynb deleted file mode 100644 index f98d71c8cef..00000000000 --- a/docs/user-guide/examples/nd_interpolation.ipynb +++ /dev/null @@ -1,207 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Use N-dimensional Histogram functionality and Interpolation\n", - " \n", - "* could be used for example to read and interpolate an lookup table or IRF.\n", - "* In this example, we load a sample energy reconstruction lookup-table from a FITS file\n", - "* In this case it is only in 2D cube (to keep the file size small): `SIZE` vs `IMPACT-DISTANCE`, however the same method will work for any dimensionality" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pylab as plt\n", - "import numpy as np\n", - "from astropy.io import fits\n", - "from scipy.interpolate import RegularGridInterpolator\n", - "\n", - "from ctapipe.utils.datasets import get_dataset_path\n", - "from ctapipe.utils import Histogram\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### load an example datacube \n", - "(an energy table generated for a\n", - "small subset of HESS simulations) to use as a lookup table. Here\n", - "we will use the `Histogram` class, which automatically loads both\n", - "the data cube and creates arrays for the coordinates of each\n", - "axis." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "testfile = get_dataset_path(\"hess_ct001_energylut.fits.gz\")\n", - "energy_hdu = fits.open(testfile)[\"MEAN\"]\n", - "energy_table = Histogram.from_fits(energy_hdu)\n", - "print(energy_table)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### construct an interpolator that we can use to get values at any point:\n", - "\n", - "Here we will use a `RegularGridInterpolator`, since it is the most appropriate for this type of data, but others are available (see the SciPy documentation)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "centers = [energy_table.bin_centers(ii) for ii in range(energy_table.ndims)]\n", - "energy_lookup = RegularGridInterpolator(\n", - " centers, energy_table.hist, bounds_error=False, fill_value=-100\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`energy_lookup` is now just a continuous function of `log(SIZE)`,\n", - "`DISTANCE` in m. \n", - "\n", - "### Now plot some curves from the interpolator. \n", - "\n", - "Note that the LUT we used is does not have very high statistics,\n", - "so the interpolation starts to be affected by noise at the high\n", - "end. In a real case, we would want to use a table that has been\n", - "sanitized (smoothed and extrapolated)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lsize = np.linspace(1.5, 5.0, 100)\n", - "dists = np.linspace(50, 100, 5)\n", - "\n", - "plt.figure()\n", - "plt.title(\"Variation of energy with size and impact distance\")\n", - "plt.xlabel(\"SIZE (P.E.)\")\n", - "plt.ylabel(\"ENERGY (TeV)\")\n", - "\n", - "for dist in dists:\n", - " plt.plot(\n", - " 10**lsize,\n", - " 10 ** energy_lookup((lsize, dist)),\n", - " \"+-\",\n", - " label=\"DIST={:.1f} m\".format(dist),\n", - " )\n", - "\n", - "plt.legend(loc=\"best\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the interpolator, reinterpolate the lookup table onto an $N \\times N$\n", - "grid (regardless of its original dimensions):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "N = 300\n", - "xmin, xmax = energy_table.bin_centers(0)[0], energy_table.bin_centers(0)[-1]\n", - "ymin, ymax = energy_table.bin_centers(1)[0], energy_table.bin_centers(1)[-1]\n", - "xx, yy = np.linspace(xmin, xmax, N), np.linspace(ymin, ymax, N)\n", - "X, Y = np.meshgrid(xx, yy)\n", - "points = list(zip(X.ravel(), Y.ravel()))\n", - "E = energy_lookup(points).reshape((N, N))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's plot the original table and the new one (E). The color bar shows $\\log_{10}(E)$ in TeV" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(12, 5))\n", - "plt.nipy_spectral()\n", - "\n", - "# the uninterpolated table\n", - "plt.subplot(1, 2, 1)\n", - "plt.xlim(1.5, 5)\n", - "plt.ylim(0, 500)\n", - "plt.xlabel(\"log10(SIZE)\")\n", - "plt.ylabel(\"Impact Dist (m)\")\n", - "plt.pcolormesh(\n", - " energy_table.bin_centers(0), energy_table.bin_centers(1), energy_table.hist.T\n", - ")\n", - "plt.title(\"Raw table, uninterpolated {0}\".format(energy_table.hist.T.shape))\n", - "cb = plt.colorbar()\n", - "cb.set_label(\"$\\log_{10}(E/\\mathrm{TeV})$\")\n", - "\n", - "# the interpolated table\n", - "plt.subplot(1, 2, 2)\n", - "plt.pcolormesh(np.linspace(xmin, xmax, N), np.linspace(ymin, ymax, N), E)\n", - "plt.xlim(1.5, 5)\n", - "plt.ylim(0, 500)\n", - "plt.xlabel(\"log10(SIZE)\")\n", - "plt.ylabel(\"Impact Dist(m)\")\n", - "plt.title(\"Interpolated to a ({0}, {0}) grid\".format(N))\n", - "cb = plt.colorbar()\n", - "cb.set_label(\"$\\log_{10}(E/\\mathrm{TeV})$\")\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the high-stats central region, we get a nice smooth interpolation function. Of course we can see that there are a few more steps to take before using this table:\n", - "* need to deal with cases where the table had low stats near the edges (smooth or extrapolate, or set bounds)\n", - "* may need to smooth the table even where there are sufficient stats, to avoid wiggles" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/user-guide/examples/provenance.ipynb b/docs/user-guide/examples/provenance.ipynb deleted file mode 100644 index 2743eed9261..00000000000 --- a/docs/user-guide/examples/provenance.ipynb +++ /dev/null @@ -1,199 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using the ctapipe Provenance service\n", - "\n", - "The provenance functionality is used automatically when you use most of ctapipe functionality (particularly `ctapipe.core.Tool` and functions in `ctapipe.io` and `ctapipe.utils`), so normally you don't have to work with it directly. It tracks both input and output files, as well as details of the machine and software environment on which a Tool executed. \n", - "\n", - "Here we show some very low-level functions of this system:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.core import Provenance\n", - "from pprint import pprint" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Activities\n", - "\n", - "The basis of Provenance is an *activity*, which is generally an executable or step in a script. Activities can be nested (e.g. with sub-activities), as shown below, but normally this is not required:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = Provenance() # note this is a singleton, so only ever one global provenence object\n", - "p.clear()\n", - "p.start_activity()\n", - "p.add_input_file(\"test.txt\")\n", - "\n", - "p.start_activity(\"sub\")\n", - "p.add_input_file(\"subinput.txt\")\n", - "p.add_input_file(\"anothersubinput.txt\")\n", - "p.add_output_file(\"suboutput.txt\")\n", - "p.finish_activity(\"sub\")\n", - "\n", - "p.start_activity(\"sub2\")\n", - "p.add_input_file(\"sub2input.txt\")\n", - "p.finish_activity(\"sub2\")\n", - "\n", - "p.finish_activity()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p.finished_activity_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Activities have associated input and output *entities* (files or other objects)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[(x[\"activity_name\"], x[\"input\"]) for x in p.provenance]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Activities track when they were started and finished:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[(x[\"activity_name\"], x[\"duration_min\"]) for x in p.provenance]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Full provenance\n", - "\n", - "The provence object is a list of activitites, and for each lots of details are collected:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p.provenance[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This can be better represented in JSON:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(p.as_json(indent=2))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Storing provenance info in output files\n", - "\n", - "* already this can be stored in something like an HDF5 file header, which allows hierarchies.\n", - "* Try to flatted the data so it can be stored in a key=value header in a **FITS file** (using the FITS extended keyword convention to allow >8 character keywords), or as a table " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def flatten_dict(y):\n", - " out = {}\n", - "\n", - " def flatten(x, name=\"\"):\n", - " if type(x) is dict:\n", - " for a in x:\n", - " flatten(x[a], name + a + \".\")\n", - " elif type(x) is list:\n", - " i = 0\n", - " for a in x:\n", - " flatten(a, name + str(i) + \".\")\n", - " i += 1\n", - " else:\n", - " out[name[:-1]] = x\n", - "\n", - " flatten(y)\n", - " return out" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "d = dict(activity=p.provenance)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pprint(flatten_dict(d))" - ] - } - ], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/user-guide/examples/table_writer_reader.ipynb b/docs/user-guide/examples/table_writer_reader.ipynb deleted file mode 100644 index aa27756d0c4..00000000000 --- a/docs/user-guide/examples/table_writer_reader.ipynb +++ /dev/null @@ -1,456 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Writing Containers to a tabular format\n", - "\n", - "The `TableWriter`/`TableReader` sub-classes allow you to write a `ctapipe.core.Container` class and its meta-data to an output table. They treat the `Field`s in the `Container` as columns in the output, and automatically generate a schema. Here we will go through an example of writing out data and reading it back with *Pandas*, *PyTables*, and a `ctapipe.io.TableReader`:\n", - "\n", - "In this example, we will use the `HDF5TableWriter`, which writes to HDF5 datasets using *PyTables*. Currently this is the only implemented TableWriter." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Caveats to think about:\n", - "* vector columns in Containers *can* be written, but some lilbraries like Pandas can not read those (so you must use pytables or astropy to read outputs that have vector columns)\n", - "* units are stored in the table metadata, but some libraries like Pandas ignore them and all other metadata" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create some example Containers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.io import HDF5TableWriter\n", - "from ctapipe.core import Container, Field\n", - "from astropy import units as u\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class VariousTypesContainer(Container):\n", - "\n", - " a_int = Field(int, \"some int value\")\n", - " a_float = Field(float, \"some float value with a unit\", unit=u.m)\n", - " a_bool = Field(bool, \"some bool value\")\n", - " a_np_int = Field(np.int64, \"a numpy int\")\n", - " a_np_float = Field(np.float64, \"a numpy float\")\n", - " a_np_bool = Field(np.bool_, \"np.bool\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "let's also make a dummy stream (generator) that will create a series of these containers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def create_stream(n_event):\n", - "\n", - " data = VariousTypesContainer()\n", - " for i in range(n_event):\n", - "\n", - " data.a_int = int(i)\n", - " data.a_float = float(i) * u.cm # note unit conversion will happen\n", - " data.a_bool = (i % 2) == 0\n", - " data.a_np_int = np.int64(i)\n", - " data.a_np_float = np.float64(i)\n", - " data.a_np_bool = np.bool_((i % 2) == 0)\n", - "\n", - " yield data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for data in create_stream(2):\n", - "\n", - " for key, val in data.items():\n", - "\n", - " print(\"{}: {}, type : {}\".format(key, val, type(val)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Writing the Data (and good practices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always use context managers with IO classes, as they will make sure the underlying resources are properly closed in case of errors:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " with HDF5TableWriter(\"container.h5\", group_name=\"data\") as h5_table:\n", - "\n", - " for data in create_stream(10):\n", - "\n", - " h5_table.write(\"table\", data)\n", - " 0 / 0\n", - "except Exception as err:\n", - " print(\"FAILED:\", err)\n", - "print(\"Done\")\n", - "\n", - "h5_table.h5file.isopen == False" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!ls container.h5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Appending new Containers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To append some new containers we need to set the writing in append mode by using: 'mode=a'. But let's now first look at what happens if we don't." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(2):\n", - "\n", - " with HDF5TableWriter(\n", - " \"container.h5\", mode=\"w\", group_name=\"data_{}\".format(i)\n", - " ) as h5_table:\n", - "\n", - " for data in create_stream(10):\n", - "\n", - " h5_table.write(\"table\", data)\n", - "\n", - " print(h5_table.h5file)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!rm -f container.h5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ok so the writer destroyed the content of the file each time it opens the file. Now let's try to append some data group to it! (using mode='a')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(2):\n", - "\n", - " with HDF5TableWriter(\n", - " \"container.h5\", mode=\"a\", group_name=\"data_{}\".format(i)\n", - " ) as h5_table:\n", - "\n", - " for data in create_stream(10):\n", - "\n", - " h5_table.write(\"table\", data)\n", - "\n", - " print(h5_table.h5file)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we can append some data groups. As long as the data group_name does not already exists. Let's try to overwrite the data group : data_1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " with HDF5TableWriter(\"container.h5\", mode=\"a\", group_name=\"data_1\") as h5_table:\n", - " for data in create_stream(10):\n", - " h5_table.write(\"table\", data)\n", - "except Exception as err:\n", - " print(\"Failed as expected:\", err)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Good ! I cannot overwrite my data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(bool(h5_table.h5file.isopen))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reading the Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading the whole table at once:\n", - "\n", - "For this, you have several choices. Since we used the HDF5TableWriter in this example, we have at least these options avilable:\n", - "\n", - "* Pandas\n", - "* PyTables\n", - "* Astropy Table\n", - "\n", - "For other TableWriter implementations, others may be possible (depending on format)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Reading using `ctapipe.io.read_table`\n", - "\n", - "This is the preferred method, it returns an astropy `Table` and supports keeping track of\n", - "units, metadata and transformations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.io import read_table\n", - "\n", - "\n", - "table = read_table(\"container.h5\", \"/data_0/table\")\n", - "table[:5]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "table.meta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Reading with Pandas:\n", - "\n", - "Pandas is a convenient way to read the output. **HOWEVER BE WARNED** that so far Pandas does not support reading the table *meta-data* or *units* for colums, so that information is lost! " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "data = pd.read_hdf(\"container.h5\", key=\"/data_0/table\")\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Reading with PyTables" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tables\n", - "\n", - "h5 = tables.open_file(\"container.h5\")\n", - "table = h5.root[\"data_0\"][\"table\"]\n", - "table" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "note that here we can still access the metadata" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "table.attrs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading one-row-at-a-time:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Rather than using the full-table methods, if you want to read it row-by-row (e.g. to maintain compatibility with an existing event loop), you can use a `TableReader` instance.\n", - "\n", - "The advantage here is that units and other metadata are retained and re-applied" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.io import HDF5TableReader\n", - "\n", - "\n", - "def read(mode):\n", - "\n", - " print(\"reading mode {}\".format(mode))\n", - "\n", - " with HDF5TableReader(\"container.h5\", mode=mode) as h5_table:\n", - "\n", - " for group_name in [\"data_0/\", \"data_1/\"]:\n", - "\n", - " group_name = \"/{}table\".format(group_name)\n", - " print(group_name)\n", - "\n", - " for data in h5_table.read(group_name, VariousTypesContainer):\n", - "\n", - " print(data.as_dict())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "read(\"r\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "read(\"r+\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "read(\"a\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "read(\"w\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython" - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/tutorials/calibrated_data_exploration.ipynb b/docs/user-guide/tutorials/calibrated_data_exploration.ipynb deleted file mode 100644 index 2966094d860..00000000000 --- a/docs/user-guide/tutorials/calibrated_data_exploration.ipynb +++ /dev/null @@ -1,398 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Explore Calibrated Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ctapipe\n", - "from ctapipe.utils.datasets import get_dataset_path\n", - "from ctapipe.io import EventSource, EventSeeker\n", - "from ctapipe.visualization import CameraDisplay\n", - "from ctapipe.instrument import CameraGeometry\n", - "from matplotlib import pyplot as plt\n", - "from astropy import units as u\n", - "import numpy as np\n", - "\n", - "%matplotlib inline\n", - "plt.style.use(\"ggplot\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(ctapipe.__version__)\n", - "print(ctapipe.__file__)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first open a raw event file and get an event out of it:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "filename = get_dataset_path(\"gamma_prod5.simtel.zst\")\n", - "source = EventSource(filename, max_events=2)\n", - "\n", - "for event in source:\n", - " print(event.index.event_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "filename" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "print(event.r1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Perform basic calibration:\n", - "\n", - "Here we will use a `CameraCalibrator` which is just a simple wrapper that runs the three calibraraton and trace-integration phases of the pipeline, taking the data from levels:\n", - "\n", - " **R0** → **R1** → **DL0** → **DL1**\n", - "\n", - "You could of course do these each separately, by using the classes `R1Calibrator`, `DL0Reducer`, and `DL1Calibrator`.\n", - "Note that we have not specified any configuration to the `CameraCalibrator`, so it will be using the default algorithms and thresholds, other than specifying that the product is a \"HESSIOR1Calibrator\" (hopefully in the near future that will be automatic)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.calib import CameraCalibrator\n", - "\n", - "calib = CameraCalibrator(subarray=source.subarray)\n", - "calib(event)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the *r1*, *dl0* and *dl1* containers are filled in the event\n", - "\n", - "* **r1.tel[x]**: contains the \"r1-calibrated\" waveforms, after gain-selection, pedestal subtraciton, and gain-correction\n", - "* **dl0.tel[x]**: is the same but with optional data volume reduction (some pixels not filled), in this case this is not performed by default, so it is the same as r1\n", - "* **dl1.tel[x]**: contains the (possibly re-calibrated) waveforms as dl0, but also the time-integrated *image* that has been calculated using a `ImageExtractor` (a `NeighborPeakWindowSum` by default)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for tel_id in event.dl1.tel:\n", - " print(\"TEL{:03}: {}\".format(tel_id, source.subarray.tel[tel_id]))\n", - " print(\" - r0 wave shape : {}\".format(event.r0.tel[tel_id].waveform.shape))\n", - " print(\" - r1 wave shape : {}\".format(event.r1.tel[tel_id].waveform.shape))\n", - " print(\" - dl1 image shape : {}\".format(event.dl1.tel[tel_id].image.shape))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Some image processing:\n", - "\n", - "Let's look at the image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.visualization import CameraDisplay\n", - "\n", - "tel_id = sorted(event.r1.tel.keys())[1]\n", - "sub = source.subarray\n", - "geometry = sub.tel[tel_id].camera.geometry\n", - "image = event.dl1.tel[tel_id].image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(geometry, image=image)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.image import tailcuts_clean, hillas_parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mask = tailcuts_clean(\n", - " geometry,\n", - " image,\n", - " picture_thresh=10,\n", - " boundary_thresh=5,\n", - " min_number_picture_neighbors=2,\n", - ")\n", - "cleaned = image.copy()\n", - "cleaned[~mask] = 0\n", - "disp = CameraDisplay(geometry, image=cleaned)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = hillas_parameters(geometry, cleaned)\n", - "print(params)\n", - "params" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = hillas_parameters(geometry, cleaned)\n", - "\n", - "plt.figure(figsize=(10, 10))\n", - "disp = CameraDisplay(geometry, image=image)\n", - "disp.add_colorbar()\n", - "disp.overlay_moments(params, color=\"red\", lw=3)\n", - "disp.highlight_pixels(mask, color=\"white\", alpha=0.3, linewidth=2)\n", - "\n", - "plt.xlim(params.x.to_value(u.m) - 0.5, params.x.to_value(u.m) + 0.5)\n", - "plt.ylim(params.y.to_value(u.m) - 0.5, params.y.to_value(u.m) + 0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source.metadata" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More complex image processing:\n", - "\n", - "Let's now explore how stereo reconstruction works. \n", - "\n", - "### first, look at a summed image from multiple telescopes\n", - "\n", - "For this, we want to use a `CameraDisplay` again, but since we can't sum and display images with different cameras, we'll just sub-select images from a particular camera type\n", - "\n", - "These are the telescopes that are in this event:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tels_in_event = set(\n", - " event.dl1.tel.keys()\n", - ") # use a set here, so we can intersect it later\n", - "tels_in_event" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cam_ids = set(sub.get_tel_ids_for_type(\"MST_MST_NectarCam\"))\n", - "cam_ids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cams_in_event = tels_in_event.intersection(cam_ids)\n", - "first_tel_id = list(cams_in_event)[0]\n", - "tel = sub.tel[first_tel_id]\n", - "print(\"{}s in event: {}\".format(tel, cams_in_event))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's sum those images:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "image_sum = np.zeros_like(\n", - " tel.camera.geometry.pix_x.value\n", - ") # just make an array of 0's in the same shape as the camera\n", - "\n", - "for tel_id in cams_in_event:\n", - " image_sum += event.dl1.tel[tel_id].image" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And finally display the sum of those images" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(8, 8))\n", - "\n", - "disp = CameraDisplay(tel.camera.geometry, image=image_sum)\n", - "disp.overlay_moments(params, with_label=False)\n", - "plt.title(\"Sum of {}x {}\".format(len(cams_in_event), tel))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "let's also show which telescopes those were. Note that currently ArrayDisplay's value field is a vector by `tel_index`, not `tel_id`, so we have to convert to a tel_index. (this may change in a future version to be more user-friendly)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.visualization import ArrayDisplay" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nectarcam_subarray = sub.select_subarray(cam_ids, name=\"NectarCam\")\n", - "\n", - "hit_pattern = np.zeros(shape=nectarcam_subarray.n_tels)\n", - "hit_pattern[[nectarcam_subarray.tel_indices[x] for x in cams_in_event]] = 100\n", - "\n", - "plt.set_cmap(plt.cm.Accent)\n", - "plt.figure(figsize=(8, 8))\n", - "\n", - "ad = ArrayDisplay(nectarcam_subarray)\n", - "ad.values = hit_pattern\n", - "ad.add_labels()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/tutorials/coordinates_example.ipynb b/docs/user-guide/tutorials/coordinates_example.ipynb deleted file mode 100644 index 5fa46d0850d..00000000000 --- a/docs/user-guide/tutorials/coordinates_example.ipynb +++ /dev/null @@ -1,649 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Coordinates usage in ctapipe" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "import astropy.units as u\n", - "import copy\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "from ctapipe.io import EventSource\n", - "from ctapipe.calib import CameraCalibrator\n", - "from ctapipe.utils import get_dataset_path\n", - "\n", - "from ctapipe.visualization import ArrayDisplay\n", - "\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "from astropy.coordinates import SkyCoord, AltAz\n", - "\n", - "from ctapipe.coordinates import (\n", - " GroundFrame,\n", - " TiltedGroundFrame,\n", - " NominalFrame,\n", - " TelescopeFrame,\n", - " CameraFrame,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# make plots and fonts larger\n", - "plt.rcParams[\"figure.figsize\"] = (12, 8)\n", - "plt.rcParams[\"font.size\"] = 16" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Open test dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "filename = get_dataset_path(\"gamma_prod5.simtel.zst\")\n", - "source = EventSource(filename)\n", - "\n", - "events = [copy.deepcopy(event) for event in source]\n", - "event = events[4]\n", - "\n", - "layout = set(source.subarray.tel_ids)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Choose event with LST" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This ensures that the telescope is not \"parked\" (as it would be in an event where it is not triggered) but is actually pointing to a source." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "print(f\"Telescope with data: {event.r1.tel.keys()}\")\n", - "tel_id = 3" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## AltAz\n", - "\n", - "See [Astropy Docs on AltAz](https://docs.astropy.org/en/stable/api/astropy.coordinates.AltAz.html). \n", - "\n", - "Pointing direction of telescopes or the origin of a simulated shower are described in the `AltAz` frame.\n", - "This is a local, angular coordinate frame, with angles `altitude` and `azimuth`.\n", - "Altitude is the measured from the Horizon (0°) to the Zenith (90°).\n", - "For the azimuth, there are different conventions. In Astropy und thus ctapipe, Azimuth is oriented East of North (i.e., N=0°, E=90°)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from astropy.time import Time\n", - "from astropy.coordinates import EarthLocation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "obstime = Time(\"2013-11-01T03:00\")\n", - "location = EarthLocation.of_site(\"Roque de los Muchachos\")\n", - "\n", - "altaz = AltAz(location=location, obstime=obstime)\n", - "\n", - "array_pointing = SkyCoord(\n", - " alt=event.pointing.array_azimuth,\n", - " az=event.pointing.array_altitude,\n", - " frame=altaz,\n", - ")\n", - "\n", - "print(array_pointing)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## CameraFrame\n", - "\n", - "Camera coordinate frame.\n", - "\n", - "The camera frame is a 2d cartesian frame, describing position of objects in the focal plane of the telescope.\n", - "\n", - "The frame is defined as in H.E.S.S., starting at the horizon, the telescope is pointed to magnetic north in azimuth and then up to zenith.\n", - "\n", - "Now, x points north and y points west, so in this orientation, the camera coordinates line up with the CORSIKA ground coordinate system.\n", - "\n", - "MAGIC and FACT use a different camera coordinate system: Standing at the dish, looking at the camera, x points right, y points up.\n", - "To transform MAGIC/FACT to ctapipe, do x' = -y, y' = -x.\n", - "\n", - "**Typical usage**: Position of pixels in the focal plane." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "geometry = source.subarray.tel[tel_id].camera.geometry\n", - "pix_x = geometry.pix_x\n", - "pix_y = geometry.pix_y\n", - "focal_length = source.subarray.tel[tel_id].optics.equivalent_focal_length" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "telescope_pointing = SkyCoord(\n", - " alt=event.pointing.tel[tel_id].altitude,\n", - " az=event.pointing.tel[tel_id].azimuth,\n", - " frame=altaz,\n", - ")\n", - "\n", - "camera_frame = CameraFrame(\n", - " focal_length=focal_length,\n", - " rotation=0 * u.deg,\n", - " telescope_pointing=telescope_pointing,\n", - ")\n", - "\n", - "cam_coords = SkyCoord(x=pix_x, y=pix_y, frame=camera_frame)\n", - "\n", - "print(cam_coords)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "plt.scatter(cam_coords.x, cam_coords.y)\n", - "plt.title(f\"Camera type: {geometry.name}\")\n", - "plt.xlabel(f\"x / {cam_coords.x.unit}\")\n", - "plt.ylabel(f\"y / {cam_coords.y.unit}\")\n", - "plt.axis(\"square\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The implementation of the coordinate system with astropy makes it easier to use time of the observation and location of the observing site, to understand, for example which stars are visible during a certain night and how they might be visible in the camera.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.visualization import CameraDisplay\n", - "from ctapipe.instrument import SubarrayDescription\n", - "\n", - "location = EarthLocation.of_site(\"Roque de los Muchachos\")\n", - "obstime = Time(\"2018-11-01T04:00\")\n", - "\n", - "crab = SkyCoord.from_name(\"crab nebula\")\n", - "\n", - "altaz = AltAz(location=location, obstime=obstime)\n", - "\n", - "pointing = crab.transform_to(altaz)\n", - "\n", - "camera_frame = CameraFrame(\n", - " telescope_pointing=pointing,\n", - " focal_length=focal_length,\n", - " obstime=obstime,\n", - " location=location,\n", - ")\n", - "\n", - "\n", - "subarray = SubarrayDescription.read(\"dataset://gamma_prod5.simtel.zst\")\n", - "cam = subarray.tel[1].camera.geometry\n", - "fig, ax = plt.subplots()\n", - "display = CameraDisplay(cam, ax=ax)\n", - "\n", - "ax.set_title(\n", - " f\"La Palma, {obstime}, az={pointing.az.deg:.1f}°, zenith={pointing.zen.deg:.1f}°, camera={geometry.name}\"\n", - ")\n", - "\n", - "for i, name in enumerate([\"crab nebula\", \"o tau\", \"zet tau\"]):\n", - " star = SkyCoord.from_name(name)\n", - " star_cam = star.transform_to(camera_frame)\n", - "\n", - " x = star_cam.x.to_value(u.m)\n", - " y = star_cam.y.to_value(u.m)\n", - "\n", - " ax.plot(x, y, marker=\"*\", color=f\"C{i}\")\n", - " ax.annotate(\n", - " name,\n", - " xy=(x, y),\n", - " xytext=(5, 5),\n", - " textcoords=\"offset points\",\n", - " color=f\"C{i}\",\n", - " )\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## TelescopeFrame\n", - "\n", - "Telescope coordinate frame.\n", - "A `Frame` using a `UnitSphericalRepresentation`.\n", - "\n", - "This is basically the same as a `HorizonCoordinate`, but the origin is at the telescope's pointing direction.\n", - "This is what astropy calls a `SkyOffsetFrame`.\n", - "\n", - "The axis of the telescope frame, `fov_lon` and `fov_lat`, are aligned with the horizontal system's azimuth and altitude respectively.\n", - " \n", - "Pointing corrections should applied to the transformation between this frame and the camera frame." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "telescope_frame = TelescopeFrame(\n", - " telescope_pointing=pointing,\n", - " obstime=pointing.obstime,\n", - " location=pointing.location,\n", - ")\n", - "telescope_coords = cam_coords.transform_to(telescope_frame)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "wrap_angle = telescope_pointing.az + 180 * u.deg\n", - "\n", - "plt.axis(\"equal\")\n", - "plt.scatter(\n", - " telescope_coords.fov_lon.deg, telescope_coords.fov_lat.deg, alpha=0.2, color=\"gray\"\n", - ")\n", - "\n", - "\n", - "for i, name in enumerate([\"crab nebula\", \"o tau\", \"zet tau\"]):\n", - " star = SkyCoord.from_name(name)\n", - " star_tel = star.transform_to(telescope_frame)\n", - "\n", - " plt.plot(star_tel.fov_lon.deg, star_tel.fov_lat.deg, \"*\", ms=10)\n", - " plt.annotate(\n", - " name,\n", - " xy=(star_tel.fov_lon.deg, star_tel.fov_lat.deg),\n", - " xytext=(5, 5),\n", - " textcoords=\"offset points\",\n", - " color=f\"C{i}\",\n", - " )\n", - "\n", - "plt.xlabel(\"fov_lon / {}\".format(telescope_coords.altaz.az.unit))\n", - "plt.ylabel(\"fov_lat / {}\".format(telescope_coords.altaz.alt.unit))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## NominalFrame\n", - "\n", - "Nominal coordinate frame.\n", - "A Frame using a `UnitSphericalRepresentation`.\n", - "This is basically the same as a `HorizonCoordinate`, but the\n", - "origin is at an arbitray position in the sky.\n", - "This is what astropy calls a `SkyOffsetFrame`\n", - "If the telescopes are in divergent pointing, this `Frame` can be\n", - "used to transform to a common system.\n", - "- 2D reconstruction (`HillasIntersector`) is performed in this frame \n", - "- 3D reconstruction (`HillasReconstructor`) doesn't need this frame" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "Let's play a bit with 3 LSTs with divergent pointing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "location = EarthLocation.of_site(\"Roque de los Muchachos\")\n", - "obstime = Time(\"2018-11-01T02:00\")\n", - "altaz = AltAz(location=location, obstime=obstime)\n", - "\n", - "crab = SkyCoord.from_name(\"crab nebula\")\n", - "\n", - "# let's observe crab\n", - "array_pointing = crab.transform_to(altaz)\n", - "\n", - "\n", - "# let the telescopes point to different positions\n", - "alt_offsets = u.Quantity([1, -1, -1], u.deg)\n", - "az_offsets = u.Quantity([0, -2, +2], u.deg)\n", - "\n", - "\n", - "tel_pointings = SkyCoord(\n", - " alt=array_pointing.alt + alt_offsets,\n", - " az=array_pointing.az + az_offsets,\n", - " frame=altaz,\n", - ")\n", - "\n", - "camera_frames = CameraFrame(\n", - " telescope_pointing=tel_pointings, # multiple pointings, so we get multiple frames\n", - " focal_length=focal_length,\n", - " obstime=obstime,\n", - " location=location,\n", - ")\n", - "\n", - "nom_frame = NominalFrame(origin=array_pointing, obstime=obstime, location=location)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(figsize=(15, 10))\n", - "ax.set_aspect(1)\n", - "\n", - "for i in range(3):\n", - " cam_coord = SkyCoord(x=pix_x, y=pix_y, frame=camera_frames[i])\n", - " nom_coord = cam_coord.transform_to(nom_frame)\n", - "\n", - " ax.scatter(\n", - " x=nom_coord.fov_lon.deg,\n", - " y=nom_coord.fov_lat.deg,\n", - " label=f\"Telescope {i + 1}\",\n", - " s=30,\n", - " alpha=0.15,\n", - " )\n", - "\n", - "\n", - "for i, name in enumerate([\"Crab\", \"o tau\", \"zet tau\"]):\n", - " s = SkyCoord.from_name(name)\n", - " s_nom = s.transform_to(nom_frame)\n", - " ax.plot(\n", - " s_nom.fov_lon.deg,\n", - " s_nom.fov_lat.deg,\n", - " \"*\",\n", - " ms=10,\n", - " )\n", - " ax.annotate(\n", - " name,\n", - " xy=(s_nom.fov_lon.deg, s_nom.fov_lat.deg),\n", - " xytext=(5, 5),\n", - " textcoords=\"offset points\",\n", - " color=f\"C{i}\",\n", - " )\n", - "\n", - "\n", - "ax.set_xlabel(f\"fov_lon / deg\")\n", - "ax.set_ylabel(f\"fov_lat / deg\")\n", - "\n", - "ax.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## GroundFrame\n", - "\n", - "\n", - "Ground coordinate frame. The ground coordinate frame is a simple\n", - " cartesian frame describing the 3 dimensional position of objects\n", - " compared to the array ground level in relation to the nomial\n", - " centre of the array. Typically this frame will be used for\n", - " describing the position on telescopes and equipment\n", - " \n", - "**Typical usage**: positions of telescopes on the ground (x, y, z)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "source.subarray.peek()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "In case a layout is selected, the following line will produce a different output from the picture above." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "source.subarray.select_subarray(layout, name=\"Prod3b layout\").peek()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Ground Frame](ground_frame.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this image all the telescope from the `gamma_test.simtel.gz` file are plotted as spheres in the GroundFrame." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TiltedGroundFrame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tilted ground coordinate frame. \n", - "\n", - "The tilted ground coordinate frame is a cartesian system describing the 2 dimensional projected positions of objects in a tilted plane described by pointing_direction. The plane is rotated along the z_axis by the azimuth of the `pointing_direction` and then it is inclined with an angle equal to the zenith angle of the `pointing_direction`.\n", - "\n", - "This frame is used for the reconstruction of the shower core position." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Tilted Ground Frame](tilted_ground_frame.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This image picture both the telescopes in the GroundFrame (red) and in the TiltedGroundFrame (green) are displayed: in this case since the azimuth of the `pointing_direction` is 0 degrees, then the plane is just tilted according to the zenith angle. \n", - "\n", - "For playing with these and with more 3D models of the telescopes themselves, have a look at the [CREED_VTK](https://github.com/thomasgas/CREED_VTK) library. " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/tutorials/ctapipe_handson.ipynb b/docs/user-guide/tutorials/ctapipe_handson.ipynb deleted file mode 100644 index f3c27873309..00000000000 --- a/docs/user-guide/tutorials/ctapipe_handson.ipynb +++ /dev/null @@ -1,678 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Getting Started with ctapipe\n", - "\n", - "This hands-on was presented at the Paris CTA Consoritum meeting (K. Kosack)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 1: load and loop over data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.io import EventSource\n", - "from ctapipe import utils\n", - "from matplotlib import pyplot as plt\n", - "import numpy as np\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "path = utils.get_dataset_path(\"gamma_prod5.simtel.zst\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source = EventSource(path, max_events=5)\n", - "\n", - "for event in source:\n", - " print(event.count, event.index.event_id, event.simulation.shower.energy)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.r1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for event in EventSource(path, max_events=5):\n", - " print(event.count, event.r1.tel.keys())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.r0.tel[3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "r0tel = event.r0.tel[3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "r0tel.waveform" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "r0tel.waveform.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "note that this is ($N_{channels}$, $N_{pixels}$, $N_{samples}$)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.pcolormesh(r0tel.waveform[0])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "brightest_pixel = np.argmax(r0tel.waveform[0].sum(axis=1))\n", - "print(f\"pixel {brightest_pixel} has sum {r0tel.waveform[0,1535].sum()}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(r0tel.waveform[0, brightest_pixel], label=\"channel 0 (high-gain)\")\n", - "plt.plot(r0tel.waveform[1, brightest_pixel], label=\"channel 1 (low-gain)\")\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ipywidgets import interact\n", - "\n", - "\n", - "@interact\n", - "def view_waveform(chan=0, pix_id=brightest_pixel):\n", - " plt.plot(r0tel.waveform[chan, pix_id])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "try making this compare 2 waveforms" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 2: Explore the instrument description\n", - "This is all well and good, but we don't really know what camera or telescope this is... how do we get instrumental description info?\n", - "\n", - "Currently this is returned *inside* the event (it will soon change to be separate in next version or so)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray = source.subarray" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.to_table()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel[2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel[2].camera" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.tel[2].optics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel = subarray.tel[2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.camera" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "tel.optics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.camera.geometry.pix_x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.camera.geometry.to_table()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tel.optics.mirror_area" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.visualization import CameraDisplay" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(tel.camera.geometry)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(tel.camera.geometry)\n", - "disp.image = r0tel.waveform[\n", - " 0, :, 10\n", - "] # display channel 0, sample 0 (try others like 10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " ** aside: ** show demo using a CameraDisplay in interactive mode in ipython rather than notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 3: Apply some calibration and trace integration" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.calib import CameraCalibrator" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "calib = CameraCalibrator(subarray=subarray)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for event in EventSource(path, max_events=5):\n", - " calib(event) # fills in r1, dl0, and dl1\n", - " print(event.dl1.tel.keys())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.dl1.tel[3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dl1tel = event.dl1.tel[3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dl1tel.peak_time" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(tel.camera.geometry, image=dl1tel.image)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(tel.camera.geometry, image=dl1tel.peak_time)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now for Hillas Parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.image import hillas_parameters, tailcuts_clean" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "image = dl1tel.image\n", - "mask = tailcuts_clean(tel.camera.geometry, image, picture_thresh=10, boundary_thresh=5)\n", - "mask" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "CameraDisplay(tel.camera.geometry, image=mask)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cleaned = image.copy()\n", - "cleaned[~mask] = 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(tel.camera.geometry, image=cleaned)\n", - "disp.cmap = plt.cm.coolwarm\n", - "disp.add_colorbar()\n", - "plt.xlim(0.5, 1.0)\n", - "plt.ylim(-1.0, 0.0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = hillas_parameters(tel.camera.geometry, cleaned)\n", - "print(params)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "disp = CameraDisplay(tel.camera.geometry, image=cleaned)\n", - "disp.cmap = plt.cm.coolwarm\n", - "disp.add_colorbar()\n", - "plt.xlim(0.5, 1.0)\n", - "plt.ylim(-1.0, 0.0)\n", - "disp.overlay_moments(params, color=\"white\", lw=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 4: Let's put it all together: \n", - "- loop over events, selecting only telescopes of the same type (e.g. LST:LSTCam)\n", - "- for each event, apply calibration/trace integration\n", - "- calculate Hillas parameters \n", - "- write out all hillas paremeters to a file that can be loaded with Pandas" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "first let's select only those telescopes with LST:LSTCam" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.telescope_types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "subarray.get_tel_ids_for_type(\"LST_LST_LSTCam\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's write out program" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data = utils.get_dataset_path(\"gamma_prod5.simtel.zst\")\n", - "source = EventSource(data) # remove the max_events limit to get more stats" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for event in source:\n", - " calib(event)\n", - "\n", - " for tel_id, tel_data in event.dl1.tel.items():\n", - " tel = source.subarray.tel[tel_id]\n", - " mask = tailcuts_clean(tel.camera.geometry, tel_data.image)\n", - " if np.count_nonzero(mask) > 0:\n", - " params = hillas_parameters(tel.camera.geometry[mask], tel_data.image[mask])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.io import HDF5TableWriter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with HDF5TableWriter(filename=\"hillas.h5\", group_name=\"dl1\", overwrite=True) as writer:\n", - "\n", - " source = EventSource(data, allowed_tels=[1, 2, 3, 4], max_events=10)\n", - " for event in source:\n", - " calib(event)\n", - "\n", - " for tel_id, tel_data in event.dl1.tel.items():\n", - " tel = source.subarray.tel[tel_id]\n", - " mask = tailcuts_clean(tel.camera.geometry, tel_data.image)\n", - " params = hillas_parameters(tel.camera.geometry[mask], tel_data.image[mask])\n", - " writer.write(\"hillas\", params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### We can now load in the file we created and plot it" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!ls *.h5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "hillas = pd.read_hdf(\"hillas.h5\", key=\"/dl1/hillas\")\n", - "hillas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "_ = hillas.hist(figsize=(8, 8))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you do this yourself, chose a larger file to loop over more events to get better statistics" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/tutorials/ctapipe_overview.ipynb b/docs/user-guide/tutorials/ctapipe_overview.ipynb deleted file mode 100644 index 6ee1bac2b63..00000000000 --- a/docs/user-guide/tutorials/ctapipe_overview.ipynb +++ /dev/null @@ -1,1180 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "# Analyzing Events Using ctapipe" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "

" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [], - "source": [ - "plt.rcParams[\"figure.figsize\"] = (12, 8)\n", - "plt.rcParams[\"font.size\"] = 14\n", - "plt.rcParams[\"figure.figsize\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "

Table of Contents

\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## General Information" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Design\n", - "\n", - "* DL0 → DL3 analysis\n", - "\n", - "* Currently some R0 → DL2 code to be able to analyze simtel files\n", - "\n", - "* ctapipe is built upon the Scientific Python Stack, core dependencies are\n", - " * numpy\n", - " * scipy\n", - " * astropy\n", - " * numba" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Developement\n", - "\n", - "* ctapipe is developed as Open Source Software (BSD 3-Clause License) at \n", - "\n", - "* We use the \"Github-Workflow\": \n", - " * Few people (e.g. @kosack, @maxnoe) have write access to the main repository\n", - " * Contributors fork the main repository and work on branches\n", - " * Pull Requests are merged after Code Review and automatic execution of the test suite\n", - "\n", - "* Early developement stage ⇒ backwards-incompatible API changes might and will happen \n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### What's there?\n", - "\n", - "* Reading simtel simulation files\n", - "* Simple calibration, cleaning and feature extraction functions\n", - "* Camera and Array plotting\n", - "* Coordinate frames and transformations \n", - "* Stereo-reconstruction using line intersections\n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### What's still missing?\n", - "\n", - "* Good integration with machine learning techniques\n", - "* IRF calculation \n", - "* Documentation, e.g. formal definitions of coordinate frames " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### What can you do?\n", - "\n", - "* Report issues\n", - " * Hard to get started? Tell us where you are stuck\n", - " * Tell user stories\n", - " * Missing features\n", - "\n", - "* Start contributing\n", - " * ctapipe needs more workpower\n", - " * Implement new reconstruction features" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {}, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## A simple hillas analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Reading in simtel files" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.io import EventSource\n", - "from ctapipe.utils.datasets import get_dataset_path\n", - "\n", - "input_url = get_dataset_path(\"gamma_prod5.simtel.zst\")\n", - "\n", - "# EventSource() automatically detects what kind of file we are giving it,\n", - "# if already supported by ctapipe\n", - "source = EventSource(input_url, max_events=5)\n", - "\n", - "print(type(source))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "for event in source:\n", - " print(\n", - " \"Id: {}, E = {:1.3f}, Telescopes: {}\".format(\n", - " event.count, event.simulation.shower.energy, len(event.r0.tel)\n", - " )\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "Each event is a `DataContainer` holding several `Field`s of data, which can be containers or just numbers.\n", - "Let's look a one event:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "event" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "source.subarray.camera_types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "len(event.r0.tel), len(event.r1.tel)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Data calibration\n", - "\n", - "The `CameraCalibrator` calibrates the event (obtaining the `dl1` images)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.calib import CameraCalibrator\n", - "\n", - "calibrator = CameraCalibrator(subarray=source.subarray)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "calibrator(event)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Event displays\n", - "\n", - "Let's use ctapipe's plotting facilities to plot the telescope images" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "event.dl1.tel.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "tel_id = 130" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "geometry = source.subarray.tel[tel_id].camera.geometry\n", - "dl1 = event.dl1.tel[tel_id]\n", - "\n", - "geometry, dl1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "dl1.image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.visualization import CameraDisplay\n", - "\n", - "display = CameraDisplay(geometry)\n", - "\n", - "# right now, there might be one image per gain channel.\n", - "# This will change as soon as\n", - "display.image = dl1.image\n", - "display.add_colorbar()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Image Cleaning" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.image.cleaning import tailcuts_clean" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "# unoptimized cleaning levels\n", - "cleaning_level = {\n", - " \"CHEC\": (2, 4, 2),\n", - " \"LSTCam\": (3.5, 7, 2),\n", - " \"FlashCam\": (3.5, 7, 2),\n", - " \"NectarCam\": (4, 8, 2),\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "boundary, picture, min_neighbors = cleaning_level[geometry.name]\n", - "\n", - "clean = tailcuts_clean(\n", - " geometry,\n", - " dl1.image,\n", - " boundary_thresh=boundary,\n", - " picture_thresh=picture,\n", - " min_number_picture_neighbors=min_neighbors,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\n", - "\n", - "d1 = CameraDisplay(geometry, ax=ax1)\n", - "d2 = CameraDisplay(geometry, ax=ax2)\n", - "\n", - "ax1.set_title(\"Image\")\n", - "d1.image = dl1.image\n", - "d1.add_colorbar(ax=ax1)\n", - "\n", - "ax2.set_title(\"Pulse Time\")\n", - "d2.image = dl1.peak_time - np.average(dl1.peak_time, weights=dl1.image)\n", - "d2.cmap = \"RdBu_r\"\n", - "d2.add_colorbar(ax=ax2)\n", - "d2.set_limits_minmax(-20, 20)\n", - "\n", - "d1.highlight_pixels(clean, color=\"red\", linewidth=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Image Parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.image import (\n", - " hillas_parameters,\n", - " leakage_parameters,\n", - " concentration_parameters,\n", - ")\n", - "from ctapipe.image import timing_parameters\n", - "from ctapipe.image import number_of_islands\n", - "from ctapipe.image import camera_to_shower_coordinates" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "hillas = hillas_parameters(geometry[clean], dl1.image[clean])\n", - "\n", - "print(hillas)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "display = CameraDisplay(geometry)\n", - "\n", - "# set \"unclean\" pixels to 0\n", - "cleaned = dl1.image.copy()\n", - "cleaned[~clean] = 0.0\n", - "\n", - "display.image = cleaned\n", - "display.add_colorbar()\n", - "\n", - "display.overlay_moments(hillas, color=\"xkcd:red\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "timing = timing_parameters(geometry, dl1.image, dl1.peak_time, hillas, clean)\n", - "\n", - "print(timing)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "long, trans = camera_to_shower_coordinates(\n", - " geometry.pix_x, geometry.pix_y, hillas.x, hillas.y, hillas.psi\n", - ")\n", - "\n", - "plt.plot(long[clean], dl1.peak_time[clean], \"o\")\n", - "plt.plot(long[clean], timing.slope * long[clean] + timing.intercept)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "l = leakage_parameters(geometry, dl1.image, clean)\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "disp = CameraDisplay(geometry)\n", - "disp.image = dl1.image\n", - "disp.highlight_pixels(geometry.get_border_pixel_mask(1), linewidth=2, color=\"xkcd:red\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "n_islands, island_id = number_of_islands(geometry, clean)\n", - "\n", - "print(n_islands)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "conc = concentration_parameters(geometry, dl1.image, hillas)\n", - "print(conc)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Putting it all together / Stereo reconstruction\n", - "\n", - "\n", - "All these steps are now unified in several components configurable through the config system, mainly:\n", - "\n", - "* CameraCalibrator for DL0 → DL1 (Images)\n", - "* ImageProcessor for DL1 (Images) → DL1 (Parameters)\n", - "* ShowerProcessor for stereo reconstruction of the shower geometry\n", - "* DataWriter for writing data into HDF5\n", - "\n", - "A command line tool doing these steps and writing out data in HDF5 format is available as `ctapipe-process`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {}, - "scrolled": false - }, - "outputs": [], - "source": [ - "import astropy.units as u\n", - "from astropy.coordinates import SkyCoord, AltAz\n", - "\n", - "from ctapipe.containers import ImageParametersContainer\n", - "from ctapipe.io import EventSource\n", - "from ctapipe.utils.datasets import get_dataset_path\n", - "\n", - "from ctapipe.calib import CameraCalibrator\n", - "\n", - "from ctapipe.image import ImageProcessor\n", - "from ctapipe.reco import ShowerProcessor\n", - "\n", - "from ctapipe.io import DataWriter\n", - "\n", - "from copy import deepcopy\n", - "import tempfile\n", - "\n", - "from traitlets.config import Config\n", - "\n", - "\n", - "image_processor_config = Config(\n", - " {\n", - " \"ImageProcessor\": {\n", - " \"image_cleaner_type\": \"TailcutsImageCleaner\",\n", - " \"TailcutsImageCleaner\": {\n", - " \"picture_threshold_pe\": [\n", - " (\"type\", \"LST_LST_LSTCam\", 7.5),\n", - " (\"type\", \"MST_MST_FlashCam\", 8),\n", - " (\"type\", \"MST_MST_NectarCam\", 8),\n", - " (\"type\", \"SST_ASTRI_CHEC\", 7),\n", - " ],\n", - " \"boundary_threshold_pe\": [\n", - " (\"type\", \"LST_LST_LSTCam\", 5),\n", - " (\"type\", \"MST_MST_FlashCam\", 4),\n", - " (\"type\", \"MST_MST_NectarCam\", 4),\n", - " (\"type\", \"SST_ASTRI_CHEC\", 4),\n", - " ],\n", - " },\n", - " }\n", - " }\n", - ")\n", - "\n", - "input_url = get_dataset_path(\"gamma_prod5.simtel.zst\")\n", - "source = EventSource(input_url)\n", - "\n", - "calibrator = CameraCalibrator(subarray=source.subarray)\n", - "image_processor = ImageProcessor(\n", - " subarray=source.subarray, config=image_processor_config\n", - ")\n", - "shower_processor = ShowerProcessor(subarray=source.subarray)\n", - "horizon_frame = AltAz()\n", - "\n", - "f = tempfile.NamedTemporaryFile(suffix=\".hdf5\")\n", - "\n", - "with DataWriter(\n", - " source, output_path=f.name, overwrite=True, write_showers=True\n", - ") as writer:\n", - "\n", - " for event in source:\n", - " energy = event.simulation.shower.energy\n", - " n_telescopes_r1 = len(event.r1.tel)\n", - " event_id = event.index.event_id\n", - " print(f\"Id: {event_id}, E = {energy:1.3f}, Telescopes (R1): {n_telescopes_r1}\")\n", - "\n", - " calibrator(event)\n", - " image_processor(event)\n", - " shower_processor(event)\n", - "\n", - " stereo = event.dl2.stereo.geometry[\"HillasReconstructor\"]\n", - " if stereo.is_valid:\n", - " print(\" Alt: {:.2f}°\".format(stereo.alt.deg))\n", - " print(\" Az: {:.2f}°\".format(stereo.az.deg))\n", - " print(\" Hmax: {:.0f}\".format(stereo.h_max))\n", - " print(\" CoreX: {:.1f}\".format(stereo.core_x))\n", - " print(\" CoreY: {:.1f}\".format(stereo.core_y))\n", - " print(\" Multiplicity: {:d}\".format(len(stereo.telescopes)))\n", - "\n", - " # save a nice event for plotting later\n", - " if event.count == 3:\n", - " plotting_event = deepcopy(event)\n", - "\n", - " writer(event)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from astropy.coordinates.angle_utilities import angular_separation\n", - "import pandas as pd\n", - "\n", - "from ctapipe.io import TableLoader\n", - "\n", - "loader = TableLoader(f.name, load_dl2=True, load_simulated=True)\n", - "\n", - "events = loader.read_subarray_events()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "theta = angular_separation(\n", - " events[\"HillasReconstructor_az\"].quantity,\n", - " events[\"HillasReconstructor_alt\"].quantity,\n", - " events[\"true_az\"].quantity,\n", - " events[\"true_alt\"].quantity,\n", - ")\n", - "\n", - "plt.hist(theta.to_value(u.deg) ** 2, bins=25, range=[0, 0.3])\n", - "plt.xlabel(r\"$\\theta² / deg²$\")\n", - "None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "## ArrayDisplay\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.visualization import ArrayDisplay\n", - "\n", - "\n", - "angle_offset = plotting_event.pointing.array_azimuth\n", - "\n", - "plotting_hillas = {\n", - " tel_id: dl1.parameters.hillas for tel_id, dl1 in plotting_event.dl1.tel.items()\n", - "}\n", - "\n", - "plotting_core = {\n", - " tel_id: dl1.parameters.core.psi for tel_id, dl1 in plotting_event.dl1.tel.items()\n", - "}\n", - "\n", - "\n", - "disp = ArrayDisplay(source.subarray)\n", - "\n", - "disp.set_line_hillas(plotting_hillas, plotting_core, 500)\n", - "\n", - "plt.scatter(\n", - " plotting_event.simulation.shower.core_x,\n", - " plotting_event.simulation.shower.core_y,\n", - " s=200,\n", - " c=\"k\",\n", - " marker=\"x\",\n", - " label=\"True Impact\",\n", - ")\n", - "plt.scatter(\n", - " plotting_event.dl2.stereo.geometry[\"HillasReconstructor\"].core_x,\n", - " plotting_event.dl2.stereo.geometry[\"HillasReconstructor\"].core_y,\n", - " s=200,\n", - " c=\"r\",\n", - " marker=\"x\",\n", - " label=\"Estimated Impact\",\n", - ")\n", - "\n", - "plt.legend()\n", - "# plt.xlim(-400, 400)\n", - "# plt.ylim(-400, 400)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "### Reading the LST dl1 data\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "loader = TableLoader(f.name, load_simulated=True, load_dl1_parameters=True)\n", - "\n", - "dl1_table = loader.read_telescope_events([\"LST_LST_LSTCam\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "plt.scatter(\n", - " np.log10(dl1_table[\"true_energy\"].quantity / u.TeV),\n", - " np.log10(dl1_table[\"hillas_intensity\"]),\n", - ")\n", - "plt.xlabel(\"log10(E / TeV)\")\n", - "plt.ylabel(\"log10(intensity)\")\n", - "None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "## Isn't python slow?\n", - "\n", - "* Many of you might have heard: \"Python is slow\".\n", - "* That's trueish.\n", - "* All python objects are classes living on the heap, even integers.\n", - "* Looping over lots of \"primitives\" is quite slow compared to other languages.\n", - "\n", - "⇒ Vectorize as much as possible using numpy \n", - "⇒ Use existing interfaces to fast C / C++ / Fortran code \n", - "⇒ Optimize using numba \n", - "\n", - "**But: \"Premature Optimization is the root of all evil\" — Donald Knuth**\n", - "\n", - "So profile to find exactly what is slow.\n", - "\n", - "### Why use python then?\n", - "\n", - "* Python works very well as *glue* for libraries of all kinds of languages\n", - "* Python has a rich ecosystem for data science, physics, algorithms, astronomy\n", - "\n", - "### Example: Number of Islands\n", - "\n", - "Find all groups of pixels, that survived the cleaning" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from ctapipe.image import toymodel\n", - "from ctapipe.instrument import SubarrayDescription\n", - "\n", - "\n", - "geometry = loader.subarray.tel[1].camera.geometry" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "Let's create a toy images with several islands;" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "np.random.seed(42)\n", - "\n", - "image = np.zeros(geometry.n_pixels)\n", - "\n", - "\n", - "for i in range(9):\n", - "\n", - " model = toymodel.Gaussian(\n", - " x=np.random.uniform(-0.8, 0.8) * u.m,\n", - " y=np.random.uniform(-0.8, 0.8) * u.m,\n", - " width=np.random.uniform(0.05, 0.075) * u.m,\n", - " length=np.random.uniform(0.1, 0.15) * u.m,\n", - " psi=np.random.uniform(0, 2 * np.pi) * u.rad,\n", - " )\n", - "\n", - " new_image, sig, bg = model.generate_image(\n", - " geometry, intensity=np.random.uniform(1000, 3000), nsb_level_pe=5\n", - " )\n", - " image += new_image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "clean = tailcuts_clean(\n", - " geometry,\n", - " image,\n", - " picture_thresh=10,\n", - " boundary_thresh=5,\n", - " min_number_picture_neighbors=2,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "disp = CameraDisplay(geometry)\n", - "disp.image = image\n", - "disp.highlight_pixels(clean, color=\"xkcd:red\", linewidth=1.5)\n", - "disp.add_colorbar()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "def num_islands_python(camera, clean):\n", - " \"\"\"A breadth first search to find connected islands of neighboring pixels in the cleaning set\"\"\"\n", - "\n", - " # the camera geometry has a [n_pixel, n_pixel] boolean array\n", - " # that is True where two pixels are neighbors\n", - " neighbors = camera.neighbor_matrix\n", - "\n", - " island_ids = np.zeros(camera.n_pixels)\n", - " current_island = 0\n", - "\n", - " # a set to remember which pixels we already visited\n", - " visited = set()\n", - "\n", - " # go only through the pixels, that survived cleaning\n", - " for pix_id in np.where(clean)[0]:\n", - " if pix_id not in visited:\n", - " # remember that we already checked this pixel\n", - " visited.add(pix_id)\n", - "\n", - " # if we land in the outer loop again, we found a new island\n", - " current_island += 1\n", - " island_ids[pix_id] = current_island\n", - "\n", - " # now check all neighbors of the current pixel recursively\n", - " to_check = set(np.where(neighbors[pix_id] & clean)[0])\n", - " while to_check:\n", - " pix_id = to_check.pop()\n", - "\n", - " if pix_id not in visited:\n", - " visited.add(pix_id)\n", - " island_ids[pix_id] = current_island\n", - "\n", - " to_check.update(np.where(neighbors[pix_id] & clean)[0])\n", - "\n", - " n_islands = current_island\n", - " return n_islands, island_ids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "n_islands, island_ids = num_islands_python(geometry, clean)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from matplotlib.colors import ListedColormap\n", - "\n", - "cmap = plt.get_cmap(\"Paired\")\n", - "cmap = ListedColormap(cmap.colors[:n_islands])\n", - "cmap.set_under(\"k\")\n", - "\n", - "disp = CameraDisplay(geometry)\n", - "disp.image = island_ids\n", - "disp.cmap = cmap\n", - "disp.set_limits_minmax(0.5, n_islands + 0.5)\n", - "disp.add_colorbar()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "%timeit num_islands_python(geometry, clean)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "from scipy.sparse.csgraph import connected_components\n", - "\n", - "\n", - "def num_islands_scipy(geometry, clean):\n", - " neighbors = geometry.neighbor_matrix_sparse\n", - "\n", - " clean_neighbors = neighbors[clean][:, clean]\n", - " num_islands, labels = connected_components(clean_neighbors, directed=False)\n", - "\n", - " island_ids = np.zeros(geometry.n_pixels)\n", - " island_ids[clean] = labels + 1\n", - "\n", - " return num_islands, island_ids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "n_islands_s, island_ids_s = num_islands_scipy(geometry, clean)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "disp = CameraDisplay(geometry)\n", - "disp.image = island_ids_s\n", - "disp.cmap = cmap\n", - "disp.set_limits_minmax(0.5, n_islands_s + 0.5)\n", - "disp.add_colorbar()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": {} - }, - "outputs": [], - "source": [ - "%timeit num_islands_scipy(geometry, clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": {} - }, - "source": [ - "**A lot less code, and a factor 3 speed improvement**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, current ctapipe implementation is using numba:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit number_of_islands(geometry, clean)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/tutorials/index.rst b/docs/user-guide/tutorials/index.rst deleted file mode 100644 index bfa4bb78594..00000000000 --- a/docs/user-guide/tutorials/index.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. _tutorials: - -========= -Tutorials -========= - -.. toctree:: - - ctapipe_handson - ctapipe_overview - coordinates_example - raw_data_exploration - calibrated_data_exploration - theta_square diff --git a/docs/user-guide/tutorials/raw_data_exploration.ipynb b/docs/user-guide/tutorials/raw_data_exploration.ipynb deleted file mode 100644 index 1f2a23c978b..00000000000 --- a/docs/user-guide/tutorials/raw_data_exploration.ipynb +++ /dev/null @@ -1,522 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exploring Raw Data\n", - "\n", - "Here are just some very simple examples of going through and inspecting the raw data, and making some plots using `ctapipe`.\n", - "The data explored here are *raw Monte Carlo* data, which is Data Level \"R0\" in CTA terminology (e.g. it is before any processing that would happen inside a Camera or off-line)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Setup:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from ctapipe.utils import get_dataset_path\n", - "from ctapipe.io import EventSource\n", - "from ctapipe.visualization import CameraDisplay\n", - "from ctapipe.instrument import CameraGeometry\n", - "from matplotlib import pyplot as plt\n", - "from astropy import units as u\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To read SimTelArray format data, ctapipe uses the `pyeventio` library (which is installed automatically along with ctapipe). The following lines however will load any data known to ctapipe (multiple `EventSources` are implemented, and chosen automatically based on the type of the input file. \n", - "\n", - "All data access first starts with an `EventSource`, and here we use a helper function `event_source` that constructs one. The resulting `source` object can be iterated over like a list of events. We also here use an `EventSeeker` which provides random-access to the source (by seeking to the given event ID or number)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source = EventSource(get_dataset_path(\"gamma_prod5.simtel.zst\"), max_events=5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Explore the contents of an event\n", - "\n", - "note that the R0 level is the raw data that comes out of a camera, and also the lowest level of monte-carlo data. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# so we can advance through events one-by-one\n", - "event_iterator = iter(source)\n", - "\n", - "event = next(event_iterator)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "the event is just a class with a bunch of data items in it. You can see a more compact represntation via:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.r0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "printing the event structure, will currently print the value all items under it (so you get a lot of output if you print a high-level container):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(event.simulation.shower)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(event.r0.tel.keys())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "note that the event has 3 telescopes in it: Let's try the next one:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event = next(event_iterator)\n", - "print(event.r0.tel.keys())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "now, we have a larger event with many telescopes... Let's look at one of them:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "teldata = event.r0.tel[26]\n", - "print(teldata)\n", - "teldata" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that some values are unit quantities (`astropy.units.Quantity`) or angular quantities (`astropy.coordinates.Angle`), and you can easily maniuplate them:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.simulation.shower.energy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.simulation.shower.energy.to(\"GeV\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.simulation.shower.energy.to(\"J\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "event.simulation.shower.alt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Altitude in degrees:\", event.simulation.shower.alt.deg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Look for signal pixels in a camera\n", - "again, `event.r0.tel[x]` contains a data structure for the telescope data, with some fields like `waveform`.\n", - "\n", - "Let's make a 2D plot of the sample data (sample vs pixel), so we can see if we see which pixels contain Cherenkov light signals:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.pcolormesh(teldata.waveform[0]) # note the [0] is for channel 0\n", - "plt.colorbar()\n", - "plt.xlabel(\"sample number\")\n", - "plt.ylabel(\"Pixel_id\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's zoom in to see if we can identify the pixels that have the Cherenkov signal in them" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.pcolormesh(teldata.waveform[0])\n", - "plt.colorbar()\n", - "plt.ylim(700, 750)\n", - "plt.xlabel(\"sample number\")\n", - "plt.ylabel(\"pixel_id\")\n", - "print(\"waveform[0] is an array of shape (N_pix,N_slice) =\", teldata.waveform[0].shape)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can really see that some pixels have a signal in them!\n", - "\n", - "Lets look at a 1D plot of pixel 270 in channel 0 and see the signal:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trace = teldata.waveform[0][719]\n", - "plt.plot(trace, drawstyle=\"steps\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! It looks like a *standard Cherenkov signal*!\n", - "\n", - "Let's take a look at several traces to see if the peaks area aligned:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for pix_id in range(718, 723):\n", - " plt.plot(\n", - " teldata.waveform[0][pix_id], label=\"pix {}\".format(pix_id), drawstyle=\"steps\"\n", - " )\n", - "plt.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Look at the time trace from a Camera Pixel\n", - "\n", - "`ctapipe.calib.camera` includes classes for doing automatic trace integration with many methods, but before using that, let's just try to do something simple!\n", - "\n", - "Let's define the integration windows first:\n", - "By eye, they seem to be reaonsable from sample 8 to 13 for signal, and 20 to 29 for pedestal (which we define as the sum of all noise: NSB + electronic)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for pix_id in range(718, 723):\n", - " plt.plot(teldata.waveform[0][pix_id], \"+-\")\n", - "plt.fill_betweenx([0, 1600], 19, 24, color=\"red\", alpha=0.3, label=\"Ped window\")\n", - "plt.fill_betweenx([0, 1600], 5, 9, color=\"green\", alpha=0.3, label=\"Signal window\")\n", - "plt.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Do a very simplisitic trace analysis \n", - "Now, let's for example calculate a signal and background in a the fixed windows we defined for this single event. Note we are ignoring the fact that cameras have 2 gains, and just using a single gain (channel 0, which is the high-gain channel):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data = teldata.waveform[0]\n", - "peds = data[:, 19:24].mean(axis=1) # mean of samples 20 to 29 for all pixels\n", - "sums = data[:, 5:9].sum(axis=1) / (13 - 8) # simple sum integration" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "phist = plt.hist(peds, bins=50, range=[0, 150])\n", - "plt.title(\"Pedestal Distribution of all pixels for a single event\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "let's now take a look at the pedestal-subtracted sums and a pedestal-subtracted signal:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(sums - peds)\n", - "plt.xlabel(\"pixel id\")\n", - "plt.ylabel(\"Pedestal-subtracted Signal\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we can clearly see that the signal is centered at 0 where there is no Cherenkov light, and we can also clearly see the shower around pixel 250." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# we can also subtract the pedestals from the traces themselves, which would be needed to compare peaks properly\n", - "for ii in range(270, 280):\n", - " plt.plot(data[ii] - peds[ii], drawstyle=\"steps\", label=\"pix{}\".format(ii))\n", - "plt.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Camera Displays\n", - "\n", - "It's of course much easier to see the signal if we plot it in 2D with correct pixel positions! \n", - "\n", - ">note: the instrument data model is not fully implemented, so there is not a good way to load all the camera information (right now it is hacked into the `inst` sub-container that is read from the Monte-Carlo file)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "camgeom = source.subarray.tel[24].camera.geometry" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "title = \"CT24, run {} event {} ped-sub\".format(event.index.obs_id, event.index.event_id)\n", - "disp = CameraDisplay(camgeom, title=title)\n", - "disp.image = sums - peds\n", - "disp.cmap = plt.cm.RdBu_r\n", - "disp.add_colorbar()\n", - "disp.set_limits_percent(95) # autoscale" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It looks like a nice signal! We have plotted our pedestal-subtracted trace integral, and see the shower clearly!\n", - "\n", - "Let's look at all telescopes:\n", - "\n", - "> note we plot here the raw signal, since we have not calculated the pedestals for each)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "for tel in event.r0.tel.keys():\n", - " plt.figure()\n", - " camgeom = source.subarray.tel[tel].camera.geometry\n", - " title = \"CT{}, run {} event {}\".format(\n", - " tel, event.index.obs_id, event.index.event_id\n", - " )\n", - " disp = CameraDisplay(camgeom, title=title)\n", - " disp.image = event.r0.tel[tel].waveform[0].sum(axis=1)\n", - " disp.cmap = plt.cm.RdBu_r\n", - " disp.add_colorbar()\n", - " disp.set_limits_percent(95)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## some signal processing...\n", - "\n", - "Let's try to detect the peak using the scipy.signal package:\n", - "https://docs.scipy.org/doc/scipy/reference/signal.html" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from scipy import signal\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pix_ids = np.arange(len(data))\n", - "has_signal = sums > 300\n", - "\n", - "widths = np.array(\n", - " [\n", - " 8,\n", - " ]\n", - ") # peak widths to search for (let's fix it at 8 samples, about the width of the peak)\n", - "peaks = [signal.find_peaks_cwt(trace, widths) for trace in data[has_signal]]\n", - "\n", - "for p, s in zip(pix_ids[has_signal], peaks):\n", - " print(\"pix{} has peaks at sample {}\".format(p, s))\n", - " plt.plot(data[p], drawstyle=\"steps-mid\")\n", - " plt.scatter(np.array(s), data[p, s])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "clearly the signal needs to be filtered first, or an appropriate wavelet used, but the idea is nice" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/user-guide/tutorials/theta_square.ipynb b/docs/user-guide/tutorials/theta_square.ipynb deleted file mode 100644 index 6e2c7652f33..00000000000 --- a/docs/user-guide/tutorials/theta_square.ipynb +++ /dev/null @@ -1,212 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Make a theta-square plot\n", - "\n", - "This is a basic example to analyze some events and make a $\\Theta^2$ plot" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:35.515499Z", - "start_time": "2018-06-15T12:49:34.968051Z" - } - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:37.807612Z", - "start_time": "2018-06-15T12:49:35.520552Z" - } - }, - "outputs": [], - "source": [ - "from astropy import units as u\n", - "from astropy.coordinates.angle_utilities import angular_separation\n", - "from astropy.coordinates import SkyCoord, AltAz\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "from ctapipe.io import EventSource\n", - "\n", - "from ctapipe.calib import CameraCalibrator\n", - "from ctapipe.image import ImageProcessor\n", - "from ctapipe.reco import ShowerProcessor\n", - "\n", - "from tqdm.auto import tqdm" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:37.887391Z", - "start_time": "2018-06-15T12:49:37.818824Z" - } - }, - "source": [ - "Get source events in MC dataset. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:37.887391Z", - "start_time": "2018-06-15T12:49:37.818824Z" - } - }, - "outputs": [], - "source": [ - "source = EventSource(\n", - " \"dataset://gamma_prod5.simtel.zst\",\n", - " # allowed_tels={1, 2, 3, 4},\n", - ")\n", - "\n", - "subarray = source.subarray\n", - "\n", - "calib = CameraCalibrator(subarray=subarray)\n", - "image_processor = ImageProcessor(subarray=subarray)\n", - "shower_processor = ShowerProcessor(subarray=subarray)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:47.500199Z", - "start_time": "2018-06-15T12:49:37.893169Z" - } - }, - "outputs": [], - "source": [ - "off_angles = []\n", - "\n", - "for event in tqdm(source):\n", - "\n", - " # calibrating the event\n", - " calib(event)\n", - " image_processor(event)\n", - " shower_processor(event)\n", - "\n", - " reco_result = event.dl2.stereo.geometry[\"HillasReconstructor\"]\n", - "\n", - " # get angular offset between reconstructed shower direction and MC\n", - " # generated shower direction\n", - " true_shower = event.simulation.shower\n", - " off_angle = angular_separation(\n", - " true_shower.az, true_shower.alt, reco_result.az, reco_result.alt\n", - " )\n", - "\n", - " # Appending all estimated off angles\n", - " off_angles.append(off_angle.to(u.deg).value)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:47.507369Z", - "start_time": "2018-06-15T12:49:47.502642Z" - } - }, - "source": [ - "calculate theta square for angles which are not nan" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:47.507369Z", - "start_time": "2018-06-15T12:49:47.502642Z" - } - }, - "outputs": [], - "source": [ - "off_angles = np.array(off_angles)\n", - "thetasquare = off_angles[np.isfinite(off_angles)] ** 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:48.264122Z", - "start_time": "2018-06-15T12:49:47.511172Z" - } - }, - "source": [ - "## Plot the results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2018-06-15T12:49:48.264122Z", - "start_time": "2018-06-15T12:49:47.511172Z" - } - }, - "outputs": [], - "source": [ - "plt.hist(thetasquare, bins=10, range=[0, 0.4])\n", - "plt.xlabel(r\"$\\theta^2$ (deg)\")\n", - "plt.ylabel(\"# of events\")\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - }, - "toc": { - "nav_menu": { - "height": "13px", - "width": "253px" - }, - "number_sections": false, - "sideBar": true, - "skip_h1_title": false, - "toc_cell": false, - "toc_position": {}, - "toc_section_display": "block", - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/environment.yml b/environment.yml index e0951f7fec1..11268bb1543 100644 --- a/environment.yml +++ b/environment.yml @@ -34,6 +34,7 @@ dependencies: - scipy - setuptools - sphinx + - sphinx-gallery - sphinx-automodapi - pydata-sphinx-theme - sphinx-design diff --git a/examples/examples/algorithms/README.rst b/examples/examples/algorithms/README.rst new file mode 100644 index 00000000000..4ddc214f0d3 --- /dev/null +++ b/examples/examples/algorithms/README.rst @@ -0,0 +1,4 @@ +Algorithms +========== + +.. _algorithms-examples-gallery: diff --git a/examples/examples/algorithms/convert_images_to_2d.py b/examples/examples/algorithms/convert_images_to_2d.py new file mode 100644 index 00000000000..4817580d1b1 --- /dev/null +++ b/examples/examples/algorithms/convert_images_to_2d.py @@ -0,0 +1,89 @@ +""" +Convert camera images to pixels on a s square grid +================================================== + +""" + +import astropy.units as u +import matplotlib.pyplot as plt + +from ctapipe.image.toymodel import Gaussian +from ctapipe.instrument import SubarrayDescription +from ctapipe.io import EventSource +from ctapipe.utils import get_dataset_path +from ctapipe.visualization import CameraDisplay + +# get the subarray from an example file +subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") + + +###################################################################### +# Geometries with square pixels +# ----------------------------- +# +# Define a camera geometry and generate a dummy image: +# + +geom = subarray.tel[40].camera.geometry +model = Gaussian( + x=0.05 * u.m, + y=0.05 * u.m, + width=0.01 * u.m, + length=0.05 * u.m, + psi="30d", +) +_, image, _ = model.generate_image(geom, intensity=500, nsb_level_pe=3) + +CameraDisplay(geom, image) + + +###################################################################### +# The ``CameraGeometry`` has functions to convert the 1d image arrays to +# 2d arrays and back to the 1d array: +# + +image_square = geom.image_to_cartesian_representation(image) + +plt.imshow(image_square) + +image_1d = geom.image_from_cartesian_representation(image_square) + +CameraDisplay(geom, image_1d) + + +###################################################################### +# Geometries with hexagonal pixels +# -------------------------------- +# +# Define a camera geometry and generate a dummy image: +# + +geom = subarray.tel[1].camera.geometry +model = Gaussian( + x=0.5 * u.m, + y=0.5 * u.m, + width=0.1 * u.m, + length=0.2 * u.m, + psi="30d", +) +_, image, _ = model.generate_image(geom, intensity=5000) + +CameraDisplay(geom, image) + +image_square = geom.image_to_cartesian_representation(image) + + +###################################################################### +# Conversion into square geometry +# ------------------------------- +# +# Since the resulting array has square pixels, the pixel grid has to be +# rotated and distorted. This is reversible (The +# ``image_from_cartesian_representation`` method takes care of this): +# + +plt.imshow(image_square) + +image_1d = geom.image_from_cartesian_representation(image_square) + +disp = CameraDisplay(geom, image_1d) diff --git a/examples/examples/algorithms/dilate_image.py b/examples/examples/algorithms/dilate_image.py new file mode 100644 index 00000000000..9b6de53e237 --- /dev/null +++ b/examples/examples/algorithms/dilate_image.py @@ -0,0 +1,68 @@ +""" +Basic Image Cleaning and Dilation +================================= + +Here we create an example shower image, do a tail-cuts +(picture/boundary) cleaning, and then dilate the resulting cleaning mask +by several neighbor pixels + +""" + +import astropy.units as u + +# %matplotlib inline +from matplotlib import pyplot as plt + +from ctapipe.image import dilate, tailcuts_clean, toymodel +from ctapipe.instrument import SubarrayDescription +from ctapipe.visualization import CameraDisplay + +# Load a camera from an example file +subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") +geom = subarray.tel[100].camera.geometry + +# Create a fake camera image to display: +model = toymodel.Gaussian( + x=0.2 * u.m, + y=0.0 * u.m, + width=0.05 * u.m, + length=0.15 * u.m, + psi="35d", +) + +image, sig, bg = model.generate_image(geom, intensity=1500, nsb_level_pe=5) + + +###################################################################### +# Apply the image cleaning: +# + +cleanmask = tailcuts_clean(geom, image, picture_thresh=10, boundary_thresh=5) +clean = image.copy() +clean[~cleanmask] = 0.0 + +disp = CameraDisplay(geom, image=image) +disp.highlight_pixels(cleanmask, color="red") + + +###################################################################### +# Now dialte the mask a few times: +# + +from ctapipe.image.cleaning import dilate + + +def show_dilate(mask, times=1): + m = mask.copy() + for ii in range(times): + m = dilate(geom, m) + CameraDisplay( + geom, image=(m.astype(int) + mask.astype(int)), title="dilate{}".format(times) + ) + + +plt.figure(figsize=(18, 3)) + +for ii in range(0, 6): + plt.subplot(1, 7, ii + 1) + show_dilate(cleanmask.copy(), times=ii) diff --git a/examples/examples/algorithms/nd_interpolation.py b/examples/examples/algorithms/nd_interpolation.py new file mode 100644 index 00000000000..19b0b06e386 --- /dev/null +++ b/examples/examples/algorithms/nd_interpolation.py @@ -0,0 +1,146 @@ +""" +Use N-dimensional Histogram functionality and Interpolation +=========================================================== + +- could be used for example to read and interpolate an lookup table or + IRF. +- In this example, we load a sample energy reconstruction lookup-table + from a FITS file +- In this case it is only in 2D cube (to keep the file size small): + ``SIZE`` vs ``IMPACT-DISTANCE``, however the same method will work + for any dimensionality + +""" + +import matplotlib.pylab as plt +import numpy as np +from astropy.io import fits +from scipy.interpolate import RegularGridInterpolator + +from ctapipe.utils import Histogram +from ctapipe.utils.datasets import get_dataset_path + +# %matplotlib inline + + +###################################################################### +# load an example datacube +# ~~~~~~~~~~~~~~~~~~~~~~~~ +# +# (an energy table generated for a small subset of HESS simulations) to +# use as a lookup table. Here we will use the ``Histogram`` class, which +# automatically loads both the data cube and creates arrays for the +# coordinates of each axis. +# + +testfile = get_dataset_path("hess_ct001_energylut.fits.gz") +energy_hdu = fits.open(testfile)["MEAN"] +energy_table = Histogram.from_fits(energy_hdu) +print(energy_table) + + +###################################################################### +# construct an interpolator that we can use to get values at any point: +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Here we will use a ``RegularGridInterpolator``, since it is the most +# appropriate for this type of data, but others are available (see the +# SciPy documentation) +# + +centers = [energy_table.bin_centers(ii) for ii in range(energy_table.ndims)] +energy_lookup = RegularGridInterpolator( + centers, energy_table.hist, bounds_error=False, fill_value=-100 +) + + +###################################################################### +# ``energy_lookup`` is now just a continuous function of ``log(SIZE)``, +# ``DISTANCE`` in m. +# +# Now plot some curves from the interpolator. +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Note that the LUT we used is does not have very high statistics, so the +# interpolation starts to be affected by noise at the high end. In a real +# case, we would want to use a table that has been sanitized (smoothed and +# extrapolated) +# + +lsize = np.linspace(1.5, 5.0, 100) +dists = np.linspace(50, 100, 5) + +plt.figure() +plt.title("Variation of energy with size and impact distance") +plt.xlabel("SIZE (P.E.)") +plt.ylabel("ENERGY (TeV)") + +for dist in dists: + plt.plot( + 10**lsize, + 10 ** energy_lookup((lsize, dist)), + "+-", + label="DIST={:.1f} m".format(dist), + ) + +plt.legend(loc="best") + + +###################################################################### +# Using the interpolator, reinterpolate the lookup table onto an +# :math:`N \times N` grid (regardless of its original dimensions): +# + +N = 300 +xmin, xmax = energy_table.bin_centers(0)[0], energy_table.bin_centers(0)[-1] +ymin, ymax = energy_table.bin_centers(1)[0], energy_table.bin_centers(1)[-1] +xx, yy = np.linspace(xmin, xmax, N), np.linspace(ymin, ymax, N) +X, Y = np.meshgrid(xx, yy) +points = list(zip(X.ravel(), Y.ravel())) +E = energy_lookup(points).reshape((N, N)) + + +###################################################################### +# Now, let’s plot the original table and the new one (E). The color bar +# shows :math:`\log_{10}(E)` in TeV +# + +plt.figure(figsize=(12, 5)) +plt.nipy_spectral() + +# the uninterpolated table +plt.subplot(1, 2, 1) +plt.xlim(1.5, 5) +plt.ylim(0, 500) +plt.xlabel("log10(SIZE)") +plt.ylabel("Impact Dist (m)") +plt.pcolormesh( + energy_table.bin_centers(0), energy_table.bin_centers(1), energy_table.hist.T +) +plt.title("Raw table, uninterpolated {0}".format(energy_table.hist.T.shape)) +cb = plt.colorbar() +cb.set_label("$\log_{10}(E/\mathrm{TeV})$") + +# the interpolated table +plt.subplot(1, 2, 2) +plt.pcolormesh(np.linspace(xmin, xmax, N), np.linspace(ymin, ymax, N), E) +plt.xlim(1.5, 5) +plt.ylim(0, 500) +plt.xlabel("log10(SIZE)") +plt.ylabel("Impact Dist(m)") +plt.title("Interpolated to a ({0}, {0}) grid".format(N)) +cb = plt.colorbar() +cb.set_label("$\log_{10}(E/\mathrm{TeV})$") + +plt.tight_layout() +plt.show() + + +###################################################################### +# In the high-stats central region, we get a nice smooth interpolation +# function. Of course we can see that there are a few more steps to take +# before using this table: \* need to deal with cases where the table had +# low stats near the edges (smooth or extrapolate, or set bounds) \* may +# need to smooth the table even where there are sufficient stats, to avoid +# wiggles +# diff --git a/examples/examples/core/InstrumentDescription.py b/examples/examples/core/InstrumentDescription.py new file mode 100644 index 00000000000..ac4a5ccc1bd --- /dev/null +++ b/examples/examples/core/InstrumentDescription.py @@ -0,0 +1,161 @@ +""" +Working with Instrumental Descriptions +====================================== + +the instrumental description is loaded by the event source, and consists +of a hierarchy of classes in the ctapipe.instrument module, the base of +which is the ``SubarrayDescription`` + +""" + +import numpy as np + +from ctapipe.io import EventSource +from ctapipe.utils.datasets import get_dataset_path + +filename = get_dataset_path("gamma_prod5.simtel.zst") + +with EventSource(filename, max_events=1) as source: + subarray = source.subarray + + +###################################################################### +# the SubarrayDescription: +# ------------------------ +# + +subarray.info() + +subarray.to_table() + + +###################################################################### +# You can also get a table of just the ``OpticsDescriptions`` +# (``CameraGeometry`` is more complex and can’t be stored on a single +# table row, so each one can be converted to a table separately) +# + +subarray.to_table(kind="optics") + + +###################################################################### +# Make a sub-array with only SC-type telescopes: +# + +sc_tels = [tel_id for tel_id, tel in subarray.tel.items() if tel.optics.n_mirrors == 2] +newsub = subarray.select_subarray(sc_tels, name="SCTels") +newsub.info() + + +###################################################################### +# can also do this by using ``Table.group_by`` +# + + +###################################################################### +# Explore some of the details of the telescopes +# --------------------------------------------- +# + +tel = subarray.tel[1] +tel + +tel.optics.mirror_area + +tel.optics.n_mirror_tiles + +tel.optics.equivalent_focal_length + +tel.camera + +tel.camera.geometry.pix_x + +# %matplotlib inline +from ctapipe.visualization import CameraDisplay + +CameraDisplay(tel.camera.geometry) + +CameraDisplay(subarray.tel[98].camera.geometry) + + +###################################################################### +# Plot the subarray +# ----------------- +# +# We’ll make a subarray by telescope type and plot each separately, so +# they appear in different colors. We also calculate the radius using the +# mirror area (and exagerate it a bit). +# +# This is just for debugging and info, for any “real” use, a +# ``visualization.ArrayDisplay`` should be used +# + +subarray.peek() + +subarray.footprint + + +###################################################################### +# Get info about the subarray in general +# -------------------------------------- +# + +subarray.telescope_types + +subarray.camera_types + +subarray.optics_types + +from astropy.coordinates import SkyCoord + +from ctapipe.coordinates import GroundFrame + +center = SkyCoord("10.0 m", "2.0 m", "0.0 m", frame="groundframe") +coords = subarray.tel_coords # a flat list of coordinates by tel_index +coords.separation(center) + + +###################################################################### +# Telescope IDs vs Indices +# ------------------------ +# +# Note that ``subarray.tel`` is a dict mapped by ``tel_id`` (the +# indentifying number of a telescope). It is possible to have telescope +# IDs that do not start at 0, are not contiguouous (e.g. if a subarray is +# selected). Some functions and properties like ``tel_coords`` are numpy +# arrays (not dicts) so they are not mapped to the telescope ID, but +# rather the *index* within this SubarrayDescription. To convert between +# the two concepts you can do: +# + +subarray.tel_ids_to_indices([1, 5, 23]) + + +###################################################################### +# or you can get the indexing array directly in numpy or dict form: +# + +subarray.tel_index_array + +subarray.tel_index_array[[1, 5, 23]] + +subarray.tel_indices[ + 1 +] # this is a dict of tel_id -> tel_index, so we can only do one at once + +ids = subarray.get_tel_ids_for_type(subarray.telescope_types[0]) +ids + +idx = subarray.tel_ids_to_indices(ids) +idx + +subarray.tel_coords[idx] + + +###################################################################### +# so, with that method you can quickly get many telescope positions at +# once (the alternative is to use the dict ``positions`` which maps +# ``tel_id`` to a position on the ground +# + +subarray.positions[1] diff --git a/examples/examples/core/README.rst b/examples/examples/core/README.rst new file mode 100644 index 00000000000..5bcae85324a --- /dev/null +++ b/examples/examples/core/README.rst @@ -0,0 +1,4 @@ +Core Functionality +================== + +.. _core-examples-gallery: diff --git a/examples/examples/core/Tools.py b/examples/examples/core/Tools.py new file mode 100644 index 00000000000..212b860bcff --- /dev/null +++ b/examples/examples/core/Tools.py @@ -0,0 +1,357 @@ +""" +Creating command-line Tools +=========================== + +""" + +import logging +from time import sleep + +from astropy import units as u + +from ctapipe.core import Component, TelescopeComponent, Tool +from ctapipe.core.traits import ( + Dict, + Float, + FloatTelescopeParameter, + Integer, + List, + Path, + TraitError, + Unicode, + observe, +) +from ctapipe.utils import get_dataset_path + +GAMMA_FILE = get_dataset_path("gamma_prod5.simtel.zst") + + +###################################################################### +# see https://github.com/ipython/traitlets/blob/master/examples/myapp.py +# + + +###################################################################### +# Setup: +# ------ +# +# Create a few ``Component``\ s that we will use later in a ``Tool``: +# + + +class MyComponent(Component): + """A Component that does stuff""" + + value = Integer(default_value=-1, help="Value to use").tag(config=True) + + def do_thing(self): + self.log.debug("Did thing") + + +# in order to have 2 of the same components at once +class SecondaryMyComponent(MyComponent): + """A second component""" + + pass + + +class AdvancedComponent(Component): + """An advanced technique""" + + value1 = Integer(default_value=-1, help="Value to use").tag(config=True) + infile = Path( + help="input file name", + exists=None, # set to True to require existing, False for requiring non-existing + directory_ok=False, + ).tag(config=True) + outfile = Path(help="output file name", exists=False, directory_ok=False).tag( + config=True + ) + + def __init__(self, config=None, parent=None, **kwargs): + super().__init__(config=config, parent=parent, **kwargs) + # components can have sub components, but these must have + # then parent=self as argument and be assigned as member + # so the full config can be received later + self.subcompent = MyComponent(parent=self) + + @observe("outfile") + def on_outfile_changed(self, change): + self.log.warning("Outfile was changed to '{}'".format(change)) + + +class TelescopeWiseComponent(TelescopeComponent): + """a component that contains parameters that are per-telescope configurable""" + + param = FloatTelescopeParameter( + help="Something configurable with telescope patterns", default_value=5.0 + ).tag(config=True) + + +MyComponent() + +AdvancedComponent(infile="test.foo", outfile="out.foo") + + +###################################################################### +# ``TelescopeComponents`` need to have a subarray given to them in order +# to work (since they need one to turn a ``TelescopeParameter`` into a +# concrete list of values for each telescope. Here we will give a dummy +# one: +# + +from ctapipe.instrument import SubarrayDescription, TelescopeDescription + +subarray = SubarrayDescription.read(GAMMA_FILE) +subarray.info() + +TelescopeWiseComponent(subarray=subarray) + + +###################################################################### +# This TelescopeParameters can then be set using a list of patterns like: +# +# .. code:: python +# +# component.param = [ +# ("type", "LST*",3.0), +# ("type", "MST*", 2.0), +# (id, 25, 4.0) +# ] +# +# These get translated into per-telescope-id values once the subarray is +# registered. After that one acccess the per-telescope id values via: +# +# .. code:: python +# +# component.param.tel[tel_id] +# + + +###################################################################### +# Now create an executable Tool that contains the Components +# ---------------------------------------------------------- +# +# Note that all the components we wish to be configured via the tool must +# be added to the ``classes`` attribute. +# + + +class MyTool(Tool): + name = "mytool" + description = "do some things and stuff" + aliases = dict( + infile="AdvancedComponent.infile", + outfile="AdvancedComponent.outfile", + iterations="MyTool.iterations", + ) + + # Which classes are registered for configuration + classes = [ + MyComponent, + AdvancedComponent, + SecondaryMyComponent, + TelescopeWiseComponent, + ] + + # local configuration parameters + iterations = Integer(5, help="Number of times to run", allow_none=False).tag( + config=True + ) + + def setup(self): + self.comp = MyComponent(parent=self) + self.comp2 = SecondaryMyComponent(parent=self) + self.comp3 = TelescopeWiseComponent(parent=self, subarray=subarray) + self.advanced = AdvancedComponent(parent=self) + + def start(self): + self.log.info("Performing {} iterations...".format(self.iterations)) + for ii in range(self.iterations): + self.log.info("ITERATION {}".format(ii)) + self.comp.do_thing() + self.comp2.do_thing() + sleep(0.1) + + def finish(self): + self.log.warning("Shutting down.") + + +###################################################################### +# Get Help info +# ------------- +# +# The following allows you to print the help info within a Jupyter +# notebook, but this same inforamtion would be displayed if the user +# types: +# +# :: +# +# mytool --help +# + +tool = MyTool() +tool + +tool.print_help() + + +###################################################################### +# The following is equivalant to the user typing ``mytool --help-all`` +# + +tool.print_help(classes=True) + + +###################################################################### +# Run the tool +# ------------ +# +# here we pass in argv since it is a Notebook, but if argv is not +# specified it’s read from ``sys.argv``, so the following is the same as +# running: +# +# .. code:: sh +# +# mytool --log_level=INFO --infile gamma_test.simtel.gz --iterations=3 +# +# As Tools are intended to be exectutables, they are raising +# ``SystemExit`` on exit. Here, we use them to demonstrate how it would +# work, so we catch the ``SystemExit``. +# + +try: + tool.run(argv=["--infile", str(GAMMA_FILE), "--outfile", "out.csv"]) +except SystemExit as e: + assert e.code == 0, f"Tool returned with error status {e}" + +tool.log_format = "%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s" + + +try: + tool.run( + argv=[ + "--log-level", + "INFO", + "--infile", + str(GAMMA_FILE), + "--outfile", + "out.csv", + "--iterations", + "3", + ] + ) +except SystemExit as e: + assert e.code == 0, f"Tool returned with error status {e}" + + +###################################################################### +# here we change the log-level to DEBUG: +# + +try: + tool.run( + argv=[ + "--log-level", + "DEBUG", + "--infile", + str(GAMMA_FILE), + "--outfile", + "out.csv", + ] + ) +except SystemExit as e: + assert e.code == 0, f"Tool returned with error status {e}" + + +###################################################################### +# you can also set parameters directly in the class, rather than using the +# argument/configfile parser. This is useful if you are calling the Tool +# from a script rather than the command-line +# + +tool.iterations = 1 +tool.log_level = 0 + +try: + tool.run(["--infile", str(GAMMA_FILE), "--outfile", "out.csv"]) +except SystemExit as e: + assert e.code == 0, f"Tool returned with error status {e}" + + +###################################################################### +# see what happens when a value is set that is not of the correct type: +# + +try: + tool.iterations = "badval" +except TraitError as E: + print("bad value:", E) +except SystemExit as e: + assert e.code == 0, f"Tool returned with error status {e}" + + +###################################################################### +# Example of what happens when you change a parameter that is being +# “observed” in a class. It’s handler is called: +# + +tool.advanced.outfile = "Another.txt" + + +###################################################################### +# we see that the handler for ``outfile`` was called, and it receive a +# change dict that shows the old and new values. +# + + +###################################################################### +# create a tool using a config file: +# + +tool2 = MyTool() + +try: + tool2.run(argv=["--config", "Tools.json"]) +except SystemExit as e: + assert e.code == 0, f"Tool returned with error status {e}" + +print(tool2.advanced.infile) + +print(tool2.config) + +tool2.is_setup + +tool3 = MyTool() + +tool3.is_setup + +tool3.initialize(argv=[]) + +tool3.is_setup + +tool3 + +tool.setup() +tool + +tool.comp2 + + +###################################################################### +# Getting the configuration of an instance +# ---------------------------------------- +# + +tool.get_current_config() + +tool.iterations = 12 +tool.get_current_config() + + +###################################################################### +# Writing a Sample Config File +# ---------------------------- +# + +print(tool.generate_config_file()) diff --git a/examples/examples/core/containers.py b/examples/examples/core/containers.py new file mode 100644 index 00000000000..de499c57daa --- /dev/null +++ b/examples/examples/core/containers.py @@ -0,0 +1,202 @@ +""" +Using Container classes +======================= + +``ctapipe.core.Container`` is the base class for all event-wise data +classes in ctapipe. It works like a object-relational mapper, in that it +defines a set of ``Fields`` along with their metadata (description, +unit, default), which can be later translated automatially into an +output table using a ``ctapipe.io.TableWriter``. + +""" + +from functools import partial + +import numpy as np +from astropy import units as u + +from ctapipe.core import Container, Field, Map + +###################################################################### +# Let’s define a few example containers with some dummy fields in them: +# + +class SubContainer(Container): + junk = Field(-1, "Some junk") + value = Field(0.0, "some value", unit=u.deg) + + +class TelContainer(Container): + # defaults should match the other requirements, e.g. the defaults + # should have the correct unit. It most often also makes sense to use + # an invalid value marker like nan for floats or -1 for positive integers + # as default + tel_id = Field(-1, "telescope ID number") + + # For mutable structures like lists, arrays or containers, use a `default_factory` function or class + # not an instance to assure each container gets a fresh instance and there is no hidden + # shared state between containers. + image = Field(default_factory=lambda: np.zeros(10), description="camera pixel data") + + +class EventContainer(Container): + event_id = Field(-1, "event id number") + + tels_with_data = Field( + default_factory=list, description="list of telescopes with data" + ) + sub = Field( + default_factory=SubContainer, description="stuff" + ) # a sub-container in the hierarchy + + # A Map is like a defaultdictionary with a specific container type as default. + # This can be used to e.g. store a container per telescope + # we use partial here to automatically get a function that creates a map with the correct container type + # as default + tel = Field(default_factory=partial(Map, TelContainer), description="telescopes") + + +###################################################################### +# Basic features +# -------------- +# + +ev = EventContainer() + + +###################################################################### +# Check that default values are automatically filled in +# + +print(ev.event_id) +print(ev.sub) +print(ev.tel) +print(ev.tel.keys()) + +# default dict access will create container: +print(ev.tel[1]) + + +###################################################################### +# print the dict representation +# + +print(ev) + + +###################################################################### +# We also get docstrings “for free” +# + +?EventContainer + +?SubContainer + + +###################################################################### +# values can be set as normal for a class: +# + +ev.event_id = 100 +ev.event_id + +ev.as_dict() # by default only shows the bare items, not sub-containers (See later) + +ev.as_dict(recursive=True) + + +###################################################################### +# and we can add a few of these to the parent container inside the tel +# dict: +# + +ev.tel[10] = TelContainer() +ev.tel[5] = TelContainer() +ev.tel[42] = TelContainer() + +# because we are using a default_factory to handle mutable defaults, the images are actually different: +ev.tel[42].image is ev.tel[32] + + +###################################################################### +# Be careful to use the ``default_factory`` mechanism for mutable fields, +# see this **negative** example: +# + +class DangerousContainer(Container): + image = Field( + np.zeros(10), + description="Attention!!!! Globally mutable shared state. Use default_factory instead", + ) + + +c1 = DangerousContainer() +c2 = DangerousContainer() + +c1.image[5] = 9999 + +print(c1.image) +print(c2.image) +print(c1.image is c2.image) + +ev.tel + + +###################################################################### +# Converion to dictionaries +# ------------------------- +# + +ev.as_dict() + +ev.as_dict(recursive=True, flatten=False) + + +###################################################################### +# for serialization to a table, we can even flatten the output into a +# single set of columns +# + +ev.as_dict(recursive=True, flatten=True) + + +###################################################################### +# Setting and clearing values +# --------------------------- +# + +ev.tel[5].image[:] = 9 +print(ev) + +ev.reset() +ev.as_dict(recursive=True) + + +###################################################################### +# look at a pre-defined Container +# ------------------------------- +# + +from ctapipe.containers import SimulatedShowerContainer + +?SimulatedShowerContainer + +shower = SimulatedShowerContainer() +shower + + +###################################################################### +# Container prefixes +# ------------------ +# +# To store the same container in the same table in a file or give more +# information, containers support setting a custom prefix: +# + +c1 = SubContainer(junk=5, value=3, prefix="foo") +c2 = SubContainer(junk=10, value=9001, prefix="bar") + +# create a common dict with data from both containers: +d = c1.as_dict(add_prefix=True) +d.update(c2.as_dict(add_prefix=True)) +d \ No newline at end of file diff --git a/examples/examples/core/provenance.py b/examples/examples/core/provenance.py new file mode 100644 index 00000000000..d3c1d812450 --- /dev/null +++ b/examples/examples/core/provenance.py @@ -0,0 +1,115 @@ +""" +Using the ctapipe Provenance service +==================================== + +The provenance functionality is used automatically when you use most of +ctapipe functionality (particularly ``ctapipe.core.Tool`` and functions +in ``ctapipe.io`` and ``ctapipe.utils``), so normally you don’t have to +work with it directly. It tracks both input and output files, as well as +details of the machine and software environment on which a Tool +executed. + +Here we show some very low-level functions of this system: + +""" + +from pprint import pprint + +from ctapipe.core import Provenance + +###################################################################### +# Activities +# ---------- +# +# The basis of Provenance is an *activity*, which is generally an +# executable or step in a script. Activities can be nested (e.g. with +# sub-activities), as shown below, but normally this is not required: +# + +p = Provenance() # note this is a singleton, so only ever one global provenence object +p.clear() +p.start_activity() +p.add_input_file("test.txt") + +p.start_activity("sub") +p.add_input_file("subinput.txt") +p.add_input_file("anothersubinput.txt") +p.add_output_file("suboutput.txt") +p.finish_activity("sub") + +p.start_activity("sub2") +p.add_input_file("sub2input.txt") +p.finish_activity("sub2") + +p.finish_activity() + +p.finished_activity_names + + +###################################################################### +# Activities have associated input and output *entities* (files or other +# objects) +# + +[(x["activity_name"], x["input"]) for x in p.provenance] + + +###################################################################### +# Activities track when they were started and finished: +# + +[(x["activity_name"], x["duration_min"]) for x in p.provenance] + + +###################################################################### +# Full provenance +# --------------- +# +# The provence object is a list of activitites, and for each lots of +# details are collected: +# + +p.provenance[0] + + +###################################################################### +# This can be better represented in JSON: +# + +print(p.as_json(indent=2)) + + +###################################################################### +# Storing provenance info in output files +# --------------------------------------- +# +# - already this can be stored in something like an HDF5 file header, +# which allows hierarchies. +# - Try to flatted the data so it can be stored in a key=value header in +# a **FITS file** (using the FITS extended keyword convention to allow +# >8 character keywords), or as a table +# + + +def flatten_dict(y): + out = {} + + def flatten(x, name=""): + if type(x) is dict: + for a in x: + flatten(x[a], name + a + ".") + elif type(x) is list: + i = 0 + for a in x: + flatten(a, name + str(i) + ".") + i += 1 + else: + out[name[:-1]] = x + + flatten(y) + return out + + +d = dict(activity=p.provenance) + +pprint(flatten_dict(d)) diff --git a/examples/examples/core/table_writer_reader.py b/examples/examples/core/table_writer_reader.py new file mode 100644 index 00000000000..6c9e9a6ab4c --- /dev/null +++ b/examples/examples/core/table_writer_reader.py @@ -0,0 +1,281 @@ +""" +Writing Containers to a tabular format +====================================== + +The ``TableWriter``/``TableReader`` sub-classes allow you to write a +``ctapipe.core.Container`` class and its meta-data to an output table. +They treat the ``Field``\ s in the ``Container`` as columns in the +output, and automatically generate a schema. Here we will go through an +example of writing out data and reading it back with *Pandas*, +*PyTables*, and a ``ctapipe.io.TableReader``: + +In this example, we will use the ``HDF5TableWriter``, which writes to +HDF5 datasets using *PyTables*. Currently this is the only implemented +TableWriter. + +""" + + +###################################################################### +# Caveats to think about: \* vector columns in Containers *can* be +# written, but some lilbraries like Pandas can not read those (so you must +# use pytables or astropy to read outputs that have vector columns) \* +# units are stored in the table metadata, but some libraries like Pandas +# ignore them and all other metadata +# + + +###################################################################### +# Create some example Containers +# ------------------------------ +# + +import numpy as np +from astropy import units as u + +from ctapipe.core import Container, Field +from ctapipe.io import HDF5TableWriter + + +class VariousTypesContainer(Container): + + a_int = Field(int, "some int value") + a_float = Field(float, "some float value with a unit", unit=u.m) + a_bool = Field(bool, "some bool value") + a_np_int = Field(np.int64, "a numpy int") + a_np_float = Field(np.float64, "a numpy float") + a_np_bool = Field(np.bool_, "np.bool") + + +###################################################################### +# let’s also make a dummy stream (generator) that will create a series of +# these containers +# + +def create_stream(n_event): + + data = VariousTypesContainer() + for i in range(n_event): + + data.a_int = int(i) + data.a_float = float(i) * u.cm # note unit conversion will happen + data.a_bool = (i % 2) == 0 + data.a_np_int = np.int64(i) + data.a_np_float = np.float64(i) + data.a_np_bool = np.bool_((i % 2) == 0) + + yield data + +for data in create_stream(2): + + for key, val in data.items(): + + print("{}: {}, type : {}".format(key, val, type(val))) + + +###################################################################### +# Writing the Data (and good practices) +# ------------------------------------- +# + + +###################################################################### +# Always use context managers with IO classes, as they will make sure the +# underlying resources are properly closed in case of errors: +# + +try: + with HDF5TableWriter("container.h5", group_name="data") as h5_table: + + for data in create_stream(10): + + h5_table.write("table", data) + 0 / 0 +except Exception as err: + print("FAILED:", err) +print("Done") + +h5_table.h5file.isopen == False + +!ls container.h5 + + +###################################################################### +# Appending new Containers +# ------------------------ +# + + +###################################################################### +# To append some new containers we need to set the writing in append mode +# by using: ‘mode=a’. But let’s now first look at what happens if we +# don’t. +# + +for i in range(2): + + with HDF5TableWriter( + "container.h5", mode="w", group_name="data_{}".format(i) + ) as h5_table: + + for data in create_stream(10): + + h5_table.write("table", data) + + print(h5_table.h5file) + +!rm -f container.h5 + + +###################################################################### +# Ok so the writer destroyed the content of the file each time it opens +# the file. Now let’s try to append some data group to it! (using +# mode=‘a’) +# + +for i in range(2): + + with HDF5TableWriter( + "container.h5", mode="a", group_name="data_{}".format(i) + ) as h5_table: + + for data in create_stream(10): + + h5_table.write("table", data) + + print(h5_table.h5file) + + +###################################################################### +# So we can append some data groups. As long as the data group_name does +# not already exists. Let’s try to overwrite the data group : data_1 +# + +try: + with HDF5TableWriter("container.h5", mode="a", group_name="data_1") as h5_table: + for data in create_stream(10): + h5_table.write("table", data) +except Exception as err: + print("Failed as expected:", err) + + +###################################################################### +# Good ! I cannot overwrite my data. +# + +print(bool(h5_table.h5file.isopen)) + + +###################################################################### +# Reading the Data +# ---------------- +# + + +###################################################################### +# Reading the whole table at once: +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# For this, you have several choices. Since we used the HDF5TableWriter in +# this example, we have at least these options avilable: +# +# - Pandas +# - PyTables +# - Astropy Table +# +# For other TableWriter implementations, others may be possible (depending +# on format) +# + + +###################################################################### +# Reading using ``ctapipe.io.read_table`` +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# This is the preferred method, it returns an astropy ``Table`` and +# supports keeping track of units, metadata and transformations. +# + +from ctapipe.io import read_table + +table = read_table("container.h5", "/data_0/table") +table[:5] + +table.meta + + +###################################################################### +# Reading with Pandas: +# ^^^^^^^^^^^^^^^^^^^^ +# +# Pandas is a convenient way to read the output. **HOWEVER BE WARNED** +# that so far Pandas does not support reading the table *meta-data* or +# *units* for colums, so that information is lost! +# + +import pandas as pd + +data = pd.read_hdf("container.h5", key="/data_0/table") +data.head() + + +###################################################################### +# Reading with PyTables +# ^^^^^^^^^^^^^^^^^^^^^ +# + +import tables + +h5 = tables.open_file("container.h5") +table = h5.root["data_0"]["table"] +table + + +###################################################################### +# note that here we can still access the metadata +# + +table.attrs + + +###################################################################### +# Reading one-row-at-a-time: +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# + + +###################################################################### +# Rather than using the full-table methods, if you want to read it +# row-by-row (e.g. to maintain compatibility with an existing event loop), +# you can use a ``TableReader`` instance. +# +# The advantage here is that units and other metadata are retained and +# re-applied +# + +from ctapipe.io import HDF5TableReader + + +def read(mode): + + print("reading mode {}".format(mode)) + + with HDF5TableReader("container.h5", mode=mode) as h5_table: + + for group_name in ["data_0/", "data_1/"]: + + group_name = "/{}table".format(group_name) + print(group_name) + + for data in h5_table.read(group_name, VariousTypesContainer): + + print(data.as_dict()) + +read("r") + +read("r+") + +read("a") + +read("w") + diff --git a/examples/examples/index.rst b/examples/examples/index.rst new file mode 100644 index 00000000000..18496722bf3 --- /dev/null +++ b/examples/examples/index.rst @@ -0,0 +1,9 @@ +Examples gallery +================ + +The examples gallery provides an overview of different ctapipe modules and how to use them. + +.. toctree:: + visualization/index + algorithms/index + core/index diff --git a/examples/examples/visualization/README.rst b/examples/examples/visualization/README.rst new file mode 100644 index 00000000000..e4cc3341b62 --- /dev/null +++ b/examples/examples/visualization/README.rst @@ -0,0 +1,4 @@ +Visualization +============= + +.. _visualization-examples-gallery: diff --git a/examples/examples/visualization/array_display.py b/examples/examples/visualization/array_display.py new file mode 100644 index 00000000000..9679cfd9bc3 --- /dev/null +++ b/examples/examples/visualization/array_display.py @@ -0,0 +1,225 @@ +""" +Array Displays +============== + +Like ``CameraDisplays``, ctapipe provides a way to display information +related to the array on the ground: ``ArrayDisplay`` + +""" + +import matplotlib.pyplot as plt +import numpy as np +from astropy import units as u +from astropy.coordinates import SkyCoord + +from ctapipe.containers import HillasParametersContainer +from ctapipe.coordinates import EastingNorthingFrame, GroundFrame +from ctapipe.instrument import SubarrayDescription +from ctapipe.visualization import ArrayDisplay + +plt.rcParams["figure.figsize"] = (8, 6) + +tel_ids = list(range(1, 5)) + list(range(5, 20)) # just LSTs + one set of MSTs + +subarray = SubarrayDescription.read( + "dataset://gamma_20deg_0deg_run1___cta-prod5-lapalma_desert-2158m-LaPalma-dark_100evts.simtel.zst" +).select_subarray(tel_ids) + + +###################################################################### +# An array display is created for example in ``subarray.peek()``: +# + +subarray.peek() + + +###################################################################### +# However, you can make one manually with a bit more flexibility: +# + + +###################################################################### +# Constructing an ArrayDisplay +# ---------------------------- +# + +disp = ArrayDisplay(subarray) + + +###################################################################### +# You can specify the Frame you want as long as it is compatible with +# ``GroundFrame``. ``EastingNorthingFrame`` is probably the most useful. +# You can also add telescope labels +# + +disp = ArrayDisplay(subarray, frame=EastingNorthingFrame()) +disp.add_labels() + + +###################################################################### +# Using color to show information +# ------------------------------- +# +# By default the color of the telescope circles correlates to telescope +# type. However, you can use color to convey other information by setting +# the ``values`` attribute, like a trigger pattern +# + +plt.set_cmap("rainbow") # the array display will use the current colormap for values + +ad = ArrayDisplay(subarray) +ad.telescopes.set_linewidth(0) # to turn off the telescope borders + +trigger_pattern = np.zeros(subarray.n_tels) +trigger_pattern[ + [ + 1, + 4, + 5, + 6, + ] +] = 1 +ad.values = trigger_pattern # display certain telescopes in a color +ad.add_labels() + + +###################################################################### +# or for example, you could use color to represent the telescope distance +# to the impact point +# + +shower_impact = SkyCoord(200 * u.m, -200 * u.m, 0 * u.m, frame=EastingNorthingFrame()) + +plt.set_cmap("rainbow") # the array display will use the current colormap for values +ad = ArrayDisplay(subarray) +ad.telescopes.set_linewidth(0) # to turn off the telescope borders +plt.scatter(shower_impact.easting, shower_impact.northing, marker="+", s=200) + +distances = np.hypot( + subarray.tel_coords.cartesian.x - shower_impact.cartesian.x, + subarray.tel_coords.cartesian.y - shower_impact.cartesian.y, +) +ad.values = distances +plt.colorbar(ad.telescopes, label="Distance (m)") + + +###################################################################### +# Overlaying vectors +# ------------------ +# +# For plotting reconstruction quantities, it’s useful to overlay vectors +# on the telescope positions. ``ArrayDisplay`` provides functions: \* +# ``set_vector_uv`` to set by cartesian coordinates from the center of +# each telescope \* ``set_vector_rho_phi`` to set by polar coorinates from +# the center of each telescope \* ``set_vector_hillas`` to set vectors +# from a ``dict[int,HillasParameters]`` mapping tel_id (not index!) to a +# set of parameters. +# + +np.random.seed(0) +phis = np.random.uniform(0, 180.0, size=subarray.n_tels) * u.deg +rhos = np.ones(subarray.n_tels) * 200 * u.m + + +ad = ArrayDisplay(subarray, frame=EastingNorthingFrame(), tel_scale=2) +ad.set_vector_rho_phi(rho=rhos, phi=phis) + + +###################################################################### +# Overlaying Image Axes +# --------------------- +# +# For the common use case of plotting image axis on an ``ArrayDisplay``, +# the ``set_line_hillas()`` method is provided for convenience. The +# following example shows its use: +# + +import matplotlib.pyplot as plt +from astropy.coordinates import SkyCoord +from IPython import display +from matplotlib.animation import FuncAnimation + +from ctapipe.calib import CameraCalibrator +from ctapipe.image import ImageProcessor +from ctapipe.io import EventSource +from ctapipe.reco import ShowerProcessor +from ctapipe.utils import get_dataset_path +from ctapipe.visualization import ArrayDisplay + +input_url = "dataset://gamma_LaPalma_baseline_20Zd_180Az_prod3b_test.simtel.gz" + + +###################################################################### +# First, we define a function to plot the array with overlaid lines for +# the image axes +# + + +def plot_event(event, subarray, ax): + """ + Draw an ArrayDisplay with image axes and the + true and reconstructed impact position overlaid + """ + + array_pointing = SkyCoord( + az=event.pointing.array_azimuth, + alt=event.pointing.array_altitude, + frame="altaz", + ) + + angle_offset = event.pointing.array_azimuth + disp = ArrayDisplay(subarray, axes=ax) + + hillas_dict = {tid: tel.parameters.hillas for tid, tel in event.dl1.tel.items()} + core_dict = {tid: tel.parameters.core.psi for tid, tel in event.dl1.tel.items()} + + disp.set_line_hillas( + hillas_dict, + core_dict, + 500, + ) + + reco_shower = event.dl2.stereo.geometry["HillasReconstructor"] + + ax.scatter( + event.simulation.shower.core_x, + event.simulation.shower.core_y, + s=200, + c="k", + marker="x", + label="True Impact", + ) + ax.scatter( + reco_shower.core_x, + reco_shower.core_y, + s=200, + c="r", + marker="x", + label="Estimated Impact", + ) + + ax.legend() + + +###################################################################### +# Now, we can loop through some events and plot them. Here we apply +# default calibration, image processing, and reconstruction, however it is +# better to use ``ctapipe-process`` with a well-defined configuration to +# do this in reality. Note that some events will not have images bright +# enough to do parameterization or reconstruction, so they will have no +# image axis lines or no estimated impact position. +# + +fig, ax = plt.subplots(5, 3, figsize=(20, 40), constrained_layout=True) +ax = ax.ravel() + +with EventSource(input_url, max_events=15, focal_length_choice="EQUIVALENT") as source: + calib = CameraCalibrator(subarray=source.subarray) + process_images = ImageProcessor(subarray=source.subarray) + process_shower = ShowerProcessor(subarray=source.subarray) + + for i, event in enumerate(source): + calib(event) + process_images(event) + process_shower(event) + plot_event(event, source.subarray, ax=ax[i]) diff --git a/examples/examples/visualization/camera_display.py b/examples/examples/visualization/camera_display.py new file mode 100644 index 00000000000..7aac6fe6afb --- /dev/null +++ b/examples/examples/visualization/camera_display.py @@ -0,0 +1,416 @@ +""" +Displaying Camera Images +======================== + +""" + +import astropy.coordinates as c +import astropy.units as u +import matplotlib.pylab as plt +import numpy as np + +from ctapipe.coordinates import CameraFrame, EngineeringCameraFrame, TelescopeFrame +from ctapipe.image import hillas_parameters, tailcuts_clean, toymodel +from ctapipe.instrument import SubarrayDescription +from ctapipe.visualization import CameraDisplay + +###################################################################### +# First, let’s create a fake Cherenkov image from a given +# ``CameraGeometry`` and fill it with some data that we can draw later. +# + +# load an example camera geometry from a simulation file +subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") +geom = subarray.tel[100].camera.geometry + +# create a fake camera image to display: +model = toymodel.Gaussian( + x=0.2 * u.m, + y=0.0 * u.m, + width=0.05 * u.m, + length=0.15 * u.m, + psi="35d", +) + +image, sig, bg = model.generate_image(geom, intensity=1500, nsb_level_pe=10) +mask = tailcuts_clean(geom, image, picture_thresh=15, boundary_thresh=5) + +geom + + +###################################################################### +# Displaying Images +# ----------------- +# +# The simplest plot is just to generate a CameraDisplay with an image in +# its constructor. A figure and axis will be created automatically +# + +CameraDisplay(geom) + + +###################################################################### +# You can also specify the initial ``image``, ``cmap`` and ``norm`` +# (colomap and normalization, see below), ``title`` to use. You can +# specify ``ax`` if you want to draw the camera on an existing +# *matplotlib* ``Axes`` object (otherwise one is created). +# +# To change other options, or to change options dynamically, you can call +# the relevant functions of the ``CameraDisplay`` object that is returned. +# For example to add a color bar, call ``add_colorbar()``, or to change +# the color scale, modify the ``cmap`` or ``norm`` properties directly. +# + + +###################################################################### +# Choosing a coordinate frame +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# The ``CameraGeometry`` object contains a ``ctapipe.coordinates.Frame`` +# used by ``CameraDisplay`` to draw the camera in the correct orientation +# and distance units. The default frame is the ``CameraFrame``, which will +# display the camera in units of *meters* and with an orientation that the +# top of the camera (when parked) is aligned to the X-axis. To show the +# camera in another orientation, it’s useful to apply a coordinate +# transform to the ``CameraGeometry`` before passing it to the +# ``CameraDisplay``. The following ``Frames`` are supported: \* +# ``EngineeringCameraFrame`` : similar to CameraFrame, but with the top of +# the camera aligned to the Y axis \* ``TelescopeFrame``: In *degrees* (on +# the sky) coordinates relative to the telescope Alt/Az pointing position, +# with the Alt axis pointing upward. +# + +fig, ax = plt.subplots(1, 3, figsize=(15, 4)) +CameraDisplay(geom, image=image, ax=ax[0]) +CameraDisplay(geom.transform_to(EngineeringCameraFrame()), image=image, ax=ax[1]) +CameraDisplay(geom.transform_to(TelescopeFrame()), image=image, ax=ax[2]) + + +###################################################################### +# Note the the name of the Frame appears in the lower-right corner +# + + +###################################################################### +# For the rest of this demo, let’s use the ``TelescopeFrame`` +# + +geom_camframe = geom +geom = geom_camframe.transform_to(EngineeringCameraFrame()) + + +###################################################################### +# Changing the color map and scale +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# + + +###################################################################### +# CameraDisplay supports any `matplotlib color +# map `__ +# It is **highly recommended** to use a *perceptually uniform* map, unless +# you have a good reason not to. +# + +fig, ax = plt.subplots(1, 3, figsize=(15, 4)) +for ii, cmap in enumerate(["PuOr_r", "rainbow", "twilight"]): + disp = CameraDisplay(geom, image=image, ax=ax[ii], title=cmap) + disp.add_colorbar() + disp.cmap = cmap + + +###################################################################### +# By default the minimum and maximum of the color bar are set +# automatically by the data in the image. To choose fixed limits, use:\` +# + +fig, ax = plt.subplots(1, 3, figsize=(15, 4)) +for ii, minmax in enumerate([(10, 50), (-10, 10), (1, 100)]): + disp = CameraDisplay(geom, image=image, ax=ax[ii], title=minmax) + disp.add_colorbar() + disp.set_limits_minmax(minmax[0], minmax[1]) + + +###################################################################### +# Or you can set the maximum limit by percentile of the charge +# distribution: +# + +fig, ax = plt.subplots(1, 3, figsize=(15, 4)) +for ii, pct in enumerate([30, 50, 90]): + disp = CameraDisplay(geom, image=image, ax=ax[ii], title=f"{pct} %") + disp.add_colorbar() + disp.set_limits_percent(pct) + + +###################################################################### +# Using different normalizations +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# + + +###################################################################### +# You can choose from several preset normalizations (lin, log, symlog) and +# also provide a custom normalization, for example a ``PowerNorm``: +# + +from matplotlib.colors import PowerNorm + +fig, axes = plt.subplots(2, 2, figsize=(14, 10)) +norms = ["lin", "log", "symlog", PowerNorm(0.5)] + +for norm, ax in zip(norms, axes.flatten()): + disp = CameraDisplay(geom, image=image, ax=ax) + disp.norm = norm + disp.add_colorbar() + ax.set_title(str(norm)) + +axes[1, 1].set_title("PowerNorm(0.5)") +plt.show() + + +###################################################################### +# Overlays +# -------- +# + + +###################################################################### +# Marking pixels +# ~~~~~~~~~~~~~~ +# +# here we will mark pixels in the image mask. That will change their +# outline color +# + +fig, ax = plt.subplots(1, 2, figsize=(10, 4)) +disp = CameraDisplay( + geom, image=image, cmap="gray", ax=ax[0], title="Image mask in green" +) +disp.highlight_pixels(mask, alpha=0.8, linewidth=2, color="green") + +disp = CameraDisplay( + geom, image=image, cmap="gray", ax=ax[1], title="Image mask in green (zoom)" +) +disp.highlight_pixels(mask, alpha=1, linewidth=3, color="green") + +ax[1].set_ylim(-0.5, 0.5) +ax[1].set_xlim(-0.5, 0.5) + + +###################################################################### +# Drawing a Hillas-parameter ellipse +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# + + +###################################################################### +# For this, we will first compute some Hillas Parameters in the current +# frame: +# + +clean_image = image.copy() +clean_image[~mask] = 0 +hillas = hillas_parameters(geom, clean_image) + +plt.figure(figsize=(6, 6)) +disp = CameraDisplay(geom, image=image, cmap="gray_r") +disp.highlight_pixels(mask, alpha=0.5, color="dodgerblue") +disp.overlay_moments(hillas, color="red", linewidth=3, with_label=False) + + +###################################################################### +# Drawing a marker at a coordinate +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# This depends on the coordinate frame of the ``CameraGeometry``. Here we +# will sepcify the coordinate the ``EngineerngCameraFrame``, but if you +# have enough information to do the coordinate transform, you could use +# ``ICRS`` coordinates and overlay star positions. ``CameraDisplay`` will +# convert the coordinate you pass in to the ``Frame`` of the display +# automatically (if sufficient frame attributes are set). +# +# Note that the parameter ``keep_old`` is False by default, meaning adding +# a new point will clear the previous ones (useful for animations, but +# perhaps unexpected for a static plot). Set it to ``True`` to plot +# multiple markers. +# + +plt.figure(figsize=(6, 6)) +disp = CameraDisplay(geom, image=image, cmap="gray_r") + +coord = c.SkyCoord(x=0.5 * u.m, y=0.7 * u.m, frame=geom.frame) +coord_in_another_frame = c.SkyCoord(x=0.5 * u.m, y=0.7 * u.m, frame=CameraFrame()) +disp.overlay_coordinate(coord, markersize=20, marker="*") +disp.overlay_coordinate( + coord_in_another_frame, markersize=20, marker="*", keep_old=True +) + + +###################################################################### +# Generating an animation +# ----------------------- +# +# Here we will make an animation of fake events by re-using a single +# display (much faster than generating a new one each time) +# + +from IPython import display +from matplotlib.animation import FuncAnimation + +subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") +geom = subarray.tel[1].camera.geometry + +fov = 1.0 +maxwid = 0.05 +maxlen = 0.1 + +fig, ax = plt.subplots(1, 1, figsize=(8, 6)) +disp = CameraDisplay(geom, ax=ax) # we only need one display (it can be re-used) +disp.cmap = "inferno" +disp.add_colorbar(ax=ax) + + +def update(frame): + """this function will be called for each frame of the animation""" + x, y = np.random.uniform(-fov, fov, size=2) + width = np.random.uniform(0.01, maxwid) + length = np.random.uniform(width, maxlen) + angle = np.random.uniform(0, 180) + intens = width * length * (5e4 + 1e5 * np.random.exponential(2)) + + model = toymodel.Gaussian( + x=x * u.m, + y=y * u.m, + width=width * u.m, + length=length * u.m, + psi=angle * u.deg, + ) + image, _, _ = model.generate_image( + geom, + intensity=intens, + nsb_level_pe=5, + ) + disp.image = image + + +# Create the animation and convert to a displayable video: +anim = FuncAnimation(fig, func=update, frames=10, interval=200) +plt.close(fig) # so it doesn't display here +video = anim.to_html5_video() +display.display(display.HTML(video)) + + +###################################################################### +# Using CameraDisplays interactively +# ---------------------------------- +# +# ``CameraDisplays`` can be used interactivly whe displayed in a window, +# and also when using Jupyter notebooks/lab with appropriate backends. +# +# When this is the case, the same ``CameraDisplay`` object can be re-used. +# We can’t show this here in the documentation, but creating an animation +# when in a matplotlib window is quite easy! Try this in an interactive +# ipython session: +# +# Running interactive displays in a matplotlib window +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# .. code:: sh +# +# ipython -i --maplotlib=auto +# +# That will open an ipython session with matplotlib graphics in a separate +# thread, meaning that you can type code and interact with plots +# simultaneneously. +# +# In the ipython session try running the following code and you will see +# an animation (here in the documentation, it will of course be static) +# +# First we load some real data so we have a nice image to view: +# + +import matplotlib.pyplot as plt +import numpy as np + +from ctapipe.io import EventSource +from ctapipe.visualization import CameraDisplay + +DATA = "dataset://gamma_20deg_0deg_run1___cta-prod5-lapalma_desert-2158m-LaPalma-dark_100evts.simtel.zst" + +with EventSource( + DATA, + max_events=1, + focal_length_choice="EQUIVALENT", +) as source: + event = next(iter(source)) + +tel_id = list(event.r0.tel.keys())[0] +geom = source.subarray.tel[tel_id].camera.geometry +waveform = event.r0.tel[tel_id].waveform +n_chan, n_pix, n_samp = waveform.shape + + +###################################################################### +# Running the following the will bring up a window and animate the shower +# image as a function of time. +# + +disp = CameraDisplay(geom) + +for ii in range(n_samp): + disp.image = waveform[0, :, ii] + plt.pause(0.1) # this lets matplotlib re-draw the scene + + +###################################################################### +# The output will be similar to the static animation created as follows: +# + +fig, ax = plt.subplots(1, 1) +disp = CameraDisplay(geom, ax=ax) +disp.add_colorbar() +disp.autoscale = False + + +def draw_sample(frame): + ax.set_title(f"sample: {frame}") + disp.set_limits_minmax(200, 400) + disp.image = waveform[0, :, frame] + + +anim = FuncAnimation(fig, func=draw_sample, frames=n_samp, interval=100) +plt.close(fig) # so it doesn't display here +video = anim.to_html5_video() +display.display(display.HTML(video)) + + +###################################################################### +# Making it clickable +# ~~~~~~~~~~~~~~~~~~~ +# +# Also when running in a window, you can enable the +# ``disp.enable_pixel_picker()`` option. This will then allow the user to +# click a pixel and a function will run. By default the function simply +# prints the pixel and value to stdout, however you can override the +# function ``on_pixel_clicked(pix_id)`` to do anything you want by making +# a subclass +# + + +class MyCameraDisplay(CameraDisplay): + def on_pixel_clicked(self, pix_id): + print(f"{pix_id=} has value {self.image[pix_id]:.2f}") + + +disp = MyCameraDisplay(geom, image=image) +disp.enable_pixel_picker() + + +###################################################################### +# then, when a user clicks a pixel it would print: +# +# :: +# +# pixel 5 has value 2.44 +# diff --git a/examples/tutorials/README.txt b/examples/tutorials/README.txt new file mode 100644 index 00000000000..58f643a3722 --- /dev/null +++ b/examples/tutorials/README.txt @@ -0,0 +1,6 @@ +.. _tutorials_gallery: + +Tutorials gallery +================= + +This gallery contains different tutorials of different use cases for ctapipe. diff --git a/examples/tutorials/calibrated_data_exploration.py b/examples/tutorials/calibrated_data_exploration.py new file mode 100644 index 00000000000..da235ebe648 --- /dev/null +++ b/examples/tutorials/calibrated_data_exploration.py @@ -0,0 +1,206 @@ +""" +Explore Calibrated Data +======================= + +""" + +import numpy as np +from astropy import units as u +from matplotlib import pyplot as plt + +import ctapipe +from ctapipe.instrument import CameraGeometry +from ctapipe.io import EventSeeker, EventSource +from ctapipe.utils.datasets import get_dataset_path +from ctapipe.visualization import CameraDisplay + +# %matplotlib inline +plt.style.use("ggplot") + +print(ctapipe.__version__) +print(ctapipe.__file__) + + +###################################################################### +# Let’s first open a raw event file and get an event out of it: +# + +filename = get_dataset_path("gamma_prod5.simtel.zst") +source = EventSource(filename, max_events=2) + +for event in source: + print(event.index.event_id) + +filename + +source + +event + +print(event.r1) + + +###################################################################### +# Perform basic calibration: +# -------------------------- +# +# Here we will use a ``CameraCalibrator`` which is just a simple wrapper +# that runs the three calibraraton and trace-integration phases of the +# pipeline, taking the data from levels: +# +# **R0** → **R1** → **DL0** → **DL1** +# +# You could of course do these each separately, by using the classes +# ``R1Calibrator``, ``DL0Reducer``, and ``DL1Calibrator``. Note that we +# have not specified any configuration to the ``CameraCalibrator``, so it +# will be using the default algorithms and thresholds, other than +# specifying that the product is a “HESSIOR1Calibrator” (hopefully in the +# near future that will be automatic). +# + +from ctapipe.calib import CameraCalibrator + +calib = CameraCalibrator(subarray=source.subarray) +calib(event) + + +###################################################################### +# Now the *r1*, *dl0* and *dl1* containers are filled in the event +# +# - **r1.tel[x]**: contains the “r1-calibrated” waveforms, after +# gain-selection, pedestal subtraciton, and gain-correction +# - **dl0.tel[x]**: is the same but with optional data volume reduction +# (some pixels not filled), in this case this is not performed by +# default, so it is the same as r1 +# - **dl1.tel[x]**: contains the (possibly re-calibrated) waveforms as +# dl0, but also the time-integrated *image* that has been calculated +# using a ``ImageExtractor`` (a ``NeighborPeakWindowSum`` by default) +# + +for tel_id in event.dl1.tel: + print("TEL{:03}: {}".format(tel_id, source.subarray.tel[tel_id])) + print(" - r0 wave shape : {}".format(event.r0.tel[tel_id].waveform.shape)) + print(" - r1 wave shape : {}".format(event.r1.tel[tel_id].waveform.shape)) + print(" - dl1 image shape : {}".format(event.dl1.tel[tel_id].image.shape)) + + +###################################################################### +# Some image processing: +# ---------------------- +# +# Let’s look at the image +# + +from ctapipe.visualization import CameraDisplay + +tel_id = sorted(event.r1.tel.keys())[1] +sub = source.subarray +geometry = sub.tel[tel_id].camera.geometry +image = event.dl1.tel[tel_id].image + +disp = CameraDisplay(geometry, image=image) + +from ctapipe.image import hillas_parameters, tailcuts_clean + +mask = tailcuts_clean( + geometry, + image, + picture_thresh=10, + boundary_thresh=5, + min_number_picture_neighbors=2, +) +cleaned = image.copy() +cleaned[~mask] = 0 +disp = CameraDisplay(geometry, image=cleaned) + +params = hillas_parameters(geometry, cleaned) +print(params) +params + +params = hillas_parameters(geometry, cleaned) + +plt.figure(figsize=(10, 10)) +disp = CameraDisplay(geometry, image=image) +disp.add_colorbar() +disp.overlay_moments(params, color="red", lw=3) +disp.highlight_pixels(mask, color="white", alpha=0.3, linewidth=2) + +plt.xlim(params.x.to_value(u.m) - 0.5, params.x.to_value(u.m) + 0.5) +plt.ylim(params.y.to_value(u.m) - 0.5, params.y.to_value(u.m) + 0.5) + +source.metadata + + +###################################################################### +# More complex image processing: +# ------------------------------ +# +# Let’s now explore how stereo reconstruction works. +# +# first, look at a summed image from multiple telescopes +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# For this, we want to use a ``CameraDisplay`` again, but since we can’t +# sum and display images with different cameras, we’ll just sub-select +# images from a particular camera type +# +# These are the telescopes that are in this event: +# + +tels_in_event = set( + event.dl1.tel.keys() +) # use a set here, so we can intersect it later +tels_in_event + +cam_ids = set(sub.get_tel_ids_for_type("MST_MST_NectarCam")) +cam_ids + +cams_in_event = tels_in_event.intersection(cam_ids) +first_tel_id = list(cams_in_event)[0] +tel = sub.tel[first_tel_id] +print("{}s in event: {}".format(tel, cams_in_event)) + + +###################################################################### +# Now, let’s sum those images: +# + +image_sum = np.zeros_like( + tel.camera.geometry.pix_x.value +) # just make an array of 0's in the same shape as the camera + +for tel_id in cams_in_event: + image_sum += event.dl1.tel[tel_id].image + + +###################################################################### +# And finally display the sum of those images +# + +plt.figure(figsize=(8, 8)) + +disp = CameraDisplay(tel.camera.geometry, image=image_sum) +disp.overlay_moments(params, with_label=False) +plt.title("Sum of {}x {}".format(len(cams_in_event), tel)) + + +###################################################################### +# let’s also show which telescopes those were. Note that currently +# ArrayDisplay’s value field is a vector by ``tel_index``, not ``tel_id``, +# so we have to convert to a tel_index. (this may change in a future +# version to be more user-friendly) +# + +from ctapipe.visualization import ArrayDisplay + +nectarcam_subarray = sub.select_subarray(cam_ids, name="NectarCam") + +hit_pattern = np.zeros(shape=nectarcam_subarray.n_tels) +hit_pattern[[nectarcam_subarray.tel_indices[x] for x in cams_in_event]] = 100 + +plt.set_cmap(plt.cm.Accent) +plt.figure(figsize=(8, 8)) + +ad = ArrayDisplay(nectarcam_subarray) +ad.values = hit_pattern +ad.add_labels() diff --git a/examples/tutorials/coordinates_example.py b/examples/tutorials/coordinates_example.py new file mode 100644 index 00000000000..87cac268fa4 --- /dev/null +++ b/examples/tutorials/coordinates_example.py @@ -0,0 +1,414 @@ +""" +Coordinates usage in ctapipe +============================ + +""" + +import copy + +import astropy.units as u +import matplotlib.pyplot as plt +import numpy as np +from astropy.coordinates import AltAz, SkyCoord + +from ctapipe.calib import CameraCalibrator +from ctapipe.coordinates import ( + CameraFrame, + GroundFrame, + NominalFrame, + TelescopeFrame, + TiltedGroundFrame, +) +from ctapipe.io import EventSource +from ctapipe.utils import get_dataset_path +from ctapipe.visualization import ArrayDisplay + +# %matplotlib inline + + +# make plots and fonts larger +plt.rcParams["figure.figsize"] = (12, 8) +plt.rcParams["font.size"] = 16 + + +###################################################################### +# Open test dataset +# ----------------- +# + +filename = get_dataset_path("gamma_prod5.simtel.zst") +source = EventSource(filename) + +events = [copy.deepcopy(event) for event in source] +event = events[4] + +layout = set(source.subarray.tel_ids) + + +###################################################################### +# Choose event with LST +# ~~~~~~~~~~~~~~~~~~~~~ +# + + +###################################################################### +# This ensures that the telescope is not “parked” (as it would be in an +# event where it is not triggered) but is actually pointing to a source. +# + +print(f"Telescope with data: {event.r1.tel.keys()}") +tel_id = 3 + + +###################################################################### +# AltAz +# ----- +# +# See `Astropy Docs on +# AltAz `__. +# +# Pointing direction of telescopes or the origin of a simulated shower are +# described in the ``AltAz`` frame. This is a local, angular coordinate +# frame, with angles ``altitude`` and ``azimuth``. Altitude is the +# measured from the Horizon (0°) to the Zenith (90°). For the azimuth, +# there are different conventions. In Astropy und thus ctapipe, Azimuth is +# oriented East of North (i.e., N=0°, E=90°). +# + +from astropy.coordinates import EarthLocation +from astropy.time import Time + +obstime = Time("2013-11-01T03:00") +location = EarthLocation.of_site("Roque de los Muchachos") + +altaz = AltAz(location=location, obstime=obstime) + +array_pointing = SkyCoord( + alt=event.pointing.array_azimuth, + az=event.pointing.array_altitude, + frame=altaz, +) + +print(array_pointing) + + +###################################################################### +# CameraFrame +# ----------- +# +# Camera coordinate frame. +# +# The camera frame is a 2d cartesian frame, describing position of objects +# in the focal plane of the telescope. +# +# The frame is defined as in H.E.S.S., starting at the horizon, the +# telescope is pointed to magnetic north in azimuth and then up to zenith. +# +# Now, x points north and y points west, so in this orientation, the +# camera coordinates line up with the CORSIKA ground coordinate system. +# +# MAGIC and FACT use a different camera coordinate system: Standing at the +# dish, looking at the camera, x points right, y points up. To transform +# MAGIC/FACT to ctapipe, do x’ = -y, y’ = -x. +# +# **Typical usage**: Position of pixels in the focal plane. +# + +geometry = source.subarray.tel[tel_id].camera.geometry +pix_x = geometry.pix_x +pix_y = geometry.pix_y +focal_length = source.subarray.tel[tel_id].optics.equivalent_focal_length + +telescope_pointing = SkyCoord( + alt=event.pointing.tel[tel_id].altitude, + az=event.pointing.tel[tel_id].azimuth, + frame=altaz, +) + +camera_frame = CameraFrame( + focal_length=focal_length, + rotation=0 * u.deg, + telescope_pointing=telescope_pointing, +) + +cam_coords = SkyCoord(x=pix_x, y=pix_y, frame=camera_frame) + +print(cam_coords) + +plt.scatter(cam_coords.x, cam_coords.y) +plt.title(f"Camera type: {geometry.name}") +plt.xlabel(f"x / {cam_coords.x.unit}") +plt.ylabel(f"y / {cam_coords.y.unit}") +plt.axis("square") + + +###################################################################### +# The implementation of the coordinate system with astropy makes it easier +# to use time of the observation and location of the observing site, to +# understand, for example which stars are visible during a certain night +# and how they might be visible in the camera. +# + +from ctapipe.instrument import SubarrayDescription +from ctapipe.visualization import CameraDisplay + +location = EarthLocation.of_site("Roque de los Muchachos") +obstime = Time("2018-11-01T04:00") + +crab = SkyCoord.from_name("crab nebula") + +altaz = AltAz(location=location, obstime=obstime) + +pointing = crab.transform_to(altaz) + +camera_frame = CameraFrame( + telescope_pointing=pointing, + focal_length=focal_length, + obstime=obstime, + location=location, +) + + +subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") +cam = subarray.tel[1].camera.geometry +fig, ax = plt.subplots() +display = CameraDisplay(cam, ax=ax) + +ax.set_title( + f"La Palma, {obstime}, az={pointing.az.deg:.1f}°, zenith={pointing.zen.deg:.1f}°, camera={geometry.name}" +) + +for i, name in enumerate(["crab nebula", "o tau", "zet tau"]): + star = SkyCoord.from_name(name) + star_cam = star.transform_to(camera_frame) + + x = star_cam.x.to_value(u.m) + y = star_cam.y.to_value(u.m) + + ax.plot(x, y, marker="*", color=f"C{i}") + ax.annotate( + name, + xy=(x, y), + xytext=(5, 5), + textcoords="offset points", + color=f"C{i}", + ) + +plt.show() + + +###################################################################### +# TelescopeFrame +# -------------- +# +# Telescope coordinate frame. A ``Frame`` using a +# ``UnitSphericalRepresentation``. +# +# This is basically the same as a ``HorizonCoordinate``, but the origin is +# at the telescope’s pointing direction. This is what astropy calls a +# ``SkyOffsetFrame``. +# +# The axis of the telescope frame, ``fov_lon`` and ``fov_lat``, are +# aligned with the horizontal system’s azimuth and altitude respectively. +# +# Pointing corrections should applied to the transformation between this +# frame and the camera frame. +# + +telescope_frame = TelescopeFrame( + telescope_pointing=pointing, + obstime=pointing.obstime, + location=pointing.location, +) +telescope_coords = cam_coords.transform_to(telescope_frame) + +wrap_angle = telescope_pointing.az + 180 * u.deg + +plt.axis("equal") +plt.scatter( + telescope_coords.fov_lon.deg, telescope_coords.fov_lat.deg, alpha=0.2, color="gray" +) + + +for i, name in enumerate(["crab nebula", "o tau", "zet tau"]): + star = SkyCoord.from_name(name) + star_tel = star.transform_to(telescope_frame) + + plt.plot(star_tel.fov_lon.deg, star_tel.fov_lat.deg, "*", ms=10) + plt.annotate( + name, + xy=(star_tel.fov_lon.deg, star_tel.fov_lat.deg), + xytext=(5, 5), + textcoords="offset points", + color=f"C{i}", + ) + +plt.xlabel("fov_lon / {}".format(telescope_coords.altaz.az.unit)) +plt.ylabel("fov_lat / {}".format(telescope_coords.altaz.alt.unit)) + + +###################################################################### +# NominalFrame +# ------------ +# +# Nominal coordinate frame. A Frame using a +# ``UnitSphericalRepresentation``. This is basically the same as a +# ``HorizonCoordinate``, but the origin is at an arbitray position in the +# sky. This is what astropy calls a ``SkyOffsetFrame`` If the telescopes +# are in divergent pointing, this ``Frame`` can be used to transform to a +# common system. - 2D reconstruction (``HillasIntersector``) is performed +# in this frame - 3D reconstruction (``HillasReconstructor``) doesn’t need +# this frame +# + + +###################################################################### +# Let’s play a bit with 3 LSTs with divergent pointing +# + +location = EarthLocation.of_site("Roque de los Muchachos") +obstime = Time("2018-11-01T02:00") +altaz = AltAz(location=location, obstime=obstime) + +crab = SkyCoord.from_name("crab nebula") + +# let's observe crab +array_pointing = crab.transform_to(altaz) + + +# let the telescopes point to different positions +alt_offsets = u.Quantity([1, -1, -1], u.deg) +az_offsets = u.Quantity([0, -2, +2], u.deg) + + +tel_pointings = SkyCoord( + alt=array_pointing.alt + alt_offsets, + az=array_pointing.az + az_offsets, + frame=altaz, +) + +camera_frames = CameraFrame( + telescope_pointing=tel_pointings, # multiple pointings, so we get multiple frames + focal_length=focal_length, + obstime=obstime, + location=location, +) + +nom_frame = NominalFrame(origin=array_pointing, obstime=obstime, location=location) + +fig, ax = plt.subplots(figsize=(15, 10)) +ax.set_aspect(1) + +for i in range(3): + cam_coord = SkyCoord(x=pix_x, y=pix_y, frame=camera_frames[i]) + nom_coord = cam_coord.transform_to(nom_frame) + + ax.scatter( + x=nom_coord.fov_lon.deg, + y=nom_coord.fov_lat.deg, + label=f"Telescope {i + 1}", + s=30, + alpha=0.15, + ) + + +for i, name in enumerate(["Crab", "o tau", "zet tau"]): + s = SkyCoord.from_name(name) + s_nom = s.transform_to(nom_frame) + ax.plot( + s_nom.fov_lon.deg, + s_nom.fov_lat.deg, + "*", + ms=10, + ) + ax.annotate( + name, + xy=(s_nom.fov_lon.deg, s_nom.fov_lat.deg), + xytext=(5, 5), + textcoords="offset points", + color=f"C{i}", + ) + + +ax.set_xlabel(f"fov_lon / deg") +ax.set_ylabel(f"fov_lat / deg") + +ax.legend() +plt.show() + + +###################################################################### +# GroundFrame +# ----------- +# +# Ground coordinate frame. The ground coordinate frame is a simple +# cartesian frame describing the 3 dimensional position of objects +# compared to the array ground level in relation to the nomial centre of +# the array. Typically this frame will be used for describing the position +# on telescopes and equipment +# +# **Typical usage**: positions of telescopes on the ground (x, y, z) +# + +source.subarray.peek() + + +###################################################################### +# In case a layout is selected, the following line will produce a +# different output from the picture above. +# + +source.subarray.select_subarray(layout, name="Prod3b layout").peek() + + +###################################################################### +# .. figure:: ground_frame.png +# :alt: Ground Frame +# +# Ground Frame +# + + +###################################################################### +# In this image all the telescope from the ``gamma_test.simtel.gz`` file +# are plotted as spheres in the GroundFrame. +# + + +###################################################################### +# TiltedGroundFrame +# ----------------- +# + + +###################################################################### +# Tilted ground coordinate frame. +# +# The tilted ground coordinate frame is a cartesian system describing the +# 2 dimensional projected positions of objects in a tilted plane described +# by pointing_direction. The plane is rotated along the z_axis by the +# azimuth of the ``pointing_direction`` and then it is inclined with an +# angle equal to the zenith angle of the ``pointing_direction``. +# +# This frame is used for the reconstruction of the shower core position. +# + + +###################################################################### +# .. figure:: tilted_ground_frame.png +# :alt: Tilted Ground Frame +# +# Tilted Ground Frame +# + + +###################################################################### +# This image picture both the telescopes in the GroundFrame (red) and in +# the TiltedGroundFrame (green) are displayed: in this case since the +# azimuth of the ``pointing_direction`` is 0 degrees, then the plane is +# just tilted according to the zenith angle. +# +# For playing with these and with more 3D models of the telescopes +# themselves, have a look at the +# `CREED_VTK `__ library. +# diff --git a/examples/tutorials/ctapipe_handson.py b/examples/tutorials/ctapipe_handson.py new file mode 100644 index 00000000000..a09e5d55051 --- /dev/null +++ b/examples/tutorials/ctapipe_handson.py @@ -0,0 +1,254 @@ +""" +Getting Started with ctapipe +============================ + +This hands-on was presented at the Paris CTA Consoritum meeting (K. +Kosack) + +""" + + +###################################################################### +# Part 1: load and loop over data +# ------------------------------- +# + +import numpy as np +from matplotlib import pyplot as plt + +from ctapipe import utils +from ctapipe.io import EventSource + +# %matplotlib inline + +path = utils.get_dataset_path("gamma_prod5.simtel.zst") + +source = EventSource(path, max_events=5) + +for event in source: + print(event.count, event.index.event_id, event.simulation.shower.energy) + +event + +event.r1 + +for event in EventSource(path, max_events=5): + print(event.count, event.r1.tel.keys()) + +event.r0.tel[3] + +r0tel = event.r0.tel[3] + +r0tel.waveform + +r0tel.waveform.shape + + +###################################################################### +# note that this is (:math:`N_{channels}`, :math:`N_{pixels}`, +# :math:`N_{samples}`) +# + +plt.pcolormesh(r0tel.waveform[0]) + +brightest_pixel = np.argmax(r0tel.waveform[0].sum(axis=1)) +print(f"pixel {brightest_pixel} has sum {r0tel.waveform[0,1535].sum()}") + +plt.plot(r0tel.waveform[0,brightest_pixel], label="channel 0 (high-gain)") +plt.plot(r0tel.waveform[1,brightest_pixel], label="channel 1 (low-gain)") +plt.legend() + +from ipywidgets import interact + + +@interact +def view_waveform(chan=0, pix_id=brightest_pixel): + plt.plot(r0tel.waveform[chan, pix_id]) + + +###################################################################### +# try making this compare 2 waveforms +# + + +###################################################################### +# Part 2: Explore the instrument description +# ------------------------------------------ +# +# This is all well and good, but we don’t really know what camera or +# telescope this is… how do we get instrumental description info? +# +# Currently this is returned *inside* the event (it will soon change to be +# separate in next version or so) +# + +subarray = source.subarray + +subarray + +subarray.peek() + +subarray.to_table() + +subarray.tel[2] + +subarray.tel[2].camera + +subarray.tel[2].optics + +tel = subarray.tel[2] + +tel.camera + +tel.optics + +tel.camera.geometry.pix_x + +tel.camera.geometry.to_table() + +tel.optics.mirror_area + +from ctapipe.visualization import CameraDisplay + +disp = CameraDisplay(tel.camera.geometry) + +disp = CameraDisplay(tel.camera.geometry) +disp.image = r0tel.waveform[0,:,10] # display channel 0, sample 0 (try others like 10) + + +###################################################################### +# \*\* aside: \*\* show demo using a CameraDisplay in interactive mode in +# ipython rather than notebook +# + + +###################################################################### +# Part 3: Apply some calibration and trace integration +# ---------------------------------------------------- +# + +from ctapipe.calib import CameraCalibrator + +calib = CameraCalibrator(subarray=subarray) + +for event in EventSource(path, max_events=5): + calib(event) # fills in r1, dl0, and dl1 + print(event.dl1.tel.keys()) + +event.dl1.tel[3] + +dl1tel = event.dl1.tel[3] + +dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855 + +dl1tel.peak_time + +CameraDisplay(tel.camera.geometry, image=dl1tel.image) + +CameraDisplay(tel.camera.geometry, image=dl1tel.peak_time) + + +###################################################################### +# Now for Hillas Parameters +# + +from ctapipe.image import hillas_parameters, tailcuts_clean + +image = dl1tel.image +mask = tailcuts_clean(tel.camera.geometry, image, picture_thresh=10, boundary_thresh=5) +mask + +CameraDisplay(tel.camera.geometry, image=mask) + +cleaned = image.copy() +cleaned[~mask] = 0 + +disp = CameraDisplay(tel.camera.geometry, image=cleaned) +disp.cmap = plt.cm.coolwarm +disp.add_colorbar() +plt.xlim(0.5, 1.0) +plt.ylim(-1.0, 0.0) + +params = hillas_parameters(tel.camera.geometry, cleaned) +print(params) + +disp = CameraDisplay(tel.camera.geometry, image=cleaned) +disp.cmap = plt.cm.coolwarm +disp.add_colorbar() +plt.xlim(0.5, 1.0) +plt.ylim(-1.0, 0.0) +disp.overlay_moments(params, color='white', lw=2) + + +###################################################################### +# Part 4: Let’s put it all together: +# ---------------------------------- +# +# - loop over events, selecting only telescopes of the same type +# (e.g. LST:LSTCam) +# - for each event, apply calibration/trace integration +# - calculate Hillas parameters +# - write out all hillas paremeters to a file that can be loaded with +# Pandas +# + + +###################################################################### +# first let’s select only those telescopes with LST:LSTCam +# + +subarray.telescope_types + +subarray.get_tel_ids_for_type("LST_LST_LSTCam") + + +###################################################################### +# Now let’s write out program +# + +data = utils.get_dataset_path("gamma_prod5.simtel.zst") +source = EventSource(data) # remove the max_events limit to get more stats + +for event in source: + calib(event) + + for tel_id, tel_data in event.dl1.tel.items(): + tel = source.subarray.tel[tel_id] + mask = tailcuts_clean(tel.camera.geometry, tel_data.image) + if np.count_nonzero(mask) > 0: + params = hillas_parameters(tel.camera.geometry[mask], tel_data.image[mask]) + +from ctapipe.io import HDF5TableWriter + +with HDF5TableWriter(filename='hillas.h5', group_name='dl1', overwrite=True) as writer: + + source = EventSource(data, allowed_tels=[1,2,3,4], max_events=10) + for event in source: + calib(event) + + for tel_id, tel_data in event.dl1.tel.items(): + tel = source.subarray.tel[tel_id] + mask = tailcuts_clean(tel.camera.geometry, tel_data.image) + params = hillas_parameters(tel.camera.geometry[mask], tel_data.image[mask]) + writer.write("hillas", params) + + +###################################################################### +# We can now load in the file we created and plot it +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# + +!ls *.h5 + +import pandas as pd + +hillas = pd.read_hdf("hillas.h5", key='/dl1/hillas') +hillas + +_ = hillas.hist(figsize=(8,8)) + + +###################################################################### +# If you do this yourself, chose a larger file to loop over more events to +# get better statistics +# \ No newline at end of file diff --git a/examples/tutorials/ctapipe_overview.py b/examples/tutorials/ctapipe_overview.py new file mode 100644 index 00000000000..7266aac8f0a --- /dev/null +++ b/examples/tutorials/ctapipe_overview.py @@ -0,0 +1,675 @@ +""" +Analyzing Events Using ctapipe +============================== + +""" + + +###################################################################### +# .. container:: +# +# .. raw:: html +# +#

+# +# Initially presented @ LST Analysis Bootcamp +# +# .. raw:: html +# +#

+# +# .. raw:: html +# +#

+# +# Padova, 26.11.2018 +# +# .. raw:: html +# +#

+# +# .. raw:: html +# +#

+# +# Maximilian Nöthe (@maxnoe) & Kai A. Brügge (@mackaiver) +# +# .. raw:: html +# +#

+# + +import matplotlib.pyplot as plt +import numpy as np + +# %matplotlib inline + +plt.rcParams["figure.figsize"] = (12, 8) +plt.rcParams["font.size"] = 14 +plt.rcParams["figure.figsize"] + + +###################################################################### +# .. raw:: html +# +#

+# +# Table of Contents +# +# .. raw:: html +# +#

+# +# .. container:: +# :name: toc +# + + +###################################################################### +# General Information +# ------------------- +# + + +###################################################################### +# Design +# ~~~~~~ +# +# - DL0 → DL3 analysis +# +# - Currently some R0 → DL2 code to be able to analyze simtel files +# +# - ctapipe is built upon the Scientific Python Stack, core dependencies +# are +# +# - numpy +# - scipy +# - astropy +# - numba +# + + +###################################################################### +# Developement +# ~~~~~~~~~~~~ +# +# - ctapipe is developed as Open Source Software (BSD 3-Clause License) +# at https://github.com/cta-observatory/ctapipe +# +# - We use the “Github-Workflow”: +# +# - Few people (e.g. @kosack, @maxnoe) have write access to the main +# repository +# - Contributors fork the main repository and work on branches +# - Pull Requests are merged after Code Review and automatic execution +# of the test suite +# +# - Early developement stage ⇒ backwards-incompatible API changes might +# and will happen +# + + +###################################################################### +# What’s there? +# ~~~~~~~~~~~~~ +# +# - Reading simtel simulation files +# - Simple calibration, cleaning and feature extraction functions +# - Camera and Array plotting +# - Coordinate frames and transformations +# - Stereo-reconstruction using line intersections +# + + +###################################################################### +# What’s still missing? +# ~~~~~~~~~~~~~~~~~~~~~ +# +# - Good integration with machine learning techniques +# - IRF calculation +# - Documentation, e.g. formal definitions of coordinate frames +# + + +###################################################################### +# What can you do? +# ~~~~~~~~~~~~~~~~ +# +# - Report issues +# +# - Hard to get started? Tell us where you are stuck +# - Tell user stories +# - Missing features +# +# - Start contributing +# +# - ctapipe needs more workpower +# - Implement new reconstruction features +# + + +###################################################################### +# A simple hillas analysis +# ------------------------ +# + + +###################################################################### +# Reading in simtel files +# ~~~~~~~~~~~~~~~~~~~~~~~ +# + +from ctapipe.io import EventSource +from ctapipe.utils.datasets import get_dataset_path + +input_url = get_dataset_path("gamma_prod5.simtel.zst") + +# EventSource() automatically detects what kind of file we are giving it, +# if already supported by ctapipe +source = EventSource(input_url, max_events=5) + +print(type(source)) + +for event in source: + print( + "Id: {}, E = {:1.3f}, Telescopes: {}".format( + event.count, event.simulation.shower.energy, len(event.r0.tel) + ) + ) + + +###################################################################### +# Each event is a ``DataContainer`` holding several ``Field``\ s of data, +# which can be containers or just numbers. Let’s look a one event: +# + +event + +source.subarray.camera_types + +len(event.r0.tel), len(event.r1.tel) + + +###################################################################### +# Data calibration +# ~~~~~~~~~~~~~~~~ +# +# The ``CameraCalibrator`` calibrates the event (obtaining the ``dl1`` +# images). +# + +from ctapipe.calib import CameraCalibrator + +calibrator = CameraCalibrator(subarray=source.subarray) + +calibrator(event) + + +###################################################################### +# Event displays +# ~~~~~~~~~~~~~~ +# +# Let’s use ctapipe’s plotting facilities to plot the telescope images +# + +event.dl1.tel.keys() + +tel_id = 130 + +geometry = source.subarray.tel[tel_id].camera.geometry +dl1 = event.dl1.tel[tel_id] + +geometry, dl1 + +dl1.image + +from ctapipe.visualization import CameraDisplay + +display = CameraDisplay(geometry) + +# right now, there might be one image per gain channel. +# This will change as soon as +display.image = dl1.image +display.add_colorbar() + + +###################################################################### +# Image Cleaning +# ~~~~~~~~~~~~~~ +# + +from ctapipe.image.cleaning import tailcuts_clean + +# unoptimized cleaning levels +cleaning_level = { + "CHEC": (2, 4, 2), + "LSTCam": (3.5, 7, 2), + "FlashCam": (3.5, 7, 2), + "NectarCam": (4, 8, 2), +} + +boundary, picture, min_neighbors = cleaning_level[geometry.name] + +clean = tailcuts_clean( + geometry, + dl1.image, + boundary_thresh=boundary, + picture_thresh=picture, + min_number_picture_neighbors=min_neighbors, +) + +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5)) + +d1 = CameraDisplay(geometry, ax=ax1) +d2 = CameraDisplay(geometry, ax=ax2) + +ax1.set_title("Image") +d1.image = dl1.image +d1.add_colorbar(ax=ax1) + +ax2.set_title("Pulse Time") +d2.image = dl1.peak_time - np.average(dl1.peak_time, weights=dl1.image) +d2.cmap = "RdBu_r" +d2.add_colorbar(ax=ax2) +d2.set_limits_minmax(-20, 20) + +d1.highlight_pixels(clean, color="red", linewidth=1) + + +###################################################################### +# Image Parameters +# ~~~~~~~~~~~~~~~~ +# + +from ctapipe.image import ( + camera_to_shower_coordinates, + concentration_parameters, + hillas_parameters, + leakage_parameters, + number_of_islands, + timing_parameters, +) + +hillas = hillas_parameters(geometry[clean], dl1.image[clean]) + +print(hillas) + +display = CameraDisplay(geometry) + +# set "unclean" pixels to 0 +cleaned = dl1.image.copy() +cleaned[~clean] = 0.0 + +display.image = cleaned +display.add_colorbar() + +display.overlay_moments(hillas, color="xkcd:red") + +timing = timing_parameters(geometry, dl1.image, dl1.peak_time, hillas, clean) + +print(timing) + +long, trans = camera_to_shower_coordinates( + geometry.pix_x, geometry.pix_y, hillas.x, hillas.y, hillas.psi +) + +plt.plot(long[clean], dl1.peak_time[clean], "o") +plt.plot(long[clean], timing.slope * long[clean] + timing.intercept) + +l = leakage_parameters(geometry, dl1.image, clean) +print(l) + +disp = CameraDisplay(geometry) +disp.image = dl1.image +disp.highlight_pixels(geometry.get_border_pixel_mask(1), linewidth=2, color="xkcd:red") + +n_islands, island_id = number_of_islands(geometry, clean) + +print(n_islands) + +conc = concentration_parameters(geometry, dl1.image, hillas) +print(conc) + + +###################################################################### +# Putting it all together / Stereo reconstruction +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# All these steps are now unified in several components configurable +# through the config system, mainly: +# +# - CameraCalibrator for DL0 → DL1 (Images) +# - ImageProcessor for DL1 (Images) → DL1 (Parameters) +# - ShowerProcessor for stereo reconstruction of the shower geometry +# - DataWriter for writing data into HDF5 +# +# A command line tool doing these steps and writing out data in HDF5 +# format is available as ``ctapipe-process`` +# + +import tempfile +from copy import deepcopy + +import astropy.units as u +from astropy.coordinates import AltAz, SkyCoord +from traitlets.config import Config + +from ctapipe.calib import CameraCalibrator +from ctapipe.containers import ImageParametersContainer +from ctapipe.image import ImageProcessor +from ctapipe.io import DataWriter, EventSource +from ctapipe.reco import ShowerProcessor +from ctapipe.utils.datasets import get_dataset_path + +image_processor_config = Config( + { + "ImageProcessor": { + "image_cleaner_type": "TailcutsImageCleaner", + "TailcutsImageCleaner": { + "picture_threshold_pe": [ + ("type", "LST_LST_LSTCam", 7.5), + ("type", "MST_MST_FlashCam", 8), + ("type", "MST_MST_NectarCam", 8), + ("type", "SST_ASTRI_CHEC", 7), + ], + "boundary_threshold_pe": [ + ("type", "LST_LST_LSTCam", 5), + ("type", "MST_MST_FlashCam", 4), + ("type", "MST_MST_NectarCam", 4), + ("type", "SST_ASTRI_CHEC", 4), + ], + }, + } + } +) + +input_url = get_dataset_path("gamma_prod5.simtel.zst") +source = EventSource(input_url) + +calibrator = CameraCalibrator(subarray=source.subarray) +image_processor = ImageProcessor( + subarray=source.subarray, config=image_processor_config +) +shower_processor = ShowerProcessor(subarray=source.subarray) +horizon_frame = AltAz() + +f = tempfile.NamedTemporaryFile(suffix=".hdf5") + +with DataWriter( + source, output_path=f.name, overwrite=True, write_showers=True +) as writer: + + for event in source: + energy = event.simulation.shower.energy + n_telescopes_r1 = len(event.r1.tel) + event_id = event.index.event_id + print(f"Id: {event_id}, E = {energy:1.3f}, Telescopes (R1): {n_telescopes_r1}") + + calibrator(event) + image_processor(event) + shower_processor(event) + + stereo = event.dl2.stereo.geometry["HillasReconstructor"] + if stereo.is_valid: + print(" Alt: {:.2f}°".format(stereo.alt.deg)) + print(" Az: {:.2f}°".format(stereo.az.deg)) + print(" Hmax: {:.0f}".format(stereo.h_max)) + print(" CoreX: {:.1f}".format(stereo.core_x)) + print(" CoreY: {:.1f}".format(stereo.core_y)) + print(" Multiplicity: {:d}".format(len(stereo.telescopes))) + + # save a nice event for plotting later + if event.count == 3: + plotting_event = deepcopy(event) + + writer(event) + +import pandas as pd +from astropy.coordinates.angle_utilities import angular_separation + +from ctapipe.io import TableLoader + +loader = TableLoader(f.name, load_dl2=True, load_simulated=True) + +events = loader.read_subarray_events() + +theta = angular_separation( + events["HillasReconstructor_az"].quantity, + events["HillasReconstructor_alt"].quantity, + events["true_az"].quantity, + events["true_alt"].quantity, +) + +plt.hist(theta.to_value(u.deg) ** 2, bins=25, range=[0, 0.3]) +plt.xlabel(r"$\theta² / deg²$") +None + + +###################################################################### +# ArrayDisplay +# ------------ +# + +from ctapipe.visualization import ArrayDisplay + +angle_offset = plotting_event.pointing.array_azimuth + +plotting_hillas = { + tel_id: dl1.parameters.hillas for tel_id, dl1 in plotting_event.dl1.tel.items() +} + +plotting_core = { + tel_id: dl1.parameters.core.psi for tel_id, dl1 in plotting_event.dl1.tel.items() +} + + +disp = ArrayDisplay(source.subarray) + +disp.set_line_hillas(plotting_hillas, plotting_core, 500) + +plt.scatter( + plotting_event.simulation.shower.core_x, + plotting_event.simulation.shower.core_y, + s=200, + c="k", + marker="x", + label="True Impact", +) +plt.scatter( + plotting_event.dl2.stereo.geometry["HillasReconstructor"].core_x, + plotting_event.dl2.stereo.geometry["HillasReconstructor"].core_y, + s=200, + c="r", + marker="x", + label="Estimated Impact", +) + +plt.legend() +# plt.xlim(-400, 400) +# plt.ylim(-400, 400) + + +###################################################################### +# Reading the LST dl1 data +# ~~~~~~~~~~~~~~~~~~~~~~~~ +# + +loader = TableLoader(f.name, load_simulated=True, load_dl1_parameters=True) + +dl1_table = loader.read_telescope_events(["LST_LST_LSTCam"]) + +plt.scatter( + np.log10(dl1_table["true_energy"].quantity / u.TeV), + np.log10(dl1_table["hillas_intensity"]), +) +plt.xlabel("log10(E / TeV)") +plt.ylabel("log10(intensity)") +None + + +###################################################################### +# Isn’t python slow? +# ------------------ +# +# - Many of you might have heard: “Python is slow”. +# - That’s trueish. +# - All python objects are classes living on the heap, even integers. +# - Looping over lots of “primitives” is quite slow compared to other +# languages. +# +# | ⇒ Vectorize as much as possible using numpy +# | ⇒ Use existing interfaces to fast C / C++ / Fortran code +# | ⇒ Optimize using numba +# +# **But: “Premature Optimization is the root of all evil” — Donald Knuth** +# +# So profile to find exactly what is slow. +# +# Why use python then? +# ~~~~~~~~~~~~~~~~~~~~ +# +# - Python works very well as *glue* for libraries of all kinds of +# languages +# - Python has a rich ecosystem for data science, physics, algorithms, +# astronomy +# +# Example: Number of Islands +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Find all groups of pixels, that survived the cleaning +# + +from ctapipe.image import toymodel +from ctapipe.instrument import SubarrayDescription + +geometry = loader.subarray.tel[1].camera.geometry + + +###################################################################### +# Let’s create a toy images with several islands; +# + +np.random.seed(42) + +image = np.zeros(geometry.n_pixels) + + +for i in range(9): + + model = toymodel.Gaussian( + x=np.random.uniform(-0.8, 0.8) * u.m, + y=np.random.uniform(-0.8, 0.8) * u.m, + width=np.random.uniform(0.05, 0.075) * u.m, + length=np.random.uniform(0.1, 0.15) * u.m, + psi=np.random.uniform(0, 2 * np.pi) * u.rad, + ) + + new_image, sig, bg = model.generate_image( + geometry, intensity=np.random.uniform(1000, 3000), nsb_level_pe=5 + ) + image += new_image + +clean = tailcuts_clean( + geometry, + image, + picture_thresh=10, + boundary_thresh=5, + min_number_picture_neighbors=2, +) + +disp = CameraDisplay(geometry) +disp.image = image +disp.highlight_pixels(clean, color="xkcd:red", linewidth=1.5) +disp.add_colorbar() + + +def num_islands_python(camera, clean): + """A breadth first search to find connected islands of neighboring pixels in the cleaning set""" + + # the camera geometry has a [n_pixel, n_pixel] boolean array + # that is True where two pixels are neighbors + neighbors = camera.neighbor_matrix + + island_ids = np.zeros(camera.n_pixels) + current_island = 0 + + # a set to remember which pixels we already visited + visited = set() + + # go only through the pixels, that survived cleaning + for pix_id in np.where(clean)[0]: + if pix_id not in visited: + # remember that we already checked this pixel + visited.add(pix_id) + + # if we land in the outer loop again, we found a new island + current_island += 1 + island_ids[pix_id] = current_island + + # now check all neighbors of the current pixel recursively + to_check = set(np.where(neighbors[pix_id] & clean)[0]) + while to_check: + pix_id = to_check.pop() + + if pix_id not in visited: + visited.add(pix_id) + island_ids[pix_id] = current_island + + to_check.update(np.where(neighbors[pix_id] & clean)[0]) + + n_islands = current_island + return n_islands, island_ids + + +n_islands, island_ids = num_islands_python(geometry, clean) + +from matplotlib.colors import ListedColormap + +cmap = plt.get_cmap("Paired") +cmap = ListedColormap(cmap.colors[:n_islands]) +cmap.set_under("k") + +disp = CameraDisplay(geometry) +disp.image = island_ids +disp.cmap = cmap +disp.set_limits_minmax(0.5, n_islands + 0.5) +disp.add_colorbar() + +# %timeit num_islands_python(geometry, clean) + +from scipy.sparse.csgraph import connected_components + + +def num_islands_scipy(geometry, clean): + neighbors = geometry.neighbor_matrix_sparse + + clean_neighbors = neighbors[clean][:, clean] + num_islands, labels = connected_components(clean_neighbors, directed=False) + + island_ids = np.zeros(geometry.n_pixels) + island_ids[clean] = labels + 1 + + return num_islands, island_ids + + +n_islands_s, island_ids_s = num_islands_scipy(geometry, clean) + +disp = CameraDisplay(geometry) +disp.image = island_ids_s +disp.cmap = cmap +disp.set_limits_minmax(0.5, n_islands_s + 0.5) +disp.add_colorbar() + +# %timeit num_islands_scipy(geometry, clean) + + +###################################################################### +# **A lot less code, and a factor 3 speed improvement** +# + + +###################################################################### +# Finally, current ctapipe implementation is using numba: +# + +# %timeit number_of_islands(geometry, clean) diff --git a/examples/tutorials/ground_frame.png b/examples/tutorials/ground_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..9545a1dfd67d055d5e677906e96240cc5f598c9c GIT binary patch literal 100340 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%0A~VBlqG<^ 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

$t0tDZ-%VnmZBHMHy&|ch!{B+2&IUZ?qej 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 300 + +widths = np.array( + [ + 8, + ] +) # peak widths to search for (let's fix it at 8 samples, about the width of the peak) +peaks = [signal.find_peaks_cwt(trace, widths) for trace in data[has_signal]] + +for p, s in zip(pix_ids[has_signal], peaks): + print("pix{} has peaks at sample {}".format(p, s)) + plt.plot(data[p], drawstyle="steps-mid") + plt.scatter(np.array(s), data[p, s]) + + +###################################################################### +# clearly the signal needs to be filtered first, or an appropriate wavelet +# used, but the idea is nice +# diff --git a/examples/tutorials/theta_square.py b/examples/tutorials/theta_square.py new file mode 100644 index 00000000000..1e5dc881653 --- /dev/null +++ b/examples/tutorials/theta_square.py @@ -0,0 +1,77 @@ +""" +Make a theta-square plot +======================== + +This is a basic example to analyze some events and make a +:math:`\Theta^2` plot + +""" + +# %matplotlib inline + +import matplotlib.pyplot as plt +import numpy as np +from astropy import units as u +from astropy.coordinates import AltAz, SkyCoord +from astropy.coordinates.angle_utilities import angular_separation +from tqdm.auto import tqdm + +from ctapipe.calib import CameraCalibrator +from ctapipe.image import ImageProcessor +from ctapipe.io import EventSource +from ctapipe.reco import ShowerProcessor + +###################################################################### +# Get source events in MC dataset. +# + +source = EventSource( + "dataset://gamma_prod5.simtel.zst", + # allowed_tels={1, 2, 3, 4}, +) + +subarray = source.subarray + +calib = CameraCalibrator(subarray=subarray) +image_processor = ImageProcessor(subarray=subarray) +shower_processor = ShowerProcessor(subarray=subarray) + +off_angles = [] + +for event in tqdm(source): + + # calibrating the event + calib(event) + image_processor(event) + shower_processor(event) + + reco_result = event.dl2.stereo.geometry["HillasReconstructor"] + + # get angular offset between reconstructed shower direction and MC + # generated shower direction + true_shower = event.simulation.shower + off_angle = angular_separation( + true_shower.az, true_shower.alt, reco_result.az, reco_result.alt + ) + + # Appending all estimated off angles + off_angles.append(off_angle.to(u.deg).value) + + +###################################################################### +# calculate theta square for angles which are not nan +# + +off_angles = np.array(off_angles) +thetasquare = off_angles[np.isfinite(off_angles)] ** 2 + + +###################################################################### +# Plot the results +# ---------------- +# + +plt.hist(thetasquare, bins=10, range=[0, 0.4]) +plt.xlabel(r"$\theta^2$ (deg)") +plt.ylabel("# of events") +plt.show() diff --git a/examples/tutorials/tilted_ground_frame.png b/examples/tutorials/tilted_ground_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..084f6e0ec0d07f92524447132685cfb97ac7bd66 GIT binary patch literal 129772 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

8%N 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 literal 0 HcmV?d00001 From 1cf97b9722b89cab851ba5dfdcfc972f547d74fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Thu, 6 Jul 2023 12:11:37 +0200 Subject: [PATCH 106/264] copy pngs --- docs/conf.py | 2 +- examples/examples/README.txt | 6 ++ .../algorithms/convert_images_to_2d.py | 2 - examples/examples/algorithms/dilate_image.py | 2 - .../examples/algorithms/nd_interpolation.py | 4 +- .../examples/core/InstrumentDescription.py | 7 +- examples/examples/core/Tools.py | 11 +-- examples/examples/core/containers.py | 46 +++++----- examples/examples/core/table_writer_reader.py | 75 ++++++++-------- .../examples/visualization/array_display.py | 26 ++---- .../examples/visualization/camera_display.py | 14 ++- .../tutorials/calibrated_data_exploration.py | 11 +-- examples/tutorials/coordinates_example.py | 26 ++---- examples/tutorials/ctapipe_handson.py | 85 ++++++++++--------- examples/tutorials/ctapipe_overview.py | 82 ++++++------------ examples/tutorials/raw_data_exploration.py | 6 +- examples/tutorials/theta_square.py | 3 +- 17 files changed, 170 insertions(+), 238 deletions(-) create mode 100644 examples/examples/README.txt diff --git a/docs/conf.py b/docs/conf.py index 854b46773d6..14e9f567bc1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -154,7 +154,7 @@ def setup(app): "tutorials", ], # path to where to save gallery generated output "nested_sections": True, - "copyfile_regex": r"index.rst", + "copyfile_regex": r"index.rst|.*\.png", } diff --git a/examples/examples/README.txt b/examples/examples/README.txt new file mode 100644 index 00000000000..d3c2423283f --- /dev/null +++ b/examples/examples/README.txt @@ -0,0 +1,6 @@ +.. _examples_gallery: + +Examples gallery +================ + +The examples gallery provides an overview of different ctapipe modules and how to use them. diff --git a/examples/examples/algorithms/convert_images_to_2d.py b/examples/examples/algorithms/convert_images_to_2d.py index 4817580d1b1..040baeab210 100644 --- a/examples/examples/algorithms/convert_images_to_2d.py +++ b/examples/examples/algorithms/convert_images_to_2d.py @@ -9,8 +9,6 @@ from ctapipe.image.toymodel import Gaussian from ctapipe.instrument import SubarrayDescription -from ctapipe.io import EventSource -from ctapipe.utils import get_dataset_path from ctapipe.visualization import CameraDisplay # get the subarray from an example file diff --git a/examples/examples/algorithms/dilate_image.py b/examples/examples/algorithms/dilate_image.py index 9b6de53e237..b2d827d27cb 100644 --- a/examples/examples/algorithms/dilate_image.py +++ b/examples/examples/algorithms/dilate_image.py @@ -49,8 +49,6 @@ # Now dialte the mask a few times: # -from ctapipe.image.cleaning import dilate - def show_dilate(mask, times=1): m = mask.copy() diff --git a/examples/examples/algorithms/nd_interpolation.py b/examples/examples/algorithms/nd_interpolation.py index 19b0b06e386..d830f7a2d11 100644 --- a/examples/examples/algorithms/nd_interpolation.py +++ b/examples/examples/algorithms/nd_interpolation.py @@ -119,7 +119,7 @@ ) plt.title("Raw table, uninterpolated {0}".format(energy_table.hist.T.shape)) cb = plt.colorbar() -cb.set_label("$\log_{10}(E/\mathrm{TeV})$") +cb.set_label(r"$\log_{10}(E/\mathrm{TeV})$") # the interpolated table plt.subplot(1, 2, 2) @@ -130,7 +130,7 @@ plt.ylabel("Impact Dist(m)") plt.title("Interpolated to a ({0}, {0}) grid".format(N)) cb = plt.colorbar() -cb.set_label("$\log_{10}(E/\mathrm{TeV})$") +cb.set_label(r"$\log_{10}(E/\mathrm{TeV})$") plt.tight_layout() plt.show() diff --git a/examples/examples/core/InstrumentDescription.py b/examples/examples/core/InstrumentDescription.py index ac4a5ccc1bd..fc3857a9855 100644 --- a/examples/examples/core/InstrumentDescription.py +++ b/examples/examples/core/InstrumentDescription.py @@ -8,10 +8,11 @@ """ -import numpy as np +from astropy.coordinates import SkyCoord from ctapipe.io import EventSource from ctapipe.utils.datasets import get_dataset_path +from ctapipe.visualization import CameraDisplay filename = get_dataset_path("gamma_prod5.simtel.zst") @@ -71,7 +72,6 @@ tel.camera.geometry.pix_x # %matplotlib inline -from ctapipe.visualization import CameraDisplay CameraDisplay(tel.camera.geometry) @@ -106,9 +106,6 @@ subarray.optics_types -from astropy.coordinates import SkyCoord - -from ctapipe.coordinates import GroundFrame center = SkyCoord("10.0 m", "2.0 m", "0.0 m", frame="groundframe") coords = subarray.tel_coords # a flat list of coordinates by tel_index diff --git a/examples/examples/core/Tools.py b/examples/examples/core/Tools.py index 212b860bcff..d97e0e7fe28 100644 --- a/examples/examples/core/Tools.py +++ b/examples/examples/core/Tools.py @@ -4,23 +4,17 @@ """ -import logging from time import sleep -from astropy import units as u - from ctapipe.core import Component, TelescopeComponent, Tool from ctapipe.core.traits import ( - Dict, - Float, FloatTelescopeParameter, Integer, - List, Path, TraitError, - Unicode, observe, ) +from ctapipe.instrument import SubarrayDescription from ctapipe.utils import get_dataset_path GAMMA_FILE = get_dataset_path("gamma_prod5.simtel.zst") @@ -52,8 +46,6 @@ def do_thing(self): class SecondaryMyComponent(MyComponent): """A second component""" - pass - class AdvancedComponent(Component): """An advanced technique""" @@ -100,7 +92,6 @@ class TelescopeWiseComponent(TelescopeComponent): # one: # -from ctapipe.instrument import SubarrayDescription, TelescopeDescription subarray = SubarrayDescription.read(GAMMA_FILE) subarray.info() diff --git a/examples/examples/core/containers.py b/examples/examples/core/containers.py index de499c57daa..360fcdc45c7 100644 --- a/examples/examples/core/containers.py +++ b/examples/examples/core/containers.py @@ -15,11 +15,13 @@ import numpy as np from astropy import units as u +from ctapipe.containers import SimulatedShowerContainer from ctapipe.core import Container, Field, Map ###################################################################### # Let’s define a few example containers with some dummy fields in them: -# +# + class SubContainer(Container): junk = Field(-1, "Some junk") @@ -59,14 +61,14 @@ class EventContainer(Container): ###################################################################### # Basic features # -------------- -# +# ev = EventContainer() ###################################################################### # Check that default values are automatically filled in -# +# print(ev.event_id) print(ev.sub) @@ -79,23 +81,21 @@ class EventContainer(Container): ###################################################################### # print the dict representation -# +# print(ev) ###################################################################### # We also get docstrings “for free” -# - -?EventContainer - -?SubContainer +# +help(EventContainer) +help(SubContainer) ###################################################################### # values can be set as normal for a class: -# +# ev.event_id = 100 ev.event_id @@ -108,7 +108,7 @@ class EventContainer(Container): ###################################################################### # and we can add a few of these to the parent container inside the tel # dict: -# +# ev.tel[10] = TelContainer() ev.tel[5] = TelContainer() @@ -121,12 +121,15 @@ class EventContainer(Container): ###################################################################### # Be careful to use the ``default_factory`` mechanism for mutable fields, # see this **negative** example: -# +# + class DangerousContainer(Container): image = Field( np.zeros(10), - description="Attention!!!! Globally mutable shared state. Use default_factory instead", + description=( + "Attention!!!! Globally mutable shared state. Use default_factory instead" + ), ) @@ -145,7 +148,7 @@ class DangerousContainer(Container): ###################################################################### # Converion to dictionaries # ------------------------- -# +# ev.as_dict() @@ -155,7 +158,7 @@ class DangerousContainer(Container): ###################################################################### # for serialization to a table, we can even flatten the output into a # single set of columns -# +# ev.as_dict(recursive=True, flatten=True) @@ -163,7 +166,7 @@ class DangerousContainer(Container): ###################################################################### # Setting and clearing values # --------------------------- -# +# ev.tel[5].image[:] = 9 print(ev) @@ -175,11 +178,10 @@ class DangerousContainer(Container): ###################################################################### # look at a pre-defined Container # ------------------------------- -# +# -from ctapipe.containers import SimulatedShowerContainer -?SimulatedShowerContainer +help(SimulatedShowerContainer) shower = SimulatedShowerContainer() shower @@ -188,10 +190,10 @@ class DangerousContainer(Container): ###################################################################### # Container prefixes # ------------------ -# +# # To store the same container in the same table in a file or give more # information, containers support setting a custom prefix: -# +# c1 = SubContainer(junk=5, value=3, prefix="foo") c2 = SubContainer(junk=10, value=9001, prefix="bar") @@ -199,4 +201,4 @@ class DangerousContainer(Container): # create a common dict with data from both containers: d = c1.as_dict(add_prefix=True) d.update(c2.as_dict(add_prefix=True)) -d \ No newline at end of file +d diff --git a/examples/examples/core/table_writer_reader.py b/examples/examples/core/table_writer_reader.py index 6c9e9a6ab4c..d1d122477d3 100644 --- a/examples/examples/core/table_writer_reader.py +++ b/examples/examples/core/table_writer_reader.py @@ -4,7 +4,7 @@ The ``TableWriter``/``TableReader`` sub-classes allow you to write a ``ctapipe.core.Container`` class and its meta-data to an output table. -They treat the ``Field``\ s in the ``Container`` as columns in the +They treat the ``Field``s in the ``Container`` as columns in the output, and automatically generate a schema. Here we will go through an example of writing out data and reading it back with *Pandas*, *PyTables*, and a ``ctapipe.io.TableReader``: @@ -19,22 +19,26 @@ ###################################################################### # Caveats to think about: \* vector columns in Containers *can* be # written, but some lilbraries like Pandas can not read those (so you must -# use pytables or astropy to read outputs that have vector columns) \* -# units are stored in the table metadata, but some libraries like Pandas +# use pytables or astropy to read outputs that have vector columns) +# \* units are stored in the table metadata, but some libraries like Pandas # ignore them and all other metadata -# +# ###################################################################### # Create some example Containers # ------------------------------ -# +# + +import os import numpy as np +import pandas as pd +import tables from astropy import units as u from ctapipe.core import Container, Field -from ctapipe.io import HDF5TableWriter +from ctapipe.io import HDF5TableReader, HDF5TableWriter, read_table class VariousTypesContainer(Container): @@ -50,7 +54,8 @@ class VariousTypesContainer(Container): ###################################################################### # let’s also make a dummy stream (generator) that will create a series of # these containers -# +# + def create_stream(n_event): @@ -66,6 +71,7 @@ def create_stream(n_event): yield data + for data in create_stream(2): for key, val in data.items(): @@ -76,13 +82,13 @@ def create_stream(n_event): ###################################################################### # Writing the Data (and good practices) # ------------------------------------- -# +# ###################################################################### # Always use context managers with IO classes, as they will make sure the # underlying resources are properly closed in case of errors: -# +# try: with HDF5TableWriter("container.h5", group_name="data") as h5_table: @@ -97,20 +103,19 @@ def create_stream(n_event): h5_table.h5file.isopen == False -!ls container.h5 - +print(os.listdir()) ###################################################################### # Appending new Containers # ------------------------ -# +# ###################################################################### # To append some new containers we need to set the writing in append mode # by using: ‘mode=a’. But let’s now first look at what happens if we # don’t. -# +# for i in range(2): @@ -124,14 +129,13 @@ def create_stream(n_event): print(h5_table.h5file) -!rm -f container.h5 - +os.remove("container.h5") ###################################################################### # Ok so the writer destroyed the content of the file each time it opens # the file. Now let’s try to append some data group to it! (using # mode=‘a’) -# +# for i in range(2): @@ -149,7 +153,7 @@ def create_stream(n_event): ###################################################################### # So we can append some data groups. As long as the data group_name does # not already exists. Let’s try to overwrite the data group : data_1 -# +# try: with HDF5TableWriter("container.h5", mode="a", group_name="data_1") as h5_table: @@ -161,7 +165,7 @@ def create_stream(n_event): ###################################################################### # Good ! I cannot overwrite my data. -# +# print(bool(h5_table.h5file.isopen)) @@ -169,34 +173,33 @@ def create_stream(n_event): ###################################################################### # Reading the Data # ---------------- -# +# ###################################################################### # Reading the whole table at once: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# +# # For this, you have several choices. Since we used the HDF5TableWriter in # this example, we have at least these options avilable: -# +# # - Pandas # - PyTables # - Astropy Table -# +# # For other TableWriter implementations, others may be possible (depending # on format) -# +# ###################################################################### # Reading using ``ctapipe.io.read_table`` # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# +# # This is the preferred method, it returns an astropy ``Table`` and # supports keeping track of units, metadata and transformations. -# +# -from ctapipe.io import read_table table = read_table("container.h5", "/data_0/table") table[:5] @@ -207,13 +210,12 @@ def create_stream(n_event): ###################################################################### # Reading with Pandas: # ^^^^^^^^^^^^^^^^^^^^ -# +# # Pandas is a convenient way to read the output. **HOWEVER BE WARNED** # that so far Pandas does not support reading the table *meta-data* or # *units* for colums, so that information is lost! -# +# -import pandas as pd data = pd.read_hdf("container.h5", key="/data_0/table") data.head() @@ -222,9 +224,8 @@ def create_stream(n_event): ###################################################################### # Reading with PyTables # ^^^^^^^^^^^^^^^^^^^^^ -# +# -import tables h5 = tables.open_file("container.h5") table = h5.root["data_0"]["table"] @@ -233,7 +234,7 @@ def create_stream(n_event): ###################################################################### # note that here we can still access the metadata -# +# table.attrs @@ -241,19 +242,17 @@ def create_stream(n_event): ###################################################################### # Reading one-row-at-a-time: # ~~~~~~~~~~~~~~~~~~~~~~~~~~ -# +# ###################################################################### # Rather than using the full-table methods, if you want to read it # row-by-row (e.g. to maintain compatibility with an existing event loop), # you can use a ``TableReader`` instance. -# +# # The advantage here is that units and other metadata are retained and # re-applied -# - -from ctapipe.io import HDF5TableReader +# def read(mode): @@ -271,6 +270,7 @@ def read(mode): print(data.as_dict()) + read("r") read("r+") @@ -278,4 +278,3 @@ def read(mode): read("a") read("w") - diff --git a/examples/examples/visualization/array_display.py b/examples/examples/visualization/array_display.py index 9679cfd9bc3..e5438ae7f7a 100644 --- a/examples/examples/visualization/array_display.py +++ b/examples/examples/visualization/array_display.py @@ -12,9 +12,12 @@ from astropy import units as u from astropy.coordinates import SkyCoord -from ctapipe.containers import HillasParametersContainer -from ctapipe.coordinates import EastingNorthingFrame, GroundFrame +from ctapipe.calib import CameraCalibrator +from ctapipe.coordinates import EastingNorthingFrame +from ctapipe.image import ImageProcessor from ctapipe.instrument import SubarrayDescription +from ctapipe.io import EventSource +from ctapipe.reco import ShowerProcessor from ctapipe.visualization import ArrayDisplay plt.rcParams["figure.figsize"] = (8, 6) @@ -134,17 +137,6 @@ # following example shows its use: # -import matplotlib.pyplot as plt -from astropy.coordinates import SkyCoord -from IPython import display -from matplotlib.animation import FuncAnimation - -from ctapipe.calib import CameraCalibrator -from ctapipe.image import ImageProcessor -from ctapipe.io import EventSource -from ctapipe.reco import ShowerProcessor -from ctapipe.utils import get_dataset_path -from ctapipe.visualization import ArrayDisplay input_url = "dataset://gamma_LaPalma_baseline_20Zd_180Az_prod3b_test.simtel.gz" @@ -161,13 +153,7 @@ def plot_event(event, subarray, ax): true and reconstructed impact position overlaid """ - array_pointing = SkyCoord( - az=event.pointing.array_azimuth, - alt=event.pointing.array_altitude, - frame="altaz", - ) - - angle_offset = event.pointing.array_azimuth + event.pointing.array_azimuth disp = ArrayDisplay(subarray, axes=ax) hillas_dict = {tid: tel.parameters.hillas for tid, tel in event.dl1.tel.items()} diff --git a/examples/examples/visualization/camera_display.py b/examples/examples/visualization/camera_display.py index 7aac6fe6afb..92f66f6d5f5 100644 --- a/examples/examples/visualization/camera_display.py +++ b/examples/examples/visualization/camera_display.py @@ -6,12 +6,16 @@ import astropy.coordinates as c import astropy.units as u -import matplotlib.pylab as plt +import matplotlib.pyplot as plt import numpy as np +from IPython import display +from matplotlib.animation import FuncAnimation +from matplotlib.colors import PowerNorm from ctapipe.coordinates import CameraFrame, EngineeringCameraFrame, TelescopeFrame from ctapipe.image import hillas_parameters, tailcuts_clean, toymodel from ctapipe.instrument import SubarrayDescription +from ctapipe.io import EventSource from ctapipe.visualization import CameraDisplay ###################################################################### @@ -154,7 +158,6 @@ # also provide a custom normalization, for example a ``PowerNorm``: # -from matplotlib.colors import PowerNorm fig, axes = plt.subplots(2, 2, figsize=(14, 10)) norms = ["lin", "log", "symlog", PowerNorm(0.5)] @@ -255,8 +258,6 @@ # display (much faster than generating a new one each time) # -from IPython import display -from matplotlib.animation import FuncAnimation subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") geom = subarray.tel[1].camera.geometry @@ -330,11 +331,6 @@ def update(frame): # First we load some real data so we have a nice image to view: # -import matplotlib.pyplot as plt -import numpy as np - -from ctapipe.io import EventSource -from ctapipe.visualization import CameraDisplay DATA = "dataset://gamma_20deg_0deg_run1___cta-prod5-lapalma_desert-2158m-LaPalma-dark_100evts.simtel.zst" diff --git a/examples/tutorials/calibrated_data_exploration.py b/examples/tutorials/calibrated_data_exploration.py index da235ebe648..caf80a298a1 100644 --- a/examples/tutorials/calibrated_data_exploration.py +++ b/examples/tutorials/calibrated_data_exploration.py @@ -9,10 +9,11 @@ from matplotlib import pyplot as plt import ctapipe -from ctapipe.instrument import CameraGeometry -from ctapipe.io import EventSeeker, EventSource +from ctapipe.calib import CameraCalibrator +from ctapipe.image import hillas_parameters, tailcuts_clean +from ctapipe.io import EventSource from ctapipe.utils.datasets import get_dataset_path -from ctapipe.visualization import CameraDisplay +from ctapipe.visualization import ArrayDisplay, CameraDisplay # %matplotlib inline plt.style.use("ggplot") @@ -58,7 +59,6 @@ # near future that will be automatic). # -from ctapipe.calib import CameraCalibrator calib = CameraCalibrator(subarray=source.subarray) calib(event) @@ -91,7 +91,6 @@ # Let’s look at the image # -from ctapipe.visualization import CameraDisplay tel_id = sorted(event.r1.tel.keys())[1] sub = source.subarray @@ -100,7 +99,6 @@ disp = CameraDisplay(geometry, image=image) -from ctapipe.image import hillas_parameters, tailcuts_clean mask = tailcuts_clean( geometry, @@ -191,7 +189,6 @@ # version to be more user-friendly) # -from ctapipe.visualization import ArrayDisplay nectarcam_subarray = sub.select_subarray(cam_ids, name="NectarCam") diff --git a/examples/tutorials/coordinates_example.py b/examples/tutorials/coordinates_example.py index 87cac268fa4..8e8b18795c4 100644 --- a/examples/tutorials/coordinates_example.py +++ b/examples/tutorials/coordinates_example.py @@ -8,20 +8,14 @@ import astropy.units as u import matplotlib.pyplot as plt -import numpy as np -from astropy.coordinates import AltAz, SkyCoord - -from ctapipe.calib import CameraCalibrator -from ctapipe.coordinates import ( - CameraFrame, - GroundFrame, - NominalFrame, - TelescopeFrame, - TiltedGroundFrame, -) +from astropy.coordinates import AltAz, EarthLocation, SkyCoord +from astropy.time import Time + +from ctapipe.coordinates import CameraFrame, NominalFrame, TelescopeFrame +from ctapipe.instrument import SubarrayDescription from ctapipe.io import EventSource from ctapipe.utils import get_dataset_path -from ctapipe.visualization import ArrayDisplay +from ctapipe.visualization import CameraDisplay # %matplotlib inline @@ -75,8 +69,6 @@ # oriented East of North (i.e., N=0°, E=90°). # -from astropy.coordinates import EarthLocation -from astropy.time import Time obstime = Time("2013-11-01T03:00") location = EarthLocation.of_site("Roque de los Muchachos") @@ -149,8 +141,6 @@ # and how they might be visible in the camera. # -from ctapipe.instrument import SubarrayDescription -from ctapipe.visualization import CameraDisplay location = EarthLocation.of_site("Roque de los Muchachos") obstime = Time("2018-11-01T04:00") @@ -330,8 +320,8 @@ ) -ax.set_xlabel(f"fov_lon / deg") -ax.set_ylabel(f"fov_lat / deg") +ax.set_xlabel("fov_lon / deg") +ax.set_ylabel("fov_lat / deg") ax.legend() plt.show() diff --git a/examples/tutorials/ctapipe_handson.py b/examples/tutorials/ctapipe_handson.py index a09e5d55051..157e97461d9 100644 --- a/examples/tutorials/ctapipe_handson.py +++ b/examples/tutorials/ctapipe_handson.py @@ -11,13 +11,20 @@ ###################################################################### # Part 1: load and loop over data # ------------------------------- -# +# + +import glob import numpy as np +import pandas as pd +from ipywidgets import interact from matplotlib import pyplot as plt from ctapipe import utils -from ctapipe.io import EventSource +from ctapipe.calib import CameraCalibrator +from ctapipe.image import hillas_parameters, tailcuts_clean +from ctapipe.io import EventSource, HDF5TableWriter +from ctapipe.visualization import CameraDisplay # %matplotlib inline @@ -47,19 +54,17 @@ ###################################################################### # note that this is (:math:`N_{channels}`, :math:`N_{pixels}`, # :math:`N_{samples}`) -# +# plt.pcolormesh(r0tel.waveform[0]) brightest_pixel = np.argmax(r0tel.waveform[0].sum(axis=1)) print(f"pixel {brightest_pixel} has sum {r0tel.waveform[0,1535].sum()}") -plt.plot(r0tel.waveform[0,brightest_pixel], label="channel 0 (high-gain)") -plt.plot(r0tel.waveform[1,brightest_pixel], label="channel 1 (low-gain)") +plt.plot(r0tel.waveform[0, brightest_pixel], label="channel 0 (high-gain)") +plt.plot(r0tel.waveform[1, brightest_pixel], label="channel 1 (low-gain)") plt.legend() -from ipywidgets import interact - @interact def view_waveform(chan=0, pix_id=brightest_pixel): @@ -68,21 +73,21 @@ def view_waveform(chan=0, pix_id=brightest_pixel): ###################################################################### # try making this compare 2 waveforms -# +# ###################################################################### # Part 2: Explore the instrument description # ------------------------------------------ -# +# # This is all well and good, but we don’t really know what camera or # telescope this is… how do we get instrumental description info? -# +# # Currently this is returned *inside* the event (it will soon change to be # separate in next version or so) -# +# -subarray = source.subarray +subarray = source.subarray subarray @@ -108,38 +113,38 @@ def view_waveform(chan=0, pix_id=brightest_pixel): tel.optics.mirror_area -from ctapipe.visualization import CameraDisplay disp = CameraDisplay(tel.camera.geometry) disp = CameraDisplay(tel.camera.geometry) -disp.image = r0tel.waveform[0,:,10] # display channel 0, sample 0 (try others like 10) +disp.image = r0tel.waveform[ + 0, :, 10 +] # display channel 0, sample 0 (try others like 10) ###################################################################### # \*\* aside: \*\* show demo using a CameraDisplay in interactive mode in # ipython rather than notebook -# +# ###################################################################### # Part 3: Apply some calibration and trace integration # ---------------------------------------------------- -# +# -from ctapipe.calib import CameraCalibrator calib = CameraCalibrator(subarray=subarray) for event in EventSource(path, max_events=5): - calib(event) # fills in r1, dl0, and dl1 + calib(event) # fills in r1, dl0, and dl1 print(event.dl1.tel.keys()) event.dl1.tel[3] dl1tel = event.dl1.tel[3] -dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855 +dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855 dl1tel.peak_time @@ -150,9 +155,8 @@ def view_waveform(chan=0, pix_id=brightest_pixel): ###################################################################### # Now for Hillas Parameters -# +# -from ctapipe.image import hillas_parameters, tailcuts_clean image = dl1tel.image mask = tailcuts_clean(tel.camera.geometry, image, picture_thresh=10, boundary_thresh=5) @@ -161,7 +165,7 @@ def view_waveform(chan=0, pix_id=brightest_pixel): CameraDisplay(tel.camera.geometry, image=mask) cleaned = image.copy() -cleaned[~mask] = 0 +cleaned[~mask] = 0 disp = CameraDisplay(tel.camera.geometry, image=cleaned) disp.cmap = plt.cm.coolwarm @@ -177,25 +181,25 @@ def view_waveform(chan=0, pix_id=brightest_pixel): disp.add_colorbar() plt.xlim(0.5, 1.0) plt.ylim(-1.0, 0.0) -disp.overlay_moments(params, color='white', lw=2) +disp.overlay_moments(params, color="white", lw=2) ###################################################################### # Part 4: Let’s put it all together: # ---------------------------------- -# +# # - loop over events, selecting only telescopes of the same type # (e.g. LST:LSTCam) # - for each event, apply calibration/trace integration # - calculate Hillas parameters # - write out all hillas paremeters to a file that can be loaded with # Pandas -# +# ###################################################################### # first let’s select only those telescopes with LST:LSTCam -# +# subarray.telescope_types @@ -204,28 +208,27 @@ def view_waveform(chan=0, pix_id=brightest_pixel): ###################################################################### # Now let’s write out program -# +# -data = utils.get_dataset_path("gamma_prod5.simtel.zst") -source = EventSource(data) # remove the max_events limit to get more stats +data = utils.get_dataset_path("gamma_prod5.simtel.zst") +source = EventSource(data) # remove the max_events limit to get more stats for event in source: calib(event) - + for tel_id, tel_data in event.dl1.tel.items(): tel = source.subarray.tel[tel_id] mask = tailcuts_clean(tel.camera.geometry, tel_data.image) if np.count_nonzero(mask) > 0: params = hillas_parameters(tel.camera.geometry[mask], tel_data.image[mask]) -from ctapipe.io import HDF5TableWriter -with HDF5TableWriter(filename='hillas.h5', group_name='dl1', overwrite=True) as writer: - - source = EventSource(data, allowed_tels=[1,2,3,4], max_events=10) +with HDF5TableWriter(filename="hillas.h5", group_name="dl1", overwrite=True) as writer: + + source = EventSource(data, allowed_tels=[1, 2, 3, 4], max_events=10) for event in source: calib(event) - + for tel_id, tel_data in event.dl1.tel.items(): tel = source.subarray.tel[tel_id] mask = tailcuts_clean(tel.camera.geometry, tel_data.image) @@ -236,19 +239,17 @@ def view_waveform(chan=0, pix_id=brightest_pixel): ###################################################################### # We can now load in the file we created and plot it # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# +# +glob.glob("*.h5") -!ls *.h5 - -import pandas as pd -hillas = pd.read_hdf("hillas.h5", key='/dl1/hillas') +hillas = pd.read_hdf("hillas.h5", key="/dl1/hillas") hillas -_ = hillas.hist(figsize=(8,8)) +_ = hillas.hist(figsize=(8, 8)) ###################################################################### # If you do this yourself, chose a larger file to loop over more events to # get better statistics -# \ No newline at end of file +# diff --git a/examples/tutorials/ctapipe_overview.py b/examples/tutorials/ctapipe_overview.py index 7266aac8f0a..0e7866d91e0 100644 --- a/examples/tutorials/ctapipe_overview.py +++ b/examples/tutorials/ctapipe_overview.py @@ -39,8 +39,34 @@ #

# +import tempfile +from copy import deepcopy + +import astropy.units as u import matplotlib.pyplot as plt import numpy as np +from astropy.coordinates import AltAz +from astropy.coordinates.angle_utilities import angular_separation +from matplotlib.colors import ListedColormap +from scipy.sparse.csgraph import connected_components +from traitlets.config import Config + +from ctapipe.calib import CameraCalibrator +from ctapipe.image import ( + ImageProcessor, + camera_to_shower_coordinates, + concentration_parameters, + hillas_parameters, + leakage_parameters, + number_of_islands, + timing_parameters, + toymodel, +) +from ctapipe.image.cleaning import tailcuts_clean +from ctapipe.io import DataWriter, EventSource, TableLoader +from ctapipe.reco import ShowerProcessor +from ctapipe.utils.datasets import get_dataset_path +from ctapipe.visualization import ArrayDisplay, CameraDisplay # %matplotlib inline @@ -49,22 +75,6 @@ plt.rcParams["figure.figsize"] -###################################################################### -# .. raw:: html -# -#

-# -# Table of Contents -# -# .. raw:: html -# -#

-# -# .. container:: -# :name: toc -# - - ###################################################################### # General Information # ------------------- @@ -159,8 +169,6 @@ # ~~~~~~~~~~~~~~~~~~~~~~~ # -from ctapipe.io import EventSource -from ctapipe.utils.datasets import get_dataset_path input_url = get_dataset_path("gamma_prod5.simtel.zst") @@ -198,7 +206,6 @@ # images). # -from ctapipe.calib import CameraCalibrator calibrator = CameraCalibrator(subarray=source.subarray) @@ -223,7 +230,6 @@ dl1.image -from ctapipe.visualization import CameraDisplay display = CameraDisplay(geometry) @@ -238,7 +244,6 @@ # ~~~~~~~~~~~~~~ # -from ctapipe.image.cleaning import tailcuts_clean # unoptimized cleaning levels cleaning_level = { @@ -281,14 +286,6 @@ # ~~~~~~~~~~~~~~~~ # -from ctapipe.image import ( - camera_to_shower_coordinates, - concentration_parameters, - hillas_parameters, - leakage_parameters, - number_of_islands, - timing_parameters, -) hillas = hillas_parameters(geometry[clean], dl1.image[clean]) @@ -316,8 +313,8 @@ plt.plot(long[clean], dl1.peak_time[clean], "o") plt.plot(long[clean], timing.slope * long[clean] + timing.intercept) -l = leakage_parameters(geometry, dl1.image, clean) -print(l) +leakage = leakage_parameters(geometry, dl1.image, clean) +print(leakage) disp = CameraDisplay(geometry) disp.image = dl1.image @@ -347,19 +344,6 @@ # format is available as ``ctapipe-process`` # -import tempfile -from copy import deepcopy - -import astropy.units as u -from astropy.coordinates import AltAz, SkyCoord -from traitlets.config import Config - -from ctapipe.calib import CameraCalibrator -from ctapipe.containers import ImageParametersContainer -from ctapipe.image import ImageProcessor -from ctapipe.io import DataWriter, EventSource -from ctapipe.reco import ShowerProcessor -from ctapipe.utils.datasets import get_dataset_path image_processor_config = Config( { @@ -424,10 +408,6 @@ writer(event) -import pandas as pd -from astropy.coordinates.angle_utilities import angular_separation - -from ctapipe.io import TableLoader loader = TableLoader(f.name, load_dl2=True, load_simulated=True) @@ -450,7 +430,6 @@ # ------------ # -from ctapipe.visualization import ArrayDisplay angle_offset = plotting_event.pointing.array_azimuth @@ -539,8 +518,6 @@ # Find all groups of pixels, that survived the cleaning # -from ctapipe.image import toymodel -from ctapipe.instrument import SubarrayDescription geometry = loader.subarray.tel[1].camera.geometry @@ -623,7 +600,6 @@ def num_islands_python(camera, clean): n_islands, island_ids = num_islands_python(geometry, clean) -from matplotlib.colors import ListedColormap cmap = plt.get_cmap("Paired") cmap = ListedColormap(cmap.colors[:n_islands]) @@ -637,8 +613,6 @@ def num_islands_python(camera, clean): # %timeit num_islands_python(geometry, clean) -from scipy.sparse.csgraph import connected_components - def num_islands_scipy(geometry, clean): neighbors = geometry.neighbor_matrix_sparse diff --git a/examples/tutorials/raw_data_exploration.py b/examples/tutorials/raw_data_exploration.py index b12c35ff70c..3e0ad08f3de 100644 --- a/examples/tutorials/raw_data_exploration.py +++ b/examples/tutorials/raw_data_exploration.py @@ -15,10 +15,10 @@ # Setup: # -from astropy import units as u +import numpy as np from matplotlib import pyplot as plt +from scipy import signal -from ctapipe.instrument import CameraGeometry from ctapipe.io import EventSource from ctapipe.utils import get_dataset_path from ctapipe.visualization import CameraDisplay @@ -278,8 +278,6 @@ # https://docs.scipy.org/doc/scipy/reference/signal.html # -import numpy as np -from scipy import signal pix_ids = np.arange(len(data)) has_signal = sums > 300 diff --git a/examples/tutorials/theta_square.py b/examples/tutorials/theta_square.py index 1e5dc881653..b7f9694383e 100644 --- a/examples/tutorials/theta_square.py +++ b/examples/tutorials/theta_square.py @@ -1,4 +1,4 @@ -""" +r""" Make a theta-square plot ======================== @@ -12,7 +12,6 @@ import matplotlib.pyplot as plt import numpy as np from astropy import units as u -from astropy.coordinates import AltAz, SkyCoord from astropy.coordinates.angle_utilities import angular_separation from tqdm.auto import tqdm From f543881acf2cfeb7137fc989825a20c803fa2986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Thu, 6 Jul 2023 16:57:06 +0200 Subject: [PATCH 107/264] add sphinx_gallery to setup.cfg --- .github/workflows/ci.yml | 2 +- setup.cfg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c7d0abe22c..248d26a8fac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -151,7 +151,7 @@ jobs: - name: Install doc dependencies run: | sudo apt update --yes && sudo apt install --yes git build-essential pandoc graphviz ffmpeg - pip install -U pip towncrier sphinx-gallery + pip install -U pip towncrier pip install -e .[docs] pip install ./test_plugin git describe --tags diff --git a/setup.cfg b/setup.cfg index 767a6b458f6..6b7f6e343a6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -61,6 +61,7 @@ docs = nbsphinx numpydoc sphinx-design + sphinx_gallery jupyter notebook graphviz From 837bacb842e2cbf093d5d00bd93c9fa9f2ec01fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 7 Jul 2023 14:04:51 +0200 Subject: [PATCH 108/264] fix output of cells --- docs/conf.py | 8 +- environment.yml | 1 + .../algorithms/convert_images_to_2d.py | 9 +++ examples/examples/algorithms/dilate_image.py | 1 + .../examples/algorithms/nd_interpolation.py | 8 +- .../examples/core/InstrumentDescription.py | 16 ++++ .../core/{Tools.py => command_line_tools.py} | 29 ++++--- .../examples/core/config.json | 0 examples/examples/core/containers.py | 8 ++ examples/examples/core/provenance.py | 3 + examples/examples/core/table_writer_reader.py | 9 +++ .../examples/visualization/array_display.py | 1 + .../examples/visualization/camera_display.py | 26 +++---- .../tutorials/calibrated_data_exploration.py | 12 ++- examples/tutorials/coordinates_example.py | 6 +- examples/tutorials/ctapipe_handson.py | 43 +++++++++++ examples/tutorials/ctapipe_overview.py | 76 ++++++++++--------- examples/tutorials/raw_data_exploration.py | 7 ++ setup.cfg | 1 + 19 files changed, 196 insertions(+), 68 deletions(-) rename examples/examples/core/{Tools.py => command_line_tools.py} (85%) rename docs/user-guide/examples/Tools.json => examples/examples/core/config.json (100%) diff --git a/docs/conf.py b/docs/conf.py index 14e9f567bc1..9fe4be21003 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -154,7 +154,13 @@ def setup(app): "tutorials", ], # path to where to save gallery generated output "nested_sections": True, - "copyfile_regex": r"index.rst|.*\.png", + "copyfile_regex": r"index.rst|.*\.png|.*\.json", + "filename_pattern": r".*\.py", + "promote_jupyter_magic": True, + "line_numbers": True, + "default_thumb_file": "ctapipe_logo.png", + "pypandoc": True, + "matplotlib_animations": True, } diff --git a/environment.yml b/environment.yml index 11268bb1543..7f0f0dadeed 100644 --- a/environment.yml +++ b/environment.yml @@ -22,6 +22,7 @@ dependencies: - numpy>=1.22 - numpydoc - pandas + - pypandoc - pre-commit - psutil - pytables diff --git a/examples/examples/algorithms/convert_images_to_2d.py b/examples/examples/algorithms/convert_images_to_2d.py index 040baeab210..9903df780f1 100644 --- a/examples/examples/algorithms/convert_images_to_2d.py +++ b/examples/examples/algorithms/convert_images_to_2d.py @@ -11,6 +11,7 @@ from ctapipe.instrument import SubarrayDescription from ctapipe.visualization import CameraDisplay +###################################################################### # get the subarray from an example file subarray = SubarrayDescription.read("dataset://gamma_prod5.simtel.zst") @@ -32,6 +33,7 @@ ) _, image, _ = model.generate_image(geom, intensity=500, nsb_level_pe=3) +###################################################################### CameraDisplay(geom, image) @@ -42,10 +44,13 @@ image_square = geom.image_to_cartesian_representation(image) +###################################################################### plt.imshow(image_square) +###################################################################### image_1d = geom.image_from_cartesian_representation(image_square) +###################################################################### CameraDisplay(geom, image_1d) @@ -66,8 +71,10 @@ ) _, image, _ = model.generate_image(geom, intensity=5000) +###################################################################### CameraDisplay(geom, image) +###################################################################### image_square = geom.image_to_cartesian_representation(image) @@ -82,6 +89,8 @@ plt.imshow(image_square) +###################################################################### image_1d = geom.image_from_cartesian_representation(image_square) +###################################################################### disp = CameraDisplay(geom, image_1d) diff --git a/examples/examples/algorithms/dilate_image.py b/examples/examples/algorithms/dilate_image.py index b2d827d27cb..a5757be43b6 100644 --- a/examples/examples/algorithms/dilate_image.py +++ b/examples/examples/algorithms/dilate_image.py @@ -59,6 +59,7 @@ def show_dilate(mask, times=1): ) +###################################################################### plt.figure(figsize=(18, 3)) for ii in range(0, 6): diff --git a/examples/examples/algorithms/nd_interpolation.py b/examples/examples/algorithms/nd_interpolation.py index d830f7a2d11..21a03057e1a 100644 --- a/examples/examples/algorithms/nd_interpolation.py +++ b/examples/examples/algorithms/nd_interpolation.py @@ -139,8 +139,6 @@ ###################################################################### # In the high-stats central region, we get a nice smooth interpolation # function. Of course we can see that there are a few more steps to take -# before using this table: \* need to deal with cases where the table had -# low stats near the edges (smooth or extrapolate, or set bounds) \* may -# need to smooth the table even where there are sufficient stats, to avoid -# wiggles -# +# before using this table: \* +# - need to deal with cases where the table had low stats near the edges (smooth or extrapolate, or set bounds) +# - may need to smooth the table even where there are sufficient stats, to avoid wiggles diff --git a/examples/examples/core/InstrumentDescription.py b/examples/examples/core/InstrumentDescription.py index fc3857a9855..6d26ab7f9b3 100644 --- a/examples/examples/core/InstrumentDescription.py +++ b/examples/examples/core/InstrumentDescription.py @@ -27,6 +27,7 @@ subarray.info() +###################################################################### subarray.to_table() @@ -61,20 +62,27 @@ tel = subarray.tel[1] tel +###################################################################### tel.optics.mirror_area +###################################################################### tel.optics.n_mirror_tiles +###################################################################### tel.optics.equivalent_focal_length +###################################################################### tel.camera +###################################################################### tel.camera.geometry.pix_x +###################################################################### # %matplotlib inline CameraDisplay(tel.camera.geometry) +###################################################################### CameraDisplay(subarray.tel[98].camera.geometry) @@ -92,6 +100,7 @@ subarray.peek() +###################################################################### subarray.footprint @@ -102,11 +111,14 @@ subarray.telescope_types +###################################################################### subarray.camera_types +###################################################################### subarray.optics_types +###################################################################### center = SkyCoord("10.0 m", "2.0 m", "0.0 m", frame="groundframe") coords = subarray.tel_coords # a flat list of coordinates by tel_index coords.separation(center) @@ -134,8 +146,10 @@ subarray.tel_index_array +###################################################################### subarray.tel_index_array[[1, 5, 23]] +###################################################################### subarray.tel_indices[ 1 ] # this is a dict of tel_id -> tel_index, so we can only do one at once @@ -143,9 +157,11 @@ ids = subarray.get_tel_ids_for_type(subarray.telescope_types[0]) ids +###################################################################### idx = subarray.tel_ids_to_indices(ids) idx +###################################################################### subarray.tel_coords[idx] diff --git a/examples/examples/core/Tools.py b/examples/examples/core/command_line_tools.py similarity index 85% rename from examples/examples/core/Tools.py rename to examples/examples/core/command_line_tools.py index d97e0e7fe28..195a8e880a1 100644 --- a/examples/examples/core/Tools.py +++ b/examples/examples/core/command_line_tools.py @@ -17,6 +17,7 @@ from ctapipe.instrument import SubarrayDescription from ctapipe.utils import get_dataset_path +###################################################################### GAMMA_FILE = get_dataset_path("gamma_prod5.simtel.zst") @@ -80,8 +81,10 @@ class TelescopeWiseComponent(TelescopeComponent): ).tag(config=True) +###################################################################### MyComponent() +###################################################################### AdvancedComponent(infile="test.foo", outfile="out.foo") @@ -96,24 +99,19 @@ class TelescopeWiseComponent(TelescopeComponent): subarray = SubarrayDescription.read(GAMMA_FILE) subarray.info() +###################################################################### TelescopeWiseComponent(subarray=subarray) ###################################################################### # This TelescopeParameters can then be set using a list of patterns like: # -# .. code:: python # -# component.param = [ -# ("type", "LST*",3.0), -# ("type", "MST*", 2.0), -# (id, 25, 4.0) -# ] +# component.param = [("type", "LST*",3.0),("type", "MST*", 2.0),(id, 25, 4.0)] # # These get translated into per-telescope-id values once the subarray is # registered. After that one acccess the per-telescope id values via: # -# .. code:: python # # component.param.tel[tel_id] # @@ -184,6 +182,7 @@ def finish(self): tool = MyTool() tool +###################################################################### tool.print_help() @@ -202,7 +201,6 @@ def finish(self): # specified it’s read from ``sys.argv``, so the following is the same as # running: # -# .. code:: sh # # mytool --log_level=INFO --infile gamma_test.simtel.gz --iterations=3 # @@ -219,6 +217,7 @@ def finish(self): tool.log_format = "%(asctime)s : %(levelname)s [%(name)s %(funcName)s] %(message)s" +###################################################################### try: tool.run( argv=[ @@ -302,30 +301,41 @@ def finish(self): tool2 = MyTool() +###################################################################### try: - tool2.run(argv=["--config", "Tools.json"]) + tool2.run(argv=["--config", "config.json"]) except SystemExit as e: assert e.code == 0, f"Tool returned with error status {e}" +###################################################################### print(tool2.advanced.infile) +###################################################################### print(tool2.config) +###################################################################### tool2.is_setup +###################################################################### tool3 = MyTool() +###################################################################### tool3.is_setup +###################################################################### tool3.initialize(argv=[]) +###################################################################### tool3.is_setup +###################################################################### tool3 +###################################################################### tool.setup() tool +###################################################################### tool.comp2 @@ -336,6 +346,7 @@ def finish(self): tool.get_current_config() +###################################################################### tool.iterations = 12 tool.get_current_config() diff --git a/docs/user-guide/examples/Tools.json b/examples/examples/core/config.json similarity index 100% rename from docs/user-guide/examples/Tools.json rename to examples/examples/core/config.json diff --git a/examples/examples/core/containers.py b/examples/examples/core/containers.py index 360fcdc45c7..82242604b55 100644 --- a/examples/examples/core/containers.py +++ b/examples/examples/core/containers.py @@ -91,6 +91,7 @@ class EventContainer(Container): # help(EventContainer) +###################################################################### help(SubContainer) ###################################################################### @@ -100,8 +101,10 @@ class EventContainer(Container): ev.event_id = 100 ev.event_id +###################################################################### ev.as_dict() # by default only shows the bare items, not sub-containers (See later) +###################################################################### ev.as_dict(recursive=True) @@ -114,6 +117,7 @@ class EventContainer(Container): ev.tel[5] = TelContainer() ev.tel[42] = TelContainer() +###################################################################### # because we are using a default_factory to handle mutable defaults, the images are actually different: ev.tel[42].image is ev.tel[32] @@ -142,6 +146,7 @@ class DangerousContainer(Container): print(c2.image) print(c1.image is c2.image) +###################################################################### ev.tel @@ -152,6 +157,7 @@ class DangerousContainer(Container): ev.as_dict() +###################################################################### ev.as_dict(recursive=True, flatten=False) @@ -171,6 +177,7 @@ class DangerousContainer(Container): ev.tel[5].image[:] = 9 print(ev) +###################################################################### ev.reset() ev.as_dict(recursive=True) @@ -183,6 +190,7 @@ class DangerousContainer(Container): help(SimulatedShowerContainer) +###################################################################### shower = SimulatedShowerContainer() shower diff --git a/examples/examples/core/provenance.py b/examples/examples/core/provenance.py index d3c1d812450..2a5ae103bfe 100644 --- a/examples/examples/core/provenance.py +++ b/examples/examples/core/provenance.py @@ -43,6 +43,7 @@ p.finish_activity() +###################################################################### p.finished_activity_names @@ -110,6 +111,8 @@ def flatten(x, name=""): return out +###################################################################### d = dict(activity=p.provenance) +###################################################################### pprint(flatten_dict(d)) diff --git a/examples/examples/core/table_writer_reader.py b/examples/examples/core/table_writer_reader.py index d1d122477d3..e578c264123 100644 --- a/examples/examples/core/table_writer_reader.py +++ b/examples/examples/core/table_writer_reader.py @@ -41,6 +41,7 @@ from ctapipe.io import HDF5TableReader, HDF5TableWriter, read_table +###################################################################### class VariousTypesContainer(Container): a_int = Field(int, "some int value") @@ -72,6 +73,7 @@ def create_stream(n_event): yield data +###################################################################### for data in create_stream(2): for key, val in data.items(): @@ -103,6 +105,7 @@ def create_stream(n_event): h5_table.h5file.isopen == False +###################################################################### print(os.listdir()) ###################################################################### @@ -129,6 +132,7 @@ def create_stream(n_event): print(h5_table.h5file) +###################################################################### os.remove("container.h5") ###################################################################### @@ -204,6 +208,7 @@ def create_stream(n_event): table = read_table("container.h5", "/data_0/table") table[:5] +###################################################################### table.meta @@ -271,10 +276,14 @@ def read(mode): print(data.as_dict()) +###################################################################### read("r") +###################################################################### read("r+") +###################################################################### read("a") +###################################################################### read("w") diff --git a/examples/examples/visualization/array_display.py b/examples/examples/visualization/array_display.py index e5438ae7f7a..3dff647f7ae 100644 --- a/examples/examples/visualization/array_display.py +++ b/examples/examples/visualization/array_display.py @@ -22,6 +22,7 @@ plt.rcParams["figure.figsize"] = (8, 6) +###################################################################### tel_ids = list(range(1, 5)) + list(range(5, 20)) # just LSTs + one set of MSTs subarray = SubarrayDescription.read( diff --git a/examples/examples/visualization/camera_display.py b/examples/examples/visualization/camera_display.py index 92f66f6d5f5..01d7a18ee36 100644 --- a/examples/examples/visualization/camera_display.py +++ b/examples/examples/visualization/camera_display.py @@ -8,7 +8,6 @@ import astropy.units as u import matplotlib.pyplot as plt import numpy as np -from IPython import display from matplotlib.animation import FuncAnimation from matplotlib.colors import PowerNorm @@ -39,6 +38,7 @@ image, sig, bg = model.generate_image(geom, intensity=1500, nsb_level_pe=10) mask = tailcuts_clean(geom, image, picture_thresh=15, boundary_thresh=5) +###################################################################### geom @@ -297,10 +297,7 @@ def update(frame): # Create the animation and convert to a displayable video: anim = FuncAnimation(fig, func=update, frames=10, interval=200) -plt.close(fig) # so it doesn't display here -video = anim.to_html5_video() -display.display(display.HTML(video)) - +plt.show() ###################################################################### # Using CameraDisplays interactively @@ -308,19 +305,22 @@ def update(frame): # # ``CameraDisplays`` can be used interactivly whe displayed in a window, # and also when using Jupyter notebooks/lab with appropriate backends. -# + +###################################################################### # When this is the case, the same ``CameraDisplay`` object can be re-used. # We can’t show this here in the documentation, but creating an animation # when in a matplotlib window is quite easy! Try this in an interactive # ipython session: # + +###################################################################### # Running interactive displays in a matplotlib window # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # -# .. code:: sh -# -# ipython -i --maplotlib=auto -# +# ipython -i --maplotlib=auto + + +###################################################################### # That will open an ipython session with matplotlib graphics in a separate # thread, meaning that you can type code and interact with plots # simultaneneously. @@ -332,6 +332,7 @@ def update(frame): # +###################################################################### DATA = "dataset://gamma_20deg_0deg_run1___cta-prod5-lapalma_desert-2158m-LaPalma-dark_100evts.simtel.zst" with EventSource( @@ -376,10 +377,7 @@ def draw_sample(frame): anim = FuncAnimation(fig, func=draw_sample, frames=n_samp, interval=100) -plt.close(fig) # so it doesn't display here -video = anim.to_html5_video() -display.display(display.HTML(video)) - +plt.show() ###################################################################### # Making it clickable diff --git a/examples/tutorials/calibrated_data_exploration.py b/examples/tutorials/calibrated_data_exploration.py index caf80a298a1..40d9d4bb202 100644 --- a/examples/tutorials/calibrated_data_exploration.py +++ b/examples/tutorials/calibrated_data_exploration.py @@ -32,12 +32,16 @@ for event in source: print(event.index.event_id) +###################################################################### filename +###################################################################### source +###################################################################### event +###################################################################### print(event.r1) @@ -97,9 +101,10 @@ geometry = sub.tel[tel_id].camera.geometry image = event.dl1.tel[tel_id].image +###################################################################### disp = CameraDisplay(geometry, image=image) - +###################################################################### mask = tailcuts_clean( geometry, image, @@ -111,10 +116,12 @@ cleaned[~mask] = 0 disp = CameraDisplay(geometry, image=cleaned) +###################################################################### params = hillas_parameters(geometry, cleaned) print(params) params +###################################################################### params = hillas_parameters(geometry, cleaned) plt.figure(figsize=(10, 10)) @@ -126,6 +133,7 @@ plt.xlim(params.x.to_value(u.m) - 0.5, params.x.to_value(u.m) + 0.5) plt.ylim(params.y.to_value(u.m) - 0.5, params.y.to_value(u.m) + 0.5) +###################################################################### source.metadata @@ -150,9 +158,11 @@ ) # use a set here, so we can intersect it later tels_in_event +###################################################################### cam_ids = set(sub.get_tel_ids_for_type("MST_MST_NectarCam")) cam_ids +###################################################################### cams_in_event = tels_in_event.intersection(cam_ids) first_tel_id = list(cams_in_event)[0] tel = sub.tel[first_tel_id] diff --git a/examples/tutorials/coordinates_example.py b/examples/tutorials/coordinates_example.py index 8e8b18795c4..3d20aca5735 100644 --- a/examples/tutorials/coordinates_example.py +++ b/examples/tutorials/coordinates_example.py @@ -111,6 +111,7 @@ pix_y = geometry.pix_y focal_length = source.subarray.tel[tel_id].optics.equivalent_focal_length +###################################################################### telescope_pointing = SkyCoord( alt=event.pointing.tel[tel_id].altitude, az=event.pointing.tel[tel_id].azimuth, @@ -127,6 +128,7 @@ print(cam_coords) +###################################################################### plt.scatter(cam_coords.x, cam_coords.y) plt.title(f"Camera type: {geometry.name}") plt.xlabel(f"x / {cam_coords.x.unit}") @@ -212,6 +214,7 @@ ) telescope_coords = cam_coords.transform_to(telescope_frame) +###################################################################### wrap_angle = telescope_pointing.az + 180 * u.deg plt.axis("equal") @@ -286,6 +289,7 @@ nom_frame = NominalFrame(origin=array_pointing, obstime=obstime, location=location) +###################################################################### fig, ax = plt.subplots(figsize=(15, 10)) ax.set_aspect(1) @@ -356,7 +360,6 @@ # :alt: Ground Frame # # Ground Frame -# ###################################################################### @@ -389,7 +392,6 @@ # :alt: Tilted Ground Frame # # Tilted Ground Frame -# ###################################################################### diff --git a/examples/tutorials/ctapipe_handson.py b/examples/tutorials/ctapipe_handson.py index 157e97461d9..455cf88d9ba 100644 --- a/examples/tutorials/ctapipe_handson.py +++ b/examples/tutorials/ctapipe_handson.py @@ -28,26 +28,35 @@ # %matplotlib inline +###################################################################### path = utils.get_dataset_path("gamma_prod5.simtel.zst") +###################################################################### source = EventSource(path, max_events=5) for event in source: print(event.count, event.index.event_id, event.simulation.shower.energy) +###################################################################### event +###################################################################### event.r1 +###################################################################### for event in EventSource(path, max_events=5): print(event.count, event.r1.tel.keys()) +###################################################################### event.r0.tel[3] +###################################################################### r0tel = event.r0.tel[3] +###################################################################### r0tel.waveform +###################################################################### r0tel.waveform.shape @@ -58,14 +67,17 @@ plt.pcolormesh(r0tel.waveform[0]) +###################################################################### brightest_pixel = np.argmax(r0tel.waveform[0].sum(axis=1)) print(f"pixel {brightest_pixel} has sum {r0tel.waveform[0,1535].sum()}") +###################################################################### plt.plot(r0tel.waveform[0, brightest_pixel], label="channel 0 (high-gain)") plt.plot(r0tel.waveform[1, brightest_pixel], label="channel 1 (low-gain)") plt.legend() +###################################################################### @interact def view_waveform(chan=0, pix_id=brightest_pixel): plt.plot(r0tel.waveform[chan, pix_id]) @@ -89,33 +101,47 @@ def view_waveform(chan=0, pix_id=brightest_pixel): subarray = source.subarray +###################################################################### subarray +###################################################################### subarray.peek() +###################################################################### subarray.to_table() +###################################################################### subarray.tel[2] +###################################################################### subarray.tel[2].camera +###################################################################### subarray.tel[2].optics +###################################################################### tel = subarray.tel[2] +###################################################################### tel.camera +###################################################################### tel.optics +###################################################################### tel.camera.geometry.pix_x +###################################################################### tel.camera.geometry.to_table() +###################################################################### tel.optics.mirror_area +###################################################################### disp = CameraDisplay(tel.camera.geometry) +###################################################################### disp = CameraDisplay(tel.camera.geometry) disp.image = r0tel.waveform[ 0, :, 10 @@ -136,20 +162,27 @@ def view_waveform(chan=0, pix_id=brightest_pixel): calib = CameraCalibrator(subarray=subarray) +###################################################################### for event in EventSource(path, max_events=5): calib(event) # fills in r1, dl0, and dl1 print(event.dl1.tel.keys()) +###################################################################### event.dl1.tel[3] +###################################################################### dl1tel = event.dl1.tel[3] +###################################################################### dl1tel.image.shape # note this will be gain-selected in next version, so will be just 1D array of 1855 +###################################################################### dl1tel.peak_time +###################################################################### CameraDisplay(tel.camera.geometry, image=dl1tel.image) +###################################################################### CameraDisplay(tel.camera.geometry, image=dl1tel.peak_time) @@ -162,20 +195,25 @@ def view_waveform(chan=0, pix_id=brightest_pixel): mask = tailcuts_clean(tel.camera.geometry, image, picture_thresh=10, boundary_thresh=5) mask +###################################################################### CameraDisplay(tel.camera.geometry, image=mask) +###################################################################### cleaned = image.copy() cleaned[~mask] = 0 +###################################################################### disp = CameraDisplay(tel.camera.geometry, image=cleaned) disp.cmap = plt.cm.coolwarm disp.add_colorbar() plt.xlim(0.5, 1.0) plt.ylim(-1.0, 0.0) +###################################################################### params = hillas_parameters(tel.camera.geometry, cleaned) print(params) +###################################################################### disp = CameraDisplay(tel.camera.geometry, image=cleaned) disp.cmap = plt.cm.coolwarm disp.add_colorbar() @@ -203,6 +241,7 @@ def view_waveform(chan=0, pix_id=brightest_pixel): subarray.telescope_types +###################################################################### subarray.get_tel_ids_for_type("LST_LST_LSTCam") @@ -213,6 +252,7 @@ def view_waveform(chan=0, pix_id=brightest_pixel): data = utils.get_dataset_path("gamma_prod5.simtel.zst") source = EventSource(data) # remove the max_events limit to get more stats +###################################################################### for event in source: calib(event) @@ -223,6 +263,7 @@ def view_waveform(chan=0, pix_id=brightest_pixel): params = hillas_parameters(tel.camera.geometry[mask], tel_data.image[mask]) +###################################################################### with HDF5TableWriter(filename="hillas.h5", group_name="dl1", overwrite=True) as writer: source = EventSource(data, allowed_tels=[1, 2, 3, 4], max_events=10) @@ -243,9 +284,11 @@ def view_waveform(chan=0, pix_id=brightest_pixel): glob.glob("*.h5") +###################################################################### hillas = pd.read_hdf("hillas.h5", key="/dl1/hillas") hillas +###################################################################### _ = hillas.hist(figsize=(8, 8)) diff --git a/examples/tutorials/ctapipe_overview.py b/examples/tutorials/ctapipe_overview.py index 0e7866d91e0..e96cea70f45 100644 --- a/examples/tutorials/ctapipe_overview.py +++ b/examples/tutorials/ctapipe_overview.py @@ -6,40 +6,13 @@ ###################################################################### -# .. container:: -# -# .. raw:: html -# -#

-# -# Initially presented @ LST Analysis Bootcamp -# -# .. raw:: html -# -#

-# -# .. raw:: html -# -#

-# -# Padova, 26.11.2018 -# -# .. raw:: html -# -#

-# -# .. raw:: html -# -#

-# -# Maximilian Nöthe (@maxnoe) & Kai A. Brügge (@mackaiver) -# -# .. raw:: html -# -#

-# +# Initially presented @ LST Analysis Bootcamp +# in Padova, 26.11.2018 +# by Maximilian Nöthe (@maxnoe) & Kai A. Brügge (@mackaiver) + import tempfile +import timeit from copy import deepcopy import astropy.units as u @@ -70,6 +43,7 @@ # %matplotlib inline +###################################################################### plt.rcParams["figure.figsize"] = (12, 8) plt.rcParams["font.size"] = 14 plt.rcParams["figure.figsize"] @@ -178,6 +152,7 @@ print(type(source)) +###################################################################### for event in source: print( "Id: {}, E = {:1.3f}, Telescopes: {}".format( @@ -193,8 +168,10 @@ event +###################################################################### source.subarray.camera_types +###################################################################### len(event.r0.tel), len(event.r1.tel) @@ -209,6 +186,7 @@ calibrator = CameraCalibrator(subarray=source.subarray) +###################################################################### calibrator(event) @@ -221,16 +199,20 @@ event.dl1.tel.keys() +###################################################################### tel_id = 130 +###################################################################### geometry = source.subarray.tel[tel_id].camera.geometry dl1 = event.dl1.tel[tel_id] geometry, dl1 +###################################################################### dl1.image +###################################################################### display = CameraDisplay(geometry) # right now, there might be one image per gain channel. @@ -253,6 +235,7 @@ "NectarCam": (4, 8, 2), } +###################################################################### boundary, picture, min_neighbors = cleaning_level[geometry.name] clean = tailcuts_clean( @@ -263,6 +246,7 @@ min_number_picture_neighbors=min_neighbors, ) +###################################################################### fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5)) d1 = CameraDisplay(geometry, ax=ax1) @@ -291,6 +275,7 @@ print(hillas) +###################################################################### display = CameraDisplay(geometry) # set "unclean" pixels to 0 @@ -302,10 +287,12 @@ display.overlay_moments(hillas, color="xkcd:red") +###################################################################### timing = timing_parameters(geometry, dl1.image, dl1.peak_time, hillas, clean) print(timing) +###################################################################### long, trans = camera_to_shower_coordinates( geometry.pix_x, geometry.pix_y, hillas.x, hillas.y, hillas.psi ) @@ -313,17 +300,21 @@ plt.plot(long[clean], dl1.peak_time[clean], "o") plt.plot(long[clean], timing.slope * long[clean] + timing.intercept) +###################################################################### leakage = leakage_parameters(geometry, dl1.image, clean) print(leakage) +###################################################################### disp = CameraDisplay(geometry) disp.image = dl1.image disp.highlight_pixels(geometry.get_border_pixel_mask(1), linewidth=2, color="xkcd:red") +###################################################################### n_islands, island_id = number_of_islands(geometry, clean) print(n_islands) +###################################################################### conc = concentration_parameters(geometry, dl1.image, hillas) print(conc) @@ -409,10 +400,12 @@ writer(event) +###################################################################### loader = TableLoader(f.name, load_dl2=True, load_simulated=True) events = loader.read_subarray_events() +###################################################################### theta = angular_separation( events["HillasReconstructor_az"].quantity, events["HillasReconstructor_alt"].quantity, @@ -477,6 +470,7 @@ dl1_table = loader.read_telescope_events(["LST_LST_LSTCam"]) +###################################################################### plt.scatter( np.log10(dl1_table["true_energy"].quantity / u.TeV), np.log10(dl1_table["hillas_intensity"]), @@ -546,6 +540,7 @@ ) image += new_image +###################################################################### clean = tailcuts_clean( geometry, image, @@ -554,12 +549,14 @@ min_number_picture_neighbors=2, ) +###################################################################### disp = CameraDisplay(geometry) disp.image = image disp.highlight_pixels(clean, color="xkcd:red", linewidth=1.5) disp.add_colorbar() +###################################################################### def num_islands_python(camera, clean): """A breadth first search to find connected islands of neighboring pixels in the cleaning set""" @@ -598,9 +595,11 @@ def num_islands_python(camera, clean): return n_islands, island_ids +###################################################################### n_islands, island_ids = num_islands_python(geometry, clean) +###################################################################### cmap = plt.get_cmap("Paired") cmap = ListedColormap(cmap.colors[:n_islands]) cmap.set_under("k") @@ -611,9 +610,11 @@ def num_islands_python(camera, clean): disp.set_limits_minmax(0.5, n_islands + 0.5) disp.add_colorbar() -# %timeit num_islands_python(geometry, clean) +###################################################################### +timeit.timeit(lambda: num_islands_python(geometry, clean), number=1000) / 1000 +###################################################################### def num_islands_scipy(geometry, clean): neighbors = geometry.neighbor_matrix_sparse @@ -626,16 +627,18 @@ def num_islands_scipy(geometry, clean): return num_islands, island_ids +###################################################################### n_islands_s, island_ids_s = num_islands_scipy(geometry, clean) +###################################################################### disp = CameraDisplay(geometry) disp.image = island_ids_s disp.cmap = cmap disp.set_limits_minmax(0.5, n_islands_s + 0.5) disp.add_colorbar() -# %timeit num_islands_scipy(geometry, clean) - +###################################################################### +timeit.timeit(lambda: num_islands_scipy(geometry, clean), number=10000) / 10000 ###################################################################### # **A lot less code, and a factor 3 speed improvement** @@ -646,4 +649,5 @@ def num_islands_scipy(geometry, clean): # Finally, current ctapipe implementation is using numba: # -# %timeit number_of_islands(geometry, clean) +###################################################################### +timeit.timeit(lambda: number_of_islands(geometry, clean), number=100000) / 100000 diff --git a/examples/tutorials/raw_data_exploration.py b/examples/tutorials/raw_data_exploration.py index 3e0ad08f3de..7fa6dc3c6b4 100644 --- a/examples/tutorials/raw_data_exploration.py +++ b/examples/tutorials/raw_data_exploration.py @@ -73,6 +73,7 @@ print(event.simulation.shower) +###################################################################### print(event.r0.tel.keys()) @@ -102,12 +103,16 @@ event.simulation.shower.energy +###################################################################### event.simulation.shower.energy.to("GeV") +###################################################################### event.simulation.shower.energy.to("J") +###################################################################### event.simulation.shower.alt +###################################################################### print("Altitude in degrees:", event.simulation.shower.alt.deg) @@ -198,6 +203,7 @@ peds = data[:, 19:24].mean(axis=1) # mean of samples 20 to 29 for all pixels sums = data[:, 5:9].sum(axis=1) / (13 - 8) # simple sum integration +###################################################################### phist = plt.hist(peds, bins=50, range=[0, 150]) plt.title("Pedestal Distribution of all pixels for a single event") @@ -239,6 +245,7 @@ camgeom = source.subarray.tel[24].camera.geometry +###################################################################### title = "CT24, run {} event {} ped-sub".format(event.index.obs_id, event.index.event_id) disp = CameraDisplay(camgeom, title=title) disp.image = sums - peds diff --git a/setup.cfg b/setup.cfg index 6b7f6e343a6..456cabe3a0d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -68,6 +68,7 @@ docs = pandas ipython ffmpeg-python + pypandoc dev = setuptools_scm[toml] From a5d140ad7737ce7588cfd886df19735f7ad324ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 12:30:34 +0200 Subject: [PATCH 109/264] fix path to logo --- docs/conf.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 9fe4be21003..de105472b71 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -150,15 +150,15 @@ def setup(app): "../examples/tutorials", ], # path to your example scripts "gallery_dirs": [ - "examples", - "tutorials", + "user-guide/examples", + "user-guide/tutorials", ], # path to where to save gallery generated output "nested_sections": True, "copyfile_regex": r"index.rst|.*\.png|.*\.json", "filename_pattern": r".*\.py", "promote_jupyter_magic": True, "line_numbers": True, - "default_thumb_file": "ctapipe_logo.png", + "default_thumb_file": "_static/ctapipe_logo.png", "pypandoc": True, "matplotlib_animations": True, } @@ -216,10 +216,10 @@ def setup(app): ".DS_Store", "**.ipynb_checkpoints", "changes", - "examples/*/*.ipynb", - "examples/*/*.py", - "tutorials/*.ipynb", - "tutorials/*.py", + "user-guide/examples/*/*.ipynb", + "user-guide/examples/*/*.py", + "user-guide/tutorials/*.ipynb", + "user-guide/tutorials/*.py", ] # The name of the Pygments (syntax highlighting) style to use. From 2e49c85525829856f4d679d656b348ac36276d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 12:30:47 +0200 Subject: [PATCH 110/264] typo --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 456cabe3a0d..dbd35656b60 100644 --- a/setup.cfg +++ b/setup.cfg @@ -61,7 +61,7 @@ docs = nbsphinx numpydoc sphinx-design - sphinx_gallery + sphinx-gallery jupyter notebook graphviz From 465a866bfb103f5e9121ab8767ce7de87dc0f517 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 8 Sep 2023 12:32:10 +0200 Subject: [PATCH 111/264] Add missing glob --- docs/developer-guide/ceps/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/developer-guide/ceps/index.rst b/docs/developer-guide/ceps/index.rst index 505e8fe0004..2a31debc2b7 100644 --- a/docs/developer-guide/ceps/index.rst +++ b/docs/developer-guide/ceps/index.rst @@ -25,6 +25,7 @@ Proposed CEPs .. toctree:: :maxdepth: 1 + :glob: proposed/* From 0e9058d6a1c2e05957e50b89617a22034a4d80f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 13:43:01 +0200 Subject: [PATCH 112/264] remove notebooks --- .gitignore | 3 --- docs/user-guide/tutorials/ground_frame.png | Bin 100340 -> 0 bytes .../tutorials/tilted_ground_frame.png | Bin 129772 -> 0 bytes 3 files changed, 3 deletions(-) delete mode 100644 docs/user-guide/tutorials/ground_frame.png delete mode 100644 docs/user-guide/tutorials/tilted_ground_frame.png diff --git a/.gitignore b/.gitignore index e098b72a3dc..9ca4ab0cd26 100644 --- a/.gitignore +++ b/.gitignore @@ -86,7 +86,4 @@ distribute-*.tar.gz target .mypy_cache -examples/notebooks/*.html -examples/notebooks/*.png - provenance.log diff --git a/docs/user-guide/tutorials/ground_frame.png b/docs/user-guide/tutorials/ground_frame.png deleted file mode 100644 index 9545a1dfd67d055d5e677906e96240cc5f598c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100340 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%0A~VBlqG<^ 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

$t0tDZ-%VnmZBHMHy&|ch!{B+2&IUZ?qej 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

8%N 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 From 1753542db3315786aedabe22128e94e55005729b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 13:44:04 +0200 Subject: [PATCH 113/264] create notebook folders --- docs/Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 387d531e5bc..4cbd0908bee 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -15,9 +15,15 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile +%: Makefile examples tutorials @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) +examples: + mkdir user-guide/examples + +tutorials: + mkdir user-guide/tutorials + clean: rm -rf api @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) From 4a4f0bca9fab9670c6f43aac0785089b3fa4afb9 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 8 Sep 2023 13:54:47 +0200 Subject: [PATCH 114/264] Fix wrong toc block commented out --- docs/developer-guide/ceps/index.rst | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/developer-guide/ceps/index.rst b/docs/developer-guide/ceps/index.rst index 2a31debc2b7..dc92c93ad54 100644 --- a/docs/developer-guide/ceps/index.rst +++ b/docs/developer-guide/ceps/index.rst @@ -14,11 +14,11 @@ can be found on GitHub as `pull requests with the "CEP" label`_ . Accepted CEPs ============= -.. .. toctree:: -.. :maxdepth: 1 -.. :glob: +.. toctree:: + :maxdepth: 1 + :glob: -.. accepted/* + accepted/* Proposed CEPs ============= @@ -32,12 +32,11 @@ Proposed CEPs Rejected CEPs ============= -.. - toctree:: - :maxdepth: 1 - :glob: +.. .. toctree:: +.. :maxdepth: 1 +.. :glob: - rejected/* +.. rejected/* .. _pull requests with the "cep" label: https://github.com/cta-observatory/ctapipe/issues?q=label%3ACEP From c6662cd2d13498aac27cd4c70989cec0a5c557d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 14:52:09 +0200 Subject: [PATCH 115/264] flatten structure --- docs/Makefile | 8 +++----- docs/conf.py | 17 ++++++++++++++--- docs/user-guide/index.rst | 1 - examples/examples/index.rst | 9 --------- .../tutorials/README.rst} | 0 .../tutorials/calibrated_data_exploration.py | 0 .../tutorials/coordinates_example.py | 0 .../tutorials/ctapipe_handson.py | 0 .../tutorials/ctapipe_overview.py | 0 .../{ => examples}/tutorials/ground_frame.png | Bin .../tutorials/raw_data_exploration.py | 0 .../{ => examples}/tutorials/theta_square.py | 0 .../tutorials/tilted_ground_frame.png | Bin 13 files changed, 17 insertions(+), 18 deletions(-) delete mode 100644 examples/examples/index.rst rename examples/{tutorials/README.txt => examples/tutorials/README.rst} (100%) rename examples/{ => examples}/tutorials/calibrated_data_exploration.py (100%) rename examples/{ => examples}/tutorials/coordinates_example.py (100%) rename examples/{ => examples}/tutorials/ctapipe_handson.py (100%) rename examples/{ => examples}/tutorials/ctapipe_overview.py (100%) rename examples/{ => examples}/tutorials/ground_frame.png (100%) rename examples/{ => examples}/tutorials/raw_data_exploration.py (100%) rename examples/{ => examples}/tutorials/theta_square.py (100%) rename examples/{ => examples}/tutorials/tilted_ground_frame.png (100%) diff --git a/docs/Makefile b/docs/Makefile index 4cbd0908bee..238eb0226ea 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -15,17 +15,15 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile examples tutorials +%: Makefile examples @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) examples: - mkdir user-guide/examples - -tutorials: - mkdir user-guide/tutorials + mkdir -p user-guide/examples clean: rm -rf api + rm -rf user-guide/examples @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py index de105472b71..9f453a9dbfc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,9 @@ # Get configuration information from setup.cfg from configparser import ConfigParser +# Sphinx gallery +from sphinx_gallery.sorting import ExplicitOrder, FileNameSortKey + import ctapipe setup_cfg = ConfigParser() @@ -144,16 +147,24 @@ def setup(app): ] # Sphinx gallery config + sphinx_gallery_conf = { "examples_dirs": [ "../examples/examples", - "../examples/tutorials", ], # path to your example scripts "gallery_dirs": [ "user-guide/examples", - "user-guide/tutorials", ], # path to where to save gallery generated output - "nested_sections": True, + "subsection_order": ExplicitOrder( + [ + "../examples/examples/algorithms", + "../examples/examples/core", + "../examples/examples/visualization", + "../examples/examples/tutorials", + ] + ), + "within_subsection_order": FileNameSortKey, + "nested_sections": False, "copyfile_regex": r"index.rst|.*\.png|.*\.json", "filename_pattern": r".*\.py", "promote_jupyter_magic": True, diff --git a/docs/user-guide/index.rst b/docs/user-guide/index.rst index 853408d8363..7b738f5c583 100644 --- a/docs/user-guide/index.rst +++ b/docs/user-guide/index.rst @@ -9,6 +9,5 @@ User Guide getting-started tools data_models/index - tutorials/index examples/index FAQ diff --git a/examples/examples/index.rst b/examples/examples/index.rst deleted file mode 100644 index 18496722bf3..00000000000 --- a/examples/examples/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -Examples gallery -================ - -The examples gallery provides an overview of different ctapipe modules and how to use them. - -.. toctree:: - visualization/index - algorithms/index - core/index diff --git a/examples/tutorials/README.txt b/examples/examples/tutorials/README.rst similarity index 100% rename from examples/tutorials/README.txt rename to examples/examples/tutorials/README.rst diff --git a/examples/tutorials/calibrated_data_exploration.py b/examples/examples/tutorials/calibrated_data_exploration.py similarity index 100% rename from examples/tutorials/calibrated_data_exploration.py rename to examples/examples/tutorials/calibrated_data_exploration.py diff --git a/examples/tutorials/coordinates_example.py b/examples/examples/tutorials/coordinates_example.py similarity index 100% rename from examples/tutorials/coordinates_example.py rename to examples/examples/tutorials/coordinates_example.py diff --git a/examples/tutorials/ctapipe_handson.py b/examples/examples/tutorials/ctapipe_handson.py similarity index 100% rename from examples/tutorials/ctapipe_handson.py rename to examples/examples/tutorials/ctapipe_handson.py diff --git a/examples/tutorials/ctapipe_overview.py b/examples/examples/tutorials/ctapipe_overview.py similarity index 100% rename from examples/tutorials/ctapipe_overview.py rename to examples/examples/tutorials/ctapipe_overview.py diff --git a/examples/tutorials/ground_frame.png b/examples/examples/tutorials/ground_frame.png similarity index 100% rename from examples/tutorials/ground_frame.png rename to examples/examples/tutorials/ground_frame.png diff --git a/examples/tutorials/raw_data_exploration.py b/examples/examples/tutorials/raw_data_exploration.py similarity index 100% rename from examples/tutorials/raw_data_exploration.py rename to examples/examples/tutorials/raw_data_exploration.py diff --git a/examples/tutorials/theta_square.py b/examples/examples/tutorials/theta_square.py similarity index 100% rename from examples/tutorials/theta_square.py rename to examples/examples/tutorials/theta_square.py diff --git a/examples/tutorials/tilted_ground_frame.png b/examples/examples/tutorials/tilted_ground_frame.png similarity index 100% rename from examples/tutorials/tilted_ground_frame.png rename to examples/examples/tutorials/tilted_ground_frame.png From 743ee40a3451c16687c99710f1663662e21ccf63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 16:01:57 +0200 Subject: [PATCH 116/264] move examples to user-guide --- docs/Makefile | 13 ++++++++----- docs/conf.py | 17 ++++++++--------- docs/user-guide/examples/README.txt | 6 ++++++ .../user-guide/examples/algorithms/README.txt | 0 .../algorithms/convert_images_to_2d.py | 0 .../examples/algorithms/dilate_image.py | 0 .../examples/algorithms/nd_interpolation.py | 0 .../examples/core/InstrumentDescription.py | 0 .../user-guide/examples/core/README.txt | 0 .../examples/core/command_line_tools.py | 0 .../user-guide}/examples/core/config.json | 0 .../user-guide}/examples/core/containers.py | 0 .../user-guide}/examples/core/provenance.py | 0 .../examples/core/table_writer_reader.py | 0 .../user-guide/examples/tutorials/README.txt | 4 ++-- .../tutorials/calibrated_data_exploration.py | 0 .../examples/tutorials/coordinates_example.py | 0 .../examples/tutorials/ctapipe_handson.py | 0 .../examples/tutorials/ctapipe_overview.py | 0 .../examples/tutorials/ground_frame.png | Bin .../examples/tutorials/raw_data_exploration.py | 0 .../examples/tutorials/theta_square.py | 0 .../examples/tutorials/tilted_ground_frame.png | Bin .../examples/visualization/README.txt | 0 .../examples/visualization/array_display.py | 0 .../examples/visualization/camera_display.py | 0 examples/examples/README.txt | 6 ------ 27 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 docs/user-guide/examples/README.txt rename examples/examples/algorithms/README.rst => docs/user-guide/examples/algorithms/README.txt (100%) rename {examples => docs/user-guide}/examples/algorithms/convert_images_to_2d.py (100%) rename {examples => docs/user-guide}/examples/algorithms/dilate_image.py (100%) rename {examples => docs/user-guide}/examples/algorithms/nd_interpolation.py (100%) rename {examples => docs/user-guide}/examples/core/InstrumentDescription.py (100%) rename examples/examples/core/README.rst => docs/user-guide/examples/core/README.txt (100%) rename {examples => docs/user-guide}/examples/core/command_line_tools.py (100%) rename {examples => docs/user-guide}/examples/core/config.json (100%) rename {examples => docs/user-guide}/examples/core/containers.py (100%) rename {examples => docs/user-guide}/examples/core/provenance.py (100%) rename {examples => docs/user-guide}/examples/core/table_writer_reader.py (100%) rename examples/examples/tutorials/README.rst => docs/user-guide/examples/tutorials/README.txt (70%) rename {examples => docs/user-guide}/examples/tutorials/calibrated_data_exploration.py (100%) rename {examples => docs/user-guide}/examples/tutorials/coordinates_example.py (100%) rename {examples => docs/user-guide}/examples/tutorials/ctapipe_handson.py (100%) rename {examples => docs/user-guide}/examples/tutorials/ctapipe_overview.py (100%) rename {examples => docs/user-guide}/examples/tutorials/ground_frame.png (100%) rename {examples => docs/user-guide}/examples/tutorials/raw_data_exploration.py (100%) rename {examples => docs/user-guide}/examples/tutorials/theta_square.py (100%) rename {examples => docs/user-guide}/examples/tutorials/tilted_ground_frame.png (100%) rename examples/examples/visualization/README.rst => docs/user-guide/examples/visualization/README.txt (100%) rename {examples => docs/user-guide}/examples/visualization/array_display.py (100%) rename {examples => docs/user-guide}/examples/visualization/camera_display.py (100%) delete mode 100644 examples/examples/README.txt diff --git a/docs/Makefile b/docs/Makefile index 238eb0226ea..f619b16a1fd 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -15,15 +15,18 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile examples +%: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -examples: - mkdir -p user-guide/examples - clean: rm -rf api - rm -rf user-guide/examples + rm -rf user-guide/examples/*.zip + rm -rf user-guide/examples/*.rst + rm -rf user-guide/examples/*/*.ipynb + rm -rf user-guide/examples/*/*.py.md5 + rm -rf user-guide/examples/*/*.pickle + rm -rf user-guide/examples/*/*.rst + rm -rf user-guide/examples/*/images @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py index 9f453a9dbfc..cc1ed9538c9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -150,22 +150,22 @@ def setup(app): sphinx_gallery_conf = { "examples_dirs": [ - "../examples/examples", + "user-guide/examples", ], # path to your example scripts "gallery_dirs": [ "user-guide/examples", ], # path to where to save gallery generated output "subsection_order": ExplicitOrder( [ - "../examples/examples/algorithms", - "../examples/examples/core", - "../examples/examples/visualization", - "../examples/examples/tutorials", + "user-guide/examples/tutorials", + "user-guide/examples/algorithms", + "user-guide/examples/core", + "user-guide/examples/visualization", ] ), "within_subsection_order": FileNameSortKey, "nested_sections": False, - "copyfile_regex": r"index.rst|.*\.png|.*\.json", + # "copyfile_regex": r".*\.rst|.*\.png|.*\.json", "filename_pattern": r".*\.py", "promote_jupyter_magic": True, "line_numbers": True, @@ -229,8 +229,7 @@ def setup(app): "changes", "user-guide/examples/*/*.ipynb", "user-guide/examples/*/*.py", - "user-guide/tutorials/*.ipynb", - "user-guide/tutorials/*.py", + "user-guide/examples/*/README.rst", ] # The name of the Pygments (syntax highlighting) style to use. @@ -245,7 +244,7 @@ def setup(app): # Define the json_url for our version switcher. json_url = "https://ctapipe.readthedocs.io/en/latest/_static/switcher.json" -# Define the version we use for matching in the version switcher. +# Define the version we use for matching in the version switcher., version_match = os.getenv("READTHEDOCS_VERSION") # If READTHEDOCS_VERSION doesn't exist, we're not on RTD # If it is an integer, we're in a PR build and the version isn't correct. diff --git a/docs/user-guide/examples/README.txt b/docs/user-guide/examples/README.txt new file mode 100644 index 00000000000..7bdf1b8226f --- /dev/null +++ b/docs/user-guide/examples/README.txt @@ -0,0 +1,6 @@ +.. _tutorials_and_examples_gallery: + +Tutorials and Examples gallery +============================== + +This gallery provides an overview of different ctapipe modules and how to use them. diff --git a/examples/examples/algorithms/README.rst b/docs/user-guide/examples/algorithms/README.txt similarity index 100% rename from examples/examples/algorithms/README.rst rename to docs/user-guide/examples/algorithms/README.txt diff --git a/examples/examples/algorithms/convert_images_to_2d.py b/docs/user-guide/examples/algorithms/convert_images_to_2d.py similarity index 100% rename from examples/examples/algorithms/convert_images_to_2d.py rename to docs/user-guide/examples/algorithms/convert_images_to_2d.py diff --git a/examples/examples/algorithms/dilate_image.py b/docs/user-guide/examples/algorithms/dilate_image.py similarity index 100% rename from examples/examples/algorithms/dilate_image.py rename to docs/user-guide/examples/algorithms/dilate_image.py diff --git a/examples/examples/algorithms/nd_interpolation.py b/docs/user-guide/examples/algorithms/nd_interpolation.py similarity index 100% rename from examples/examples/algorithms/nd_interpolation.py rename to docs/user-guide/examples/algorithms/nd_interpolation.py diff --git a/examples/examples/core/InstrumentDescription.py b/docs/user-guide/examples/core/InstrumentDescription.py similarity index 100% rename from examples/examples/core/InstrumentDescription.py rename to docs/user-guide/examples/core/InstrumentDescription.py diff --git a/examples/examples/core/README.rst b/docs/user-guide/examples/core/README.txt similarity index 100% rename from examples/examples/core/README.rst rename to docs/user-guide/examples/core/README.txt diff --git a/examples/examples/core/command_line_tools.py b/docs/user-guide/examples/core/command_line_tools.py similarity index 100% rename from examples/examples/core/command_line_tools.py rename to docs/user-guide/examples/core/command_line_tools.py diff --git a/examples/examples/core/config.json b/docs/user-guide/examples/core/config.json similarity index 100% rename from examples/examples/core/config.json rename to docs/user-guide/examples/core/config.json diff --git a/examples/examples/core/containers.py b/docs/user-guide/examples/core/containers.py similarity index 100% rename from examples/examples/core/containers.py rename to docs/user-guide/examples/core/containers.py diff --git a/examples/examples/core/provenance.py b/docs/user-guide/examples/core/provenance.py similarity index 100% rename from examples/examples/core/provenance.py rename to docs/user-guide/examples/core/provenance.py diff --git a/examples/examples/core/table_writer_reader.py b/docs/user-guide/examples/core/table_writer_reader.py similarity index 100% rename from examples/examples/core/table_writer_reader.py rename to docs/user-guide/examples/core/table_writer_reader.py diff --git a/examples/examples/tutorials/README.rst b/docs/user-guide/examples/tutorials/README.txt similarity index 70% rename from examples/examples/tutorials/README.rst rename to docs/user-guide/examples/tutorials/README.txt index 58f643a3722..e8b6be88e86 100644 --- a/examples/examples/tutorials/README.rst +++ b/docs/user-guide/examples/tutorials/README.txt @@ -1,6 +1,6 @@ -.. _tutorials_gallery: +.. _tutorials: -Tutorials gallery +Tutorials ================= This gallery contains different tutorials of different use cases for ctapipe. diff --git a/examples/examples/tutorials/calibrated_data_exploration.py b/docs/user-guide/examples/tutorials/calibrated_data_exploration.py similarity index 100% rename from examples/examples/tutorials/calibrated_data_exploration.py rename to docs/user-guide/examples/tutorials/calibrated_data_exploration.py diff --git a/examples/examples/tutorials/coordinates_example.py b/docs/user-guide/examples/tutorials/coordinates_example.py similarity index 100% rename from examples/examples/tutorials/coordinates_example.py rename to docs/user-guide/examples/tutorials/coordinates_example.py diff --git a/examples/examples/tutorials/ctapipe_handson.py b/docs/user-guide/examples/tutorials/ctapipe_handson.py similarity index 100% rename from examples/examples/tutorials/ctapipe_handson.py rename to docs/user-guide/examples/tutorials/ctapipe_handson.py diff --git a/examples/examples/tutorials/ctapipe_overview.py b/docs/user-guide/examples/tutorials/ctapipe_overview.py similarity index 100% rename from examples/examples/tutorials/ctapipe_overview.py rename to docs/user-guide/examples/tutorials/ctapipe_overview.py diff --git a/examples/examples/tutorials/ground_frame.png b/docs/user-guide/examples/tutorials/ground_frame.png similarity index 100% rename from examples/examples/tutorials/ground_frame.png rename to docs/user-guide/examples/tutorials/ground_frame.png diff --git a/examples/examples/tutorials/raw_data_exploration.py b/docs/user-guide/examples/tutorials/raw_data_exploration.py similarity index 100% rename from examples/examples/tutorials/raw_data_exploration.py rename to docs/user-guide/examples/tutorials/raw_data_exploration.py diff --git a/examples/examples/tutorials/theta_square.py b/docs/user-guide/examples/tutorials/theta_square.py similarity index 100% rename from examples/examples/tutorials/theta_square.py rename to docs/user-guide/examples/tutorials/theta_square.py diff --git a/examples/examples/tutorials/tilted_ground_frame.png b/docs/user-guide/examples/tutorials/tilted_ground_frame.png similarity index 100% rename from examples/examples/tutorials/tilted_ground_frame.png rename to docs/user-guide/examples/tutorials/tilted_ground_frame.png diff --git a/examples/examples/visualization/README.rst b/docs/user-guide/examples/visualization/README.txt similarity index 100% rename from examples/examples/visualization/README.rst rename to docs/user-guide/examples/visualization/README.txt diff --git a/examples/examples/visualization/array_display.py b/docs/user-guide/examples/visualization/array_display.py similarity index 100% rename from examples/examples/visualization/array_display.py rename to docs/user-guide/examples/visualization/array_display.py diff --git a/examples/examples/visualization/camera_display.py b/docs/user-guide/examples/visualization/camera_display.py similarity index 100% rename from examples/examples/visualization/camera_display.py rename to docs/user-guide/examples/visualization/camera_display.py diff --git a/examples/examples/README.txt b/examples/examples/README.txt deleted file mode 100644 index d3c2423283f..00000000000 --- a/examples/examples/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -.. _examples_gallery: - -Examples gallery -================ - -The examples gallery provides an overview of different ctapipe modules and how to use them. From 3a504ec6dc2fa23387d5225a5a9a262a0275b051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 8 Sep 2023 17:13:37 +0200 Subject: [PATCH 117/264] subsections --- docs/user-guide/examples/algorithms/README.txt | 2 +- docs/user-guide/examples/core/README.txt | 2 +- docs/user-guide/examples/tutorials/README.txt | 2 +- docs/user-guide/examples/visualization/README.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/examples/algorithms/README.txt b/docs/user-guide/examples/algorithms/README.txt index 4ddc214f0d3..c798294f73d 100644 --- a/docs/user-guide/examples/algorithms/README.txt +++ b/docs/user-guide/examples/algorithms/README.txt @@ -1,4 +1,4 @@ Algorithms -========== +---------- .. _algorithms-examples-gallery: diff --git a/docs/user-guide/examples/core/README.txt b/docs/user-guide/examples/core/README.txt index 5bcae85324a..8042b0dec57 100644 --- a/docs/user-guide/examples/core/README.txt +++ b/docs/user-guide/examples/core/README.txt @@ -1,4 +1,4 @@ Core Functionality -================== +------------------ .. _core-examples-gallery: diff --git a/docs/user-guide/examples/tutorials/README.txt b/docs/user-guide/examples/tutorials/README.txt index e8b6be88e86..c1c31978d8e 100644 --- a/docs/user-guide/examples/tutorials/README.txt +++ b/docs/user-guide/examples/tutorials/README.txt @@ -1,6 +1,6 @@ .. _tutorials: Tutorials -================= +--------- This gallery contains different tutorials of different use cases for ctapipe. diff --git a/docs/user-guide/examples/visualization/README.txt b/docs/user-guide/examples/visualization/README.txt index e4cc3341b62..c070a546918 100644 --- a/docs/user-guide/examples/visualization/README.txt +++ b/docs/user-guide/examples/visualization/README.txt @@ -1,4 +1,4 @@ Visualization -============= +------------- .. _visualization-examples-gallery: From da32602212d072516541f02cc7ab70502032ac88 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 8 Sep 2023 17:15:24 +0200 Subject: [PATCH 118/264] Fix section heading in gallery --- docs/user-guide/examples/README.txt | 4 ++-- docs/user-guide/examples/algorithms/README.txt | 4 ++-- docs/user-guide/examples/core/README.txt | 4 ++-- docs/user-guide/examples/visualization/README.txt | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/user-guide/examples/README.txt b/docs/user-guide/examples/README.txt index 7bdf1b8226f..cdc806953ae 100644 --- a/docs/user-guide/examples/README.txt +++ b/docs/user-guide/examples/README.txt @@ -1,6 +1,6 @@ .. _tutorials_and_examples_gallery: -Tutorials and Examples gallery -============================== +Tutorials and Examples +====================== This gallery provides an overview of different ctapipe modules and how to use them. diff --git a/docs/user-guide/examples/algorithms/README.txt b/docs/user-guide/examples/algorithms/README.txt index c798294f73d..a53d619994e 100644 --- a/docs/user-guide/examples/algorithms/README.txt +++ b/docs/user-guide/examples/algorithms/README.txt @@ -1,4 +1,4 @@ +.. _algorithms-examples-gallery: + Algorithms ---------- - -.. _algorithms-examples-gallery: diff --git a/docs/user-guide/examples/core/README.txt b/docs/user-guide/examples/core/README.txt index 8042b0dec57..cfd78a64e9e 100644 --- a/docs/user-guide/examples/core/README.txt +++ b/docs/user-guide/examples/core/README.txt @@ -1,4 +1,4 @@ +.. _core-examples-gallery: + Core Functionality ------------------ - -.. _core-examples-gallery: diff --git a/docs/user-guide/examples/visualization/README.txt b/docs/user-guide/examples/visualization/README.txt index c070a546918..ca55d616351 100644 --- a/docs/user-guide/examples/visualization/README.txt +++ b/docs/user-guide/examples/visualization/README.txt @@ -1,4 +1,4 @@ +.. _visualization-examples-gallery: + Visualization ------------- - -.. _visualization-examples-gallery: From 4ea016f5575a6dce4a02a80cce0ee1ef0ed4348a Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 8 Sep 2023 17:15:41 +0200 Subject: [PATCH 119/264] add files created by sphinx-gallery to .gitignore --- .gitignore | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index 9ca4ab0cd26..d4366247a72 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ + .pytest_cache *.log @@ -12,6 +13,15 @@ __pycache__ ctapipe/_version_cache.py ctapipe/_version.py +# created by sphinx gallery +docs/user-guide/examples/**/*.ipynb +docs/user-guide/examples/**/*.py.md5 +docs/user-guide/examples/**/*.rst +docs/user-guide/examples/**/*_codeobj.pickle +docs/user-guide/examples/**/images +docs/user-guide/examples/examples_jupyter.zip +docs/user-guide/examples/examples_python.zip + # Ignore .c files by default to avoid including generated code. If you want to # add a non-generated .c extension, use `git add -f filename.c`. *.c From 47004bfedde26b94c8b1cbc29bac547b64155c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Sat, 9 Sep 2023 11:12:08 +0200 Subject: [PATCH 120/264] txt to rest --- .gitignore | 8 -------- docs/user-guide/examples/{README.txt => README.rst} | 0 .../examples/algorithms/{README.txt => README.rst} | 0 docs/user-guide/examples/core/{README.txt => README.rst} | 0 .../examples/tutorials/{README.txt => README.rst} | 0 .../examples/visualization/{README.txt => README.rst} | 0 6 files changed, 8 deletions(-) rename docs/user-guide/examples/{README.txt => README.rst} (100%) rename docs/user-guide/examples/algorithms/{README.txt => README.rst} (100%) rename docs/user-guide/examples/core/{README.txt => README.rst} (100%) rename docs/user-guide/examples/tutorials/{README.txt => README.rst} (100%) rename docs/user-guide/examples/visualization/{README.txt => README.rst} (100%) diff --git a/.gitignore b/.gitignore index d4366247a72..efa0a60dc5b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,14 +13,6 @@ __pycache__ ctapipe/_version_cache.py ctapipe/_version.py -# created by sphinx gallery -docs/user-guide/examples/**/*.ipynb -docs/user-guide/examples/**/*.py.md5 -docs/user-guide/examples/**/*.rst -docs/user-guide/examples/**/*_codeobj.pickle -docs/user-guide/examples/**/images -docs/user-guide/examples/examples_jupyter.zip -docs/user-guide/examples/examples_python.zip # Ignore .c files by default to avoid including generated code. If you want to # add a non-generated .c extension, use `git add -f filename.c`. diff --git a/docs/user-guide/examples/README.txt b/docs/user-guide/examples/README.rst similarity index 100% rename from docs/user-guide/examples/README.txt rename to docs/user-guide/examples/README.rst diff --git a/docs/user-guide/examples/algorithms/README.txt b/docs/user-guide/examples/algorithms/README.rst similarity index 100% rename from docs/user-guide/examples/algorithms/README.txt rename to docs/user-guide/examples/algorithms/README.rst diff --git a/docs/user-guide/examples/core/README.txt b/docs/user-guide/examples/core/README.rst similarity index 100% rename from docs/user-guide/examples/core/README.txt rename to docs/user-guide/examples/core/README.rst diff --git a/docs/user-guide/examples/tutorials/README.txt b/docs/user-guide/examples/tutorials/README.rst similarity index 100% rename from docs/user-guide/examples/tutorials/README.txt rename to docs/user-guide/examples/tutorials/README.rst diff --git a/docs/user-guide/examples/visualization/README.txt b/docs/user-guide/examples/visualization/README.rst similarity index 100% rename from docs/user-guide/examples/visualization/README.txt rename to docs/user-guide/examples/visualization/README.rst From 1c56a3e7be3492ab9cc232806918cd3a80ef2f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Sat, 9 Sep 2023 11:34:07 +0200 Subject: [PATCH 121/264] move to default build dir --- docs/Makefile | 9 +-------- docs/conf.py | 14 +++++++------- docs/user-guide/examples/index.rst | 1 + 3 files changed, 9 insertions(+), 15 deletions(-) create mode 100644 docs/user-guide/examples/index.rst diff --git a/docs/Makefile b/docs/Makefile index f619b16a1fd..3bf5e372d5f 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -19,14 +19,7 @@ help: @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) clean: - rm -rf api - rm -rf user-guide/examples/*.zip - rm -rf user-guide/examples/*.rst - rm -rf user-guide/examples/*/*.ipynb - rm -rf user-guide/examples/*/*.py.md5 - rm -rf user-guide/examples/*/*.pickle - rm -rf user-guide/examples/*/*.rst - rm -rf user-guide/examples/*/images + rm -rf api auto_examples @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py index cc1ed9538c9..4554ca94ab4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -4,7 +4,7 @@ # ctapipe documentation build configuration file, created by # sphinx-quickstart on Fri Jan 6 10:22:58 2017. # -# This file is execfile()d with the current directory set to its +# Thi file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this @@ -152,9 +152,6 @@ def setup(app): "examples_dirs": [ "user-guide/examples", ], # path to your example scripts - "gallery_dirs": [ - "user-guide/examples", - ], # path to where to save gallery generated output "subsection_order": ExplicitOrder( [ "user-guide/examples/tutorials", @@ -165,8 +162,8 @@ def setup(app): ), "within_subsection_order": FileNameSortKey, "nested_sections": False, - # "copyfile_regex": r".*\.rst|.*\.png|.*\.json", "filename_pattern": r".*\.py", + "copyfile_regex": r".*\.png", "promote_jupyter_magic": True, "line_numbers": True, "default_thumb_file": "_static/ctapipe_logo.png", @@ -227,9 +224,12 @@ def setup(app): ".DS_Store", "**.ipynb_checkpoints", "changes", - "user-guide/examples/*/*.ipynb", - "user-guide/examples/*/*.py", "user-guide/examples/*/README.rst", + "user-guide/examples/README.rst", + "auto_examples/index.rst", + "auto_examples/*/*.py.md5", + "auto_examples/*/*.py", + "auto_examples/*/*.ipynb", ] # The name of the Pygments (syntax highlighting) style to use. diff --git a/docs/user-guide/examples/index.rst b/docs/user-guide/examples/index.rst new file mode 100644 index 00000000000..d6578dcd835 --- /dev/null +++ b/docs/user-guide/examples/index.rst @@ -0,0 +1 @@ +.. include:: ../../auto_examples/index.rst From 98a522db0ebde5f629555dbf8e24292afed49dfd Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 11 Sep 2023 12:47:49 +0200 Subject: [PATCH 122/264] Add changelog for 0.20.0 --- CHANGES.rst | 60 +++++++++++++++++++++++++++++++ docs/changes/2265.bugfix.rst | 2 -- docs/changes/2328.feature.rst | 1 - docs/changes/2338.feature.rst | 1 - docs/changes/2342.maintenance.rst | 1 - docs/changes/2343.feature.rst | 5 --- docs/changes/2373.maintenance.rst | 3 -- docs/changes/2375.api.rst | 5 --- docs/changes/2376.api.rst | 2 -- docs/changes/2381.feature.rst | 1 - docs/changes/2384.api.rst | 2 -- docs/changes/2386.feature.rst | 1 - 12 files changed, 60 insertions(+), 24 deletions(-) delete mode 100644 docs/changes/2265.bugfix.rst delete mode 100644 docs/changes/2328.feature.rst delete mode 100644 docs/changes/2338.feature.rst delete mode 100644 docs/changes/2342.maintenance.rst delete mode 100644 docs/changes/2343.feature.rst delete mode 100644 docs/changes/2373.maintenance.rst delete mode 100644 docs/changes/2375.api.rst delete mode 100644 docs/changes/2376.api.rst delete mode 100644 docs/changes/2381.feature.rst delete mode 100644 docs/changes/2384.api.rst delete mode 100644 docs/changes/2386.feature.rst diff --git a/CHANGES.rst b/CHANGES.rst index 19877342a07..eab102af3b5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,63 @@ +ctapipe v0.20.0 (2023-09-11) +============================ + + +API Changes +----------- + +- The ``ctapipe-dump-triggers`` tool was removed, since it wrote a custom data format + not compatble with e.g. the output of the ``DataWriter`` and ``ctapipe-process``. + If you only want to store trigger and simulation information from simulated / DL0 + input files into the ctapipe format HDF5 files, you can now use + ``ctapipe-process -i -o --no-write-parameters``. [`#2375 `__] + +- Change the fill value for invalid telescope ids in ``SubarrayDescription.tel_index_array`` + from ``-1`` to ``np.iinfo(int).minval`` to prevent ``-1`` being used as an index resulting in the last element being used for invalid telescope ids. [`#2376 `__] + +- Remove ``EventSource.from_config``, simply use ``EventSource(config=config)`` or + ``EventSource(parent=parent)``. [`#2384 `__] + + +Data Model Changes +------------------ + +- Added missing fields defined in the CTAO R1 and DL0 data models to the corresponding containers. [`#2338 `__] + +- Remove the ``injection_height`` field from the ``SimulationConfigContainer``, + this field was always empty and is never filled by ``sim_telarray``. + + Add the corresponding ``starting_grammage`` field to the ``SimulatedShowerContainer``, + where it is actually available. [`#2343 `__] + +- Added new fields to the ``MuonEfficiencyContainer`` - ``is_valid`` to check if fit converged successfully, ``parameters_at_limit`` to check if parameters were fitted close to a bound and ``likelihood_value`` which represents cost function value atthe minimum. These fields were added to the output of the ``MuonIntensityFitter``. [`#2381 `__] + + +New Features +------------ + +- Remove writing the full provenance information to the log and instead simply refer the reader to the actual provenance file. [`#2328 `__] + +- Add support for including r1 and r0 waveforms in the ``ctapipe-merge`` tool. [`#2386 `__] + + +Bug Fixes +--------- + +- The ```HillasIntersection``` method used to fail when individual events were reconstructed to originate from a FoV offset of more than 90 degrees. + This is now fixed by returning an INVALID container for a reconstructed offset of larger than 45 degrees. [`#2265 `__] + + +Maintenance +----------- + +- Drop support for python 3.8 in accordance with the NEP 29 schedule. [`#2342 `__] + +- * Switched to ``PyData`` theme for docs + * Updated ``Sphinx`` to version 6.2.1 + * Updated front page of docs [`#2373 `__] + + + ctapipe 0.19.3 (2023-06-20) =========================== diff --git a/docs/changes/2265.bugfix.rst b/docs/changes/2265.bugfix.rst deleted file mode 100644 index 7e637ed4f3e..00000000000 --- a/docs/changes/2265.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ```HillasIntersection``` method used to fail when individual events were reconstructed to originate from a FoV offset of more than 90 degrees. -This is now fixed by returning an INVALID container for a reconstructed offset of larger than 45 degrees. \ No newline at end of file diff --git a/docs/changes/2328.feature.rst b/docs/changes/2328.feature.rst deleted file mode 100644 index 6f3de847f94..00000000000 --- a/docs/changes/2328.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Remove writing the full provenance information to the log and instead simply refer the reader to the actual provenance file. diff --git a/docs/changes/2338.feature.rst b/docs/changes/2338.feature.rst deleted file mode 100644 index 0d5faf7a5ea..00000000000 --- a/docs/changes/2338.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Added missing fields defined in the CTAO R1 and DL0 data models to the corresponding containers. diff --git a/docs/changes/2342.maintenance.rst b/docs/changes/2342.maintenance.rst deleted file mode 100644 index df37bb4ebba..00000000000 --- a/docs/changes/2342.maintenance.rst +++ /dev/null @@ -1 +0,0 @@ -Drop support for python 3.8 in accordance with the NEP 29 schedule. diff --git a/docs/changes/2343.feature.rst b/docs/changes/2343.feature.rst deleted file mode 100644 index 6367e808206..00000000000 --- a/docs/changes/2343.feature.rst +++ /dev/null @@ -1,5 +0,0 @@ -Remove the ``injection_height`` field from the ``SimulationConfigContainer``, -this field was always empty and is never filled by ``sim_telarray``. - -Add the corresponding ``starting_grammage`` field to the ``SimulatedShowerContainer``, -where it is actually available. diff --git a/docs/changes/2373.maintenance.rst b/docs/changes/2373.maintenance.rst deleted file mode 100644 index 8e5a70349d3..00000000000 --- a/docs/changes/2373.maintenance.rst +++ /dev/null @@ -1,3 +0,0 @@ -* Switched to ``PyData`` theme for docs -* Updated ``Sphinx`` to version 6.2.1 -* Updated front page of docs diff --git a/docs/changes/2375.api.rst b/docs/changes/2375.api.rst deleted file mode 100644 index 36ab27b3d7e..00000000000 --- a/docs/changes/2375.api.rst +++ /dev/null @@ -1,5 +0,0 @@ -The ``ctapipe-dump-triggers`` tool was removed, since it wrote a custom data format -not compatble with e.g. the output of the ``DataWriter`` and ``ctapipe-process``. -If you only want to store trigger and simulation information from simulated / DL0 -input files into the ctapipe format HDF5 files, you can now use -``ctapipe-process -i -o --no-write-parameters``. diff --git a/docs/changes/2376.api.rst b/docs/changes/2376.api.rst deleted file mode 100644 index 62bab6f6cc3..00000000000 --- a/docs/changes/2376.api.rst +++ /dev/null @@ -1,2 +0,0 @@ -Change the fill value for invalid telescope ids in ``SubarrayDescription.tel_index_array`` -from ``-1`` to ``np.iinfo(int).minval`` to prevent ``-1`` being used as an index resulting in the last element being used for invalid telescope ids. diff --git a/docs/changes/2381.feature.rst b/docs/changes/2381.feature.rst deleted file mode 100644 index 4d9e9177c9d..00000000000 --- a/docs/changes/2381.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Added new fields to the ``MuonEfficiencyContainer`` - ``is_valid`` to check if fit converged successfully, ``parameters_at_limit`` to check if parameters were fitted close to a bound and ``likelihood_value`` which represents cost function value atthe minimum. These fields were added to the output of the ``MuonIntensityFitter``. diff --git a/docs/changes/2384.api.rst b/docs/changes/2384.api.rst deleted file mode 100644 index 32647abe5eb..00000000000 --- a/docs/changes/2384.api.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove ``EventSource.from_config``, simply use ``EventSource(config=config)`` or -``EventSource(parent=parent)``. diff --git a/docs/changes/2386.feature.rst b/docs/changes/2386.feature.rst deleted file mode 100644 index eaf9d2f5748..00000000000 --- a/docs/changes/2386.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Add support for including r1 and r0 waveforms in the ``ctapipe-merge`` tool. From 6fb72e88df4f9f03f68d5494485fbcb644b4da7e Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 11 Sep 2023 14:08:52 +0200 Subject: [PATCH 123/264] Move examples back out of docs tree This interfered with doctests collection, running the examples during the collection, which, since they are not modules but scripts, blocked it. Also added git and sphinx build dirs to pytest ignore directories. --- .gitignore | 2 +- docs/conf.py | 10 +++++----- docs/user-guide/examples/index.rst | 1 - docs/user-guide/examples_tutorials.rst | 1 + docs/user-guide/index.rst | 2 +- {docs/user-guide/examples => examples}/README.rst | 0 .../examples => examples}/algorithms/README.rst | 0 .../algorithms/convert_images_to_2d.py | 0 .../algorithms/dilate_image.py | 0 .../algorithms/nd_interpolation.py | 0 .../core/InstrumentDescription.py | 0 .../examples => examples}/core/README.rst | 0 .../core/command_line_tools.py | 0 .../examples => examples}/core/config.json | 0 .../examples => examples}/core/containers.py | 0 .../examples => examples}/core/provenance.py | 0 .../core/table_writer_reader.py | 0 .../examples => examples}/tutorials/README.rst | 0 .../tutorials/calibrated_data_exploration.py | 0 .../tutorials/coordinates_example.py | 0 .../tutorials/ctapipe_handson.py | 0 .../tutorials/ctapipe_overview.py | 0 .../tutorials/ground_frame.png | Bin .../tutorials/raw_data_exploration.py | 0 .../examples => examples}/tutorials/theta_square.py | 0 .../tutorials/tilted_ground_frame.png | Bin .../examples => examples}/visualization/README.rst | 0 .../visualization/array_display.py | 0 .../visualization/camera_display.py | 0 pyproject.toml | 5 +++++ 30 files changed, 13 insertions(+), 8 deletions(-) delete mode 100644 docs/user-guide/examples/index.rst create mode 100644 docs/user-guide/examples_tutorials.rst rename {docs/user-guide/examples => examples}/README.rst (100%) rename {docs/user-guide/examples => examples}/algorithms/README.rst (100%) rename {docs/user-guide/examples => examples}/algorithms/convert_images_to_2d.py (100%) rename {docs/user-guide/examples => examples}/algorithms/dilate_image.py (100%) rename {docs/user-guide/examples => examples}/algorithms/nd_interpolation.py (100%) rename {docs/user-guide/examples => examples}/core/InstrumentDescription.py (100%) rename {docs/user-guide/examples => examples}/core/README.rst (100%) rename {docs/user-guide/examples => examples}/core/command_line_tools.py (100%) rename {docs/user-guide/examples => examples}/core/config.json (100%) rename {docs/user-guide/examples => examples}/core/containers.py (100%) rename {docs/user-guide/examples => examples}/core/provenance.py (100%) rename {docs/user-guide/examples => examples}/core/table_writer_reader.py (100%) rename {docs/user-guide/examples => examples}/tutorials/README.rst (100%) rename {docs/user-guide/examples => examples}/tutorials/calibrated_data_exploration.py (100%) rename {docs/user-guide/examples => examples}/tutorials/coordinates_example.py (100%) rename {docs/user-guide/examples => examples}/tutorials/ctapipe_handson.py (100%) rename {docs/user-guide/examples => examples}/tutorials/ctapipe_overview.py (100%) rename {docs/user-guide/examples => examples}/tutorials/ground_frame.png (100%) rename {docs/user-guide/examples => examples}/tutorials/raw_data_exploration.py (100%) rename {docs/user-guide/examples => examples}/tutorials/theta_square.py (100%) rename {docs/user-guide/examples => examples}/tutorials/tilted_ground_frame.png (100%) rename {docs/user-guide/examples => examples}/visualization/README.rst (100%) rename {docs/user-guide/examples => examples}/visualization/array_display.py (100%) rename {docs/user-guide/examples => examples}/visualization/camera_display.py (100%) diff --git a/.gitignore b/.gitignore index efa0a60dc5b..631313313e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ - .pytest_cache *.log @@ -27,6 +26,7 @@ MANIFEST # Sphinx docs/api docs/_build +docs/auto_examples # Editors and IDEs diff --git a/docs/conf.py b/docs/conf.py index 4554ca94ab4..29d5cdee0c5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -150,14 +150,14 @@ def setup(app): sphinx_gallery_conf = { "examples_dirs": [ - "user-guide/examples", + "../examples", ], # path to your example scripts "subsection_order": ExplicitOrder( [ - "user-guide/examples/tutorials", - "user-guide/examples/algorithms", - "user-guide/examples/core", - "user-guide/examples/visualization", + "../examples/tutorials", + "../examples/algorithms", + "../examples/core", + "../examples/visualization", ] ), "within_subsection_order": FileNameSortKey, diff --git a/docs/user-guide/examples/index.rst b/docs/user-guide/examples/index.rst deleted file mode 100644 index d6578dcd835..00000000000 --- a/docs/user-guide/examples/index.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../auto_examples/index.rst diff --git a/docs/user-guide/examples_tutorials.rst b/docs/user-guide/examples_tutorials.rst new file mode 100644 index 00000000000..e297773b493 --- /dev/null +++ b/docs/user-guide/examples_tutorials.rst @@ -0,0 +1 @@ +.. include:: ../auto_examples/index.rst diff --git a/docs/user-guide/index.rst b/docs/user-guide/index.rst index 7b738f5c583..c74bf247684 100644 --- a/docs/user-guide/index.rst +++ b/docs/user-guide/index.rst @@ -9,5 +9,5 @@ User Guide getting-started tools data_models/index - examples/index + examples_tutorials FAQ diff --git a/docs/user-guide/examples/README.rst b/examples/README.rst similarity index 100% rename from docs/user-guide/examples/README.rst rename to examples/README.rst diff --git a/docs/user-guide/examples/algorithms/README.rst b/examples/algorithms/README.rst similarity index 100% rename from docs/user-guide/examples/algorithms/README.rst rename to examples/algorithms/README.rst diff --git a/docs/user-guide/examples/algorithms/convert_images_to_2d.py b/examples/algorithms/convert_images_to_2d.py similarity index 100% rename from docs/user-guide/examples/algorithms/convert_images_to_2d.py rename to examples/algorithms/convert_images_to_2d.py diff --git a/docs/user-guide/examples/algorithms/dilate_image.py b/examples/algorithms/dilate_image.py similarity index 100% rename from docs/user-guide/examples/algorithms/dilate_image.py rename to examples/algorithms/dilate_image.py diff --git a/docs/user-guide/examples/algorithms/nd_interpolation.py b/examples/algorithms/nd_interpolation.py similarity index 100% rename from docs/user-guide/examples/algorithms/nd_interpolation.py rename to examples/algorithms/nd_interpolation.py diff --git a/docs/user-guide/examples/core/InstrumentDescription.py b/examples/core/InstrumentDescription.py similarity index 100% rename from docs/user-guide/examples/core/InstrumentDescription.py rename to examples/core/InstrumentDescription.py diff --git a/docs/user-guide/examples/core/README.rst b/examples/core/README.rst similarity index 100% rename from docs/user-guide/examples/core/README.rst rename to examples/core/README.rst diff --git a/docs/user-guide/examples/core/command_line_tools.py b/examples/core/command_line_tools.py similarity index 100% rename from docs/user-guide/examples/core/command_line_tools.py rename to examples/core/command_line_tools.py diff --git a/docs/user-guide/examples/core/config.json b/examples/core/config.json similarity index 100% rename from docs/user-guide/examples/core/config.json rename to examples/core/config.json diff --git a/docs/user-guide/examples/core/containers.py b/examples/core/containers.py similarity index 100% rename from docs/user-guide/examples/core/containers.py rename to examples/core/containers.py diff --git a/docs/user-guide/examples/core/provenance.py b/examples/core/provenance.py similarity index 100% rename from docs/user-guide/examples/core/provenance.py rename to examples/core/provenance.py diff --git a/docs/user-guide/examples/core/table_writer_reader.py b/examples/core/table_writer_reader.py similarity index 100% rename from docs/user-guide/examples/core/table_writer_reader.py rename to examples/core/table_writer_reader.py diff --git a/docs/user-guide/examples/tutorials/README.rst b/examples/tutorials/README.rst similarity index 100% rename from docs/user-guide/examples/tutorials/README.rst rename to examples/tutorials/README.rst diff --git a/docs/user-guide/examples/tutorials/calibrated_data_exploration.py b/examples/tutorials/calibrated_data_exploration.py similarity index 100% rename from docs/user-guide/examples/tutorials/calibrated_data_exploration.py rename to examples/tutorials/calibrated_data_exploration.py diff --git a/docs/user-guide/examples/tutorials/coordinates_example.py b/examples/tutorials/coordinates_example.py similarity index 100% rename from docs/user-guide/examples/tutorials/coordinates_example.py rename to examples/tutorials/coordinates_example.py diff --git a/docs/user-guide/examples/tutorials/ctapipe_handson.py b/examples/tutorials/ctapipe_handson.py similarity index 100% rename from docs/user-guide/examples/tutorials/ctapipe_handson.py rename to examples/tutorials/ctapipe_handson.py diff --git a/docs/user-guide/examples/tutorials/ctapipe_overview.py b/examples/tutorials/ctapipe_overview.py similarity index 100% rename from docs/user-guide/examples/tutorials/ctapipe_overview.py rename to examples/tutorials/ctapipe_overview.py diff --git a/docs/user-guide/examples/tutorials/ground_frame.png b/examples/tutorials/ground_frame.png similarity index 100% rename from docs/user-guide/examples/tutorials/ground_frame.png rename to examples/tutorials/ground_frame.png diff --git a/docs/user-guide/examples/tutorials/raw_data_exploration.py b/examples/tutorials/raw_data_exploration.py similarity index 100% rename from docs/user-guide/examples/tutorials/raw_data_exploration.py rename to examples/tutorials/raw_data_exploration.py diff --git a/docs/user-guide/examples/tutorials/theta_square.py b/examples/tutorials/theta_square.py similarity index 100% rename from docs/user-guide/examples/tutorials/theta_square.py rename to examples/tutorials/theta_square.py diff --git a/docs/user-guide/examples/tutorials/tilted_ground_frame.png b/examples/tutorials/tilted_ground_frame.png similarity index 100% rename from docs/user-guide/examples/tutorials/tilted_ground_frame.png rename to examples/tutorials/tilted_ground_frame.png diff --git a/docs/user-guide/examples/visualization/README.rst b/examples/visualization/README.rst similarity index 100% rename from docs/user-guide/examples/visualization/README.rst rename to examples/visualization/README.rst diff --git a/docs/user-guide/examples/visualization/array_display.py b/examples/visualization/array_display.py similarity index 100% rename from docs/user-guide/examples/visualization/array_display.py rename to examples/visualization/array_display.py diff --git a/docs/user-guide/examples/visualization/camera_display.py b/examples/visualization/camera_display.py similarity index 100% rename from docs/user-guide/examples/visualization/camera_display.py rename to examples/visualization/camera_display.py diff --git a/pyproject.toml b/pyproject.toml index 7501b7da070..73a42e69d99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,11 @@ filterwarnings = [ "error::astropy.utils.exceptions.AstropyDeprecationWarning", "error::ctapipe.utils.deprecation.CTAPipeDeprecationWarning", ] +norecursedirs = [ + ".git", + "_build", + "auto_examples", +] [tool.towncrier] package = "ctapipe" From 16b544544f0b15def20c5e168cc4ef8645191fab Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 11 Sep 2023 16:44:49 +0200 Subject: [PATCH 124/264] Add comment to including rst file --- docs/conftest.py | 5 +++++ docs/user-guide/examples_tutorials.rst | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 docs/conftest.py diff --git a/docs/conftest.py b/docs/conftest.py new file mode 100644 index 00000000000..4c7e9da09ce --- /dev/null +++ b/docs/conftest.py @@ -0,0 +1,5 @@ +collect_ignore = [ + "conf.py", + "_build", + "auto_examples", +] diff --git a/docs/user-guide/examples_tutorials.rst b/docs/user-guide/examples_tutorials.rst index e297773b493..77b1161e010 100644 --- a/docs/user-guide/examples_tutorials.rst +++ b/docs/user-guide/examples_tutorials.rst @@ -1 +1,5 @@ +.. Include rendered examples build with sphinx-gallery +.. Actual files are in the examples/ directory in the +.. base of the repository + .. include:: ../auto_examples/index.rst From 9e393b40027ac9b760267d747dfcfc6dd739cb75 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 19 Sep 2023 13:04:57 +0200 Subject: [PATCH 125/264] More traitlets nitpick ignores --- docs/conf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 29d5cdee0c5..ba59f8e41f0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -131,6 +131,12 @@ def setup(app): ("py:class", "traitlets.config.application.Application"), ("py:class", "traitlets.utils.sentinel.Sentinel"), ("py:class", "traitlets.traitlets.ObserveHandler"), + ("py:obj", "traitlets.traitlets.G"), + ("py:obj", "traitlets.traitlets.S"), + ("py:class", "traitlets.traitlets.T"), + ("py:class", "re.Pattern[t.Any]"), + ("py:class", "Sentinel"), + ("py:class", "ObserveHandler"), ("py:obj", "traitlets.config.boolean_flag"), ("py:obj", "traitlets.TraitError"), ("py:obj", "-v"), # fix for wrong syntax in a traitlets docstring From e00de5bf1e46f8561071768db62947bd1545aac0 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 22 Sep 2023 12:43:50 +0200 Subject: [PATCH 126/264] Propose cep3: remove image parameters in camera frame --- ...emove-image-parameters-in-camera-frame.rst | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 docs/developer-guide/ceps/proposed/cep-003-remove-image-parameters-in-camera-frame.rst diff --git a/docs/developer-guide/ceps/proposed/cep-003-remove-image-parameters-in-camera-frame.rst b/docs/developer-guide/ceps/proposed/cep-003-remove-image-parameters-in-camera-frame.rst new file mode 100644 index 00000000000..463df4ac2a5 --- /dev/null +++ b/docs/developer-guide/ceps/proposed/cep-003-remove-image-parameters-in-camera-frame.rst @@ -0,0 +1,52 @@ +.. _cep-003: + + +************************************************************ +CEP 3 - Dropping support for image parameters in CameraFrame +************************************************************ + +* Status: draft +* Discussion: NA +* Date accepted: NA +* Last revised: 2023-09-22 +* Author: Maximilian Linhoff +* Created: 2023-09-22 + +Abstract +======== + +Currently, ctapipe supports computing all image parameters in two variants: + +* Using a ``CameraGeometry`` where pixel coordinates are expressed in ``CameraFrame``, i.e. + in length units (most commonly meters) on the camera focal plane. +* Using a ``CameraGeometry`` where pixel coordinates are expressed in ``TelescopeFrame``, i.e. + in angular units (most commonly degree) on sky. + +We propose to drop support for the first, to simplify code in multiple places and reduce +possibility for confusing the two similar variants of the image parameters. + +The overhead of supporting both ``TelescopeFrame`` and ``CameraFrame`` representations +of the image parameters is quite significant, as it e.g. requires dealing with both +possible definitions in all Hillas-style dl2 reconstructors. + +Advantages of computation in TelescopeFrame +=========================================== + +Computing the image parameters in ``TelescopeFrame`` – angular units on the sky – +has the following advantages: + +* Parameters are easier to compare across different telescope types. +* Pointing corrections can directly be applied in the conversion from ``CameraFrame`` + to ``TelescopeFrame`` and are then automatically included in the image parameters, + which is much more straight forward than trying to correct image parameters that + are affected to different degrees after they have been computed. +* Conversion from ``CameraFrame`` to ``TelescopeFrame`` will include any necessary + special handling of the curved cameras of dual mirror telescopes. + + +Previous discussions +==================== +* Issue discussing the removal of the camera frame image parameters: `#2061 `_ +* Original issue for introducing the computation of image parameters in telescope frame: `#1090 `_ +* Pull Request implementing image parameters in telescope frame, also setting it as the default: `#1591 `_ +* Adapting the reconstructors to also work with image parameters in telescope frame: `#1408 `_ From ff7390bbebedfa32899746b9823f828e9c9a82c7 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 19 Sep 2023 15:04:31 +0200 Subject: [PATCH 127/264] Use intmin for invalid pixel positions, allow empty arguments --- ctapipe/instrument/camera/geometry.py | 18 ++++++------------ .../instrument/camera/tests/test_geometry.py | 12 +++++++++++- docs/changes/2397.api.rst | 8 ++++++++ 3 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 docs/changes/2397.api.rst diff --git a/ctapipe/instrument/camera/geometry.py b/ctapipe/instrument/camera/geometry.py index dd55b14425b..1d83a1bab60 100644 --- a/ctapipe/instrument/camera/geometry.py +++ b/ctapipe/instrument/camera/geometry.py @@ -954,12 +954,13 @@ def position_to_pix_index(self, x, y): pix_indices: Pixel index or array of pixel indices. Returns -1 if position falls outside camera """ - if not self._all_pixel_areas_equal: logger.warning( " Method not implemented for cameras with varying pixel sizes" ) unit = x.unit + scalar = x.ndim == 0 + points_searched = np.dstack([x.to_value(unit), y.to_value(unit)]) circum_rad = self._pixel_circumradius[0].to_value(unit) kdtree = self._kdtree @@ -969,8 +970,9 @@ def position_to_pix_index(self, x, y): del dist pix_indices = pix_indices.flatten() + invalid = np.iinfo(pix_indices.dtype).min # 1. Mark all points outside pixel circumeference as lying outside camera - pix_indices[pix_indices == self.n_pixels] = -1 + pix_indices[pix_indices == self.n_pixels] = invalid # 2. Accurate check for the remaing cases (within circumference, but still outside # camera). It is first checked if any border pixel numbers are returned. @@ -1006,17 +1008,9 @@ def position_to_pix_index(self, x, y): ) del dist_check if index_check != insidepix_index: - pix_indices[index] = -1 - - # print warning: - for index in np.where(pix_indices == -1)[0]: - logger.warning( - " Coordinate ({} m, {} m) lies outside camera".format( - points_searched[0][index, 0], points_searched[0][index, 1] - ) - ) + pix_indices[index] = invalid - return pix_indices if len(pix_indices) > 1 else pix_indices[0] + return np.squeeze(pix_indices) if scalar else pix_indices @staticmethod def simtel_shape_to_type(pixel_shape): diff --git a/ctapipe/instrument/camera/tests/test_geometry.py b/ctapipe/instrument/camera/tests/test_geometry.py index 10410e0efc6..8e3a7545d95 100644 --- a/ctapipe/instrument/camera/tests/test_geometry.py +++ b/ctapipe/instrument/camera/tests/test_geometry.py @@ -68,10 +68,20 @@ def test_load_lst_camera(prod5_lst): def test_position_to_pix_index(prod5_lst): """test that we can lookup a pixel from a coordinate""" + geometry = prod5_lst.camera.geometry + x, y = (0.80 * u.m, 0.79 * u.m) - pix_id = prod5_lst.camera.geometry.position_to_pix_index(x, y) + + pix_id = geometry.position_to_pix_index(x, y) + assert pix_id == 1575 + pix_ids = geometry.position_to_pix_index([0.8, 0.8] * u.m, [0.79, 0.79] * u.m) + np.testing.assert_array_equal(pix_ids, [1575, 1575]) + + assert len(geometry.position_to_pix_index([] * u.m, [] * u.m)) == 0 + assert geometry.position_to_pix_index(5 * u.m, 5 * u.m) == np.iinfo(int).min + def test_find_neighbor_pixels(): """test basic neighbor functionality""" diff --git a/docs/changes/2397.api.rst b/docs/changes/2397.api.rst new file mode 100644 index 00000000000..45b64781bb8 --- /dev/null +++ b/docs/changes/2397.api.rst @@ -0,0 +1,8 @@ +``CameraGeometry.position_to_pix_index`` will now return the minimum integer value for invalid +pixel coordinates instead of -1 due to the danger of using -1 as an index in python accessing +the last element of a data array for invalid pixels. +The function will now also no longer raise an error if the arguments are empty arrays and instead +just return an empty index array. +The function will also no longer log a warning in case of coordinates that do not match a camera pixel. +The function is very low-level and if not finding a pixel at the tested position warrants a warning or +is expected will depend on the calling code. From ceac8972c24c2bb6ba8c0f1dbca75b1f7a461de1 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Wed, 27 Sep 2023 11:22:16 +0200 Subject: [PATCH 128/264] Trying variation of the conditional --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a86806dd9df..9fa4a382f15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ env: jobs: tests: - if: ${{ ! contains(github.event.pull_request.labels.*.name, 'documentation') }} + if: ${{ contains(github.event.pull_request.labels.*.name, 'documentation') == 'false' }} runs-on: ${{ matrix.os }} strategy: matrix: From dcf422d1a2ba12cb2a4a161d96d9aeb2c2c87f81 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 21 Sep 2023 17:24:34 +0200 Subject: [PATCH 129/264] create dummy reference_location if missing meta --- ctapipe/io/simteleventsource.py | 35 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/ctapipe/io/simteleventsource.py b/ctapipe/io/simteleventsource.py index 98cdc37e72c..e0ab8cbc4aa 100644 --- a/ctapipe/io/simteleventsource.py +++ b/ctapipe/io/simteleventsource.py @@ -131,7 +131,7 @@ def parse_simtel_time(simtel_time): def _location_from_meta(global_meta): - """Extract reference location of subarray from metadata""" + """Extract reference location of subarray from metadata.""" lat = global_meta.get(b"*LATITUDE") lon = global_meta.get(b"*LONGITUDE") height = global_meta.get(b"ALTITUDE") @@ -350,7 +350,6 @@ def read_atmosphere_profile_from_simtel( context_manager = nullcontext(simtelfile) with context_manager as simtel: - if ( not hasattr(simtel, "atmospheric_profiles") or len(simtel.atmospheric_profiles) == 0 @@ -358,7 +357,6 @@ def read_atmosphere_profile_from_simtel( return [] for atmo in simtel.atmospheric_profiles: - metadata = dict( observation_level=atmo["obslevel"] * u.cm, atmosphere_id=atmo["id"], @@ -513,15 +511,14 @@ def __init__(self, input_url=Undefined, config=None, parent=None, **kwargs): ) if self.back_seekable and self.is_stream: raise IOError("back seekable was required but not possible for inputfile") - - self._subarray_info = self.prepare_subarray_info( - self.file_.telescope_descriptions, self.file_.header - ) ( self._scheduling_blocks, self._observation_blocks, ) = self._fill_scheduling_and_observation_blocks() self._simulation_config = self._parse_simulation_header() + self._subarray_info = self.prepare_subarray_info( + self.file_.telescope_descriptions, self.file_.header + ) self.start_pos = self.file_.tell() self.gain_selector = GainSelector.from_name( @@ -676,11 +673,16 @@ def prepare_subarray_info(self, telescope_descriptions, header): tel_positions[tel_id] = header["tel_pos"][tel_idx] * u.m name = self.file_.global_meta.get(b"ARRAY_CONFIG_NAME", b"MonteCarloArray") + + reference_location = ( + _location_from_meta(self.file_.global_meta) or self._make_dummy_location() + ) + subarray = SubarrayDescription( name=name.decode(), tel_positions=tel_positions, tel_descriptions=tel_descriptions, - reference_location=_location_from_meta(self.file_.global_meta), + reference_location=reference_location, ) self.n_telescopes_original = len(subarray) @@ -690,6 +692,22 @@ def prepare_subarray_info(self, telescope_descriptions, header): return subarray + def _make_dummy_location(self): + """ + Returns + ------- + EarthLocation: + Dummy earth location that is at the correct height (as given in the + SimulationConfigContainer), but with the lat/lon set to (0,0), i.e. + on "Null Island" + """ + obs_id = self.file_.header["run"] + return EarthLocation( + lon=0 * u.deg, + lat=0 * u.deg, + height=self._simulation_config[obs_id].prod_site_alt, + ) + @staticmethod def is_compatible(file_path): path = Path(file_path).expanduser() @@ -720,7 +738,6 @@ def _generate_events(self): pseudo_event_id = 0 for counter, array_event in enumerate(self.file_): - event_id = array_event.get("event_id", 0) if event_id == 0: pseudo_event_id -= 1 From 3294a84b84898821115657367bff75c105a97f5e Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Wed, 27 Sep 2023 13:52:34 +0200 Subject: [PATCH 130/264] Changed some numpy calls following the numpy 2.0 migration guide --- ctapipe/instrument/camera/geometry.py | 2 +- ctapipe/instrument/camera/image_conversion.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe/instrument/camera/geometry.py b/ctapipe/instrument/camera/geometry.py index dd55b14425b..50c227db619 100644 --- a/ctapipe/instrument/camera/geometry.py +++ b/ctapipe/instrument/camera/geometry.py @@ -800,7 +800,7 @@ def pixel_moment_matrix(self): x = self.pix_x.value y = self.pix_y.value - return np.row_stack( + return np.vstack( [ x, y, diff --git a/ctapipe/instrument/camera/image_conversion.py b/ctapipe/instrument/camera/image_conversion.py index c4131a77cc5..1e5fd4d7039 100644 --- a/ctapipe/instrument/camera/image_conversion.py +++ b/ctapipe/instrument/camera/image_conversion.py @@ -294,8 +294,8 @@ def get_orthogonal_grid_edges(pix_x, pix_y, scale_aspect=True): # with the maximal extension of the axes and the size of the pixels, # determine the number of bins in each direction - n_bins_x = int(np.round_(np.abs(np.max(pix_x) - np.min(pix_x)) / d_x) + 2) - n_bins_y = int(np.round_(np.abs(np.max(pix_y) - np.min(pix_y)) / d_y) + 2) + n_bins_x = int(np.round(np.abs(np.max(pix_x) - np.min(pix_x)) / d_x) + 2) + n_bins_y = int(np.round(np.abs(np.max(pix_y) - np.min(pix_y)) / d_y) + 2) x_edges = np.linspace(pix_x.min(), pix_x.max(), n_bins_x) y_edges = np.linspace(pix_y.min(), pix_y.max(), n_bins_y) From dcb87483c22f317d6fc2631e46f098d84cc74658 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Wed, 27 Sep 2023 14:00:04 +0200 Subject: [PATCH 131/264] Changelog --- docs/changes/2406.maintenance.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2406.maintenance.rst diff --git a/docs/changes/2406.maintenance.rst b/docs/changes/2406.maintenance.rst new file mode 100644 index 00000000000..2d4cf50ceac --- /dev/null +++ b/docs/changes/2406.maintenance.rst @@ -0,0 +1 @@ +Updated some numpy calls to not use depreciated functions. From f07bd163e0d3d3bd87691119312abefcda0ba8dc Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Wed, 27 Sep 2023 14:08:36 +0200 Subject: [PATCH 132/264] Fix import order --- ctapipe/instrument/camera/image_conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/instrument/camera/image_conversion.py b/ctapipe/instrument/camera/image_conversion.py index 1e5fd4d7039..318ebe10be6 100644 --- a/ctapipe/instrument/camera/image_conversion.py +++ b/ctapipe/instrument/camera/image_conversion.py @@ -1,5 +1,5 @@ -import numpy as np import astropy.units as u +import numpy as np __all__ = [ From 5302e0eefd9a4365f9833970ce674b5147ed232f Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Wed, 27 Sep 2023 14:13:19 +0200 Subject: [PATCH 133/264] Fix import order --- ctapipe/instrument/camera/image_conversion.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ctapipe/instrument/camera/image_conversion.py b/ctapipe/instrument/camera/image_conversion.py index 318ebe10be6..759375449ca 100644 --- a/ctapipe/instrument/camera/image_conversion.py +++ b/ctapipe/instrument/camera/image_conversion.py @@ -1,7 +1,6 @@ import astropy.units as u import numpy as np - __all__ = [ "unskew_hex_pixel_grid", "reskew_hex_pixel_grid", From fe857c4a9507d5b8fca4e15c3864e2d79a87f4c8 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 21 Sep 2023 17:25:10 +0200 Subject: [PATCH 134/264] Print reference location info in `info()` --- ctapipe/instrument/subarray.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ctapipe/instrument/subarray.py b/ctapipe/instrument/subarray.py index 5cefde4ff4c..ccdbbf8e9ca 100644 --- a/ctapipe/instrument/subarray.py +++ b/ctapipe/instrument/subarray.py @@ -126,6 +126,11 @@ def info(self, printer=print): printer(f"Subarray : {self.name}") printer(f"Num Tels : {self.n_tels}") printer(f"Footprint: {self.footprint:.2f}") + printer(f"Height : {self.reference_location.geodetic.height:.2f}") + printer( + f"Lon/Lat : {self.reference_location.geodetic.lon}, " + f"{self.reference_location.geodetic.lat} " + ) printer("") # print the per-telescope-type informatino: From b530c3539a48a05817e5d79902f42e66cff3f0e7 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 21 Sep 2023 17:34:26 +0200 Subject: [PATCH 135/264] add changelog entry --- docs/changes/2402.bugfix.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2402.bugfix.rst diff --git a/docs/changes/2402.bugfix.rst b/docs/changes/2402.bugfix.rst new file mode 100644 index 00000000000..a18e4349aa3 --- /dev/null +++ b/docs/changes/2402.bugfix.rst @@ -0,0 +1 @@ +Ensure that subarray.reference_location is always generated, even if the metadata is missing. In that case, construct a dummy location with the correct observatory height. From 6971cd8cfe26735cc2128d344510ad3be0522de9 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 27 Sep 2023 14:30:38 +0200 Subject: [PATCH 136/264] add changelog entry --- docs/changes/2402.bugfix.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/changes/2402.bugfix.rst b/docs/changes/2402.bugfix.rst index a18e4349aa3..fd0628c139b 100644 --- a/docs/changes/2402.bugfix.rst +++ b/docs/changes/2402.bugfix.rst @@ -1 +1,7 @@ -Ensure that subarray.reference_location is always generated, even if the metadata is missing. In that case, construct a dummy location with the correct observatory height. +Ensure that ``SubarrayDescription.reference_location`` is always generated by +```SimTelEventSource``, even if the metadata is missing. In that case, construct a +dummy location with the correct observatory height and latitude and longitude +equal to zero ("Null Island"). + +From now one require that ``SubarrayDescriptions`` contain a reference_location +when they are constructed From 5673029ed263d938acdd96e1930ba178e91f908c Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 21 Sep 2023 17:42:21 +0200 Subject: [PATCH 137/264] add some tests for reference_location --- ctapipe/io/tests/test_event_source.py | 6 ++++++ ctapipe/io/tests/test_simteleventsource.py | 7 ++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ctapipe/io/tests/test_event_source.py b/ctapipe/io/tests/test_event_source.py index 71074ddcb01..c4df13b41e0 100644 --- a/ctapipe/io/tests/test_event_source.py +++ b/ctapipe/io/tests/test_event_source.py @@ -1,4 +1,6 @@ +import astropy.units as u import pytest +from astropy.coordinates import EarthLocation from traitlets import TraitError from traitlets.config.loader import Config @@ -51,6 +53,10 @@ def observation_blocks(self): def datalevels(self): return (DataLevel.R0,) + @property + def reference_location(self): + return EarthLocation(lat=0, lon=0 * u.deg, height=0 * u.deg) + def test_can_be_implemented(): dataset = get_dataset_path(prod5_path) diff --git a/ctapipe/io/tests/test_simteleventsource.py b/ctapipe/io/tests/test_simteleventsource.py index e9e7ea31f9a..ab8cdfb690a 100644 --- a/ctapipe/io/tests/test_simteleventsource.py +++ b/ctapipe/io/tests/test_simteleventsource.py @@ -7,7 +7,7 @@ import astropy.units as u import numpy as np import pytest -from astropy.coordinates import Angle, Latitude +from astropy.coordinates import Angle, EarthLocation, Latitude from astropy.time import Time from traitlets.config import Config @@ -58,7 +58,6 @@ def test_simtel_event_source_on_gamma_test_one_event(): def test_that_event_is_not_modified_after_loop(): - dataset = prod5b_path with SimTelEventSource(input_url=dataset, max_events=2) as source: for event in source: @@ -124,6 +123,7 @@ def test_properties(): assert source.datalevels == (DataLevel.R0, DataLevel.R1) assert source.obs_ids == [7514] assert source.simulation_config[7514].corsika_version == 6990 + assert isinstance(source.subarray.reference_location, EarthLocation) def test_gamma_file_prod2(): @@ -228,7 +228,6 @@ def test_calibration_events(): def test_trigger_times(): - source = SimTelEventSource( input_url=calib_events_path, focal_length_choice="EQUIVALENT", @@ -248,7 +247,6 @@ def test_true_image(): input_url=calib_events_path, focal_length_choice="EQUIVALENT", ) as reader: - for event in reader: for tel in event.simulation.tel.values(): assert np.count_nonzero(tel.true_image) > 0 @@ -379,7 +377,6 @@ def test_only_config(): def test_calibscale_and_calibshift(prod5_gamma_simtel_path): - with SimTelEventSource(input_url=prod5_gamma_simtel_path, max_events=1) as source: event = next(iter(source)) From 451e9929438b25e7960d5b1ec359a3dc8cfe2d18 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 27 Sep 2023 11:51:23 +0200 Subject: [PATCH 138/264] check reference_location for prod2 files Should be Null Island --- ctapipe/io/tests/test_simteleventsource.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/ctapipe/io/tests/test_simteleventsource.py b/ctapipe/io/tests/test_simteleventsource.py index ab8cdfb690a..b4d3c0054ff 100644 --- a/ctapipe/io/tests/test_simteleventsource.py +++ b/ctapipe/io/tests/test_simteleventsource.py @@ -133,11 +133,11 @@ def test_gamma_file_prod2(): with SimTelEventSource( input_url=dataset, focal_length_choice="EQUIVALENT", - ) as reader: - assert reader.is_compatible(dataset) - assert reader.is_stream # using gzip subprocess makes it a stream + ) as source: + assert source.is_compatible(dataset) + assert source.is_stream # using gzip subprocess makes it a stream - for event in reader: + for event in source: if event.count == 0: assert event.r0.tel.keys() == {38, 47} elif event.count == 1: @@ -145,7 +145,15 @@ def test_gamma_file_prod2(): else: break - # test that max_events works: + # check also that for old files with no reference_locatino that we get back + # Null Island at the right height: + assert source.subarray.reference_location.geodetic.height > 100 * u.m + assert np.isclose( + source.subarray.reference_location.geodetic.lat, 0 * u.deg + ) + assert np.isclose( + source.subarray.reference_location.geodetic.lon, 0 * u.deg + ) def test_max_events(): From 37c7ee9f67f6ddcd50b1b8a2b3396b8f9af993ca Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 27 Sep 2023 13:33:39 +0200 Subject: [PATCH 139/264] add test to ensure select_subarray() works --- ctapipe/instrument/tests/test_subarray.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ctapipe/instrument/tests/test_subarray.py b/ctapipe/instrument/tests/test_subarray.py index 73f3ed6ffb7..fa99ddeff33 100644 --- a/ctapipe/instrument/tests/test_subarray.py +++ b/ctapipe/instrument/tests/test_subarray.py @@ -249,7 +249,6 @@ def test_unknown_telescopes(example_subarray): def test_multiplicity(subarray_prod5_paranal): - subarray = subarray_prod5_paranal.select_subarray([1, 2, 20, 21, 80, 81]) mask = np.array([True, False, True, True, False, False]) @@ -270,3 +269,14 @@ def test_multiplicity(subarray_prod5_paranal): np.testing.assert_equal(subarray.multiplicity(masks, "LST_LST_LSTCam"), [1, 2]) np.testing.assert_equal(subarray.multiplicity(masks, "MST_MST_FlashCam"), [2, 1]) np.testing.assert_equal(subarray.multiplicity(masks, "SST_ASTRI_CHEC"), [0, 1]) + + +def test_subarrays(subarray_prod5_paranal: SubarrayDescription): + """ + Check that constructing a new SubarrayDescription by using + `select_subarray()` works as expected. + """ + subarray = subarray_prod5_paranal.select_subarray([1, 2, 3, 4], name="NewArray") + assert subarray.name == "NewArray" + assert isinstance(subarray.reference_location, EarthLocation) + assert subarray.reference_location == subarray_prod5_paranal.reference_location From ef29550659b6b52c40f673b0e921da4bfee451f4 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 27 Sep 2023 13:32:42 +0200 Subject: [PATCH 140/264] require reference_location for SubarrayDescription before you could construct a SubarrayDescription without any attributes, but that's not at all useful --- ctapipe/calib/camera/tests/test_flatfield.py | 3 ++- ctapipe/calib/camera/tests/test_pedestals.py | 3 ++- ctapipe/conftest.py | 8 ++++++++ .../coordinates/tests/test_impact_distance.py | 3 ++- ctapipe/image/muon/tests/test_intensity_fit.py | 18 ++++++++++-------- ctapipe/image/tests/test_extractor.py | 9 ++++++--- .../tests/test_image_cleaner_component.py | 3 ++- ctapipe/image/tests/test_reducer.py | 3 ++- .../tests/test_sliding_window_correction.py | 3 ++- ctapipe/instrument/subarray.py | 13 ++++++++----- ctapipe/instrument/tests/test_subarray.py | 15 +++++++++++---- ctapipe/io/tests/test_toysource.py | 7 ++++--- ctapipe/visualization/tests/test_mpl.py | 7 +++++-- test_plugin/ctapipe_test_plugin/__init__.py | 8 +++----- 14 files changed, 67 insertions(+), 36 deletions(-) diff --git a/ctapipe/calib/camera/tests/test_flatfield.py b/ctapipe/calib/camera/tests/test_flatfield.py index 632dce7b414..ec0eeaf028c 100644 --- a/ctapipe/calib/camera/tests/test_flatfield.py +++ b/ctapipe/calib/camera/tests/test_flatfield.py @@ -10,7 +10,7 @@ from ctapipe.instrument import SubarrayDescription -def test_flasherflatfieldcalculator(prod5_sst): +def test_flasherflatfieldcalculator(prod5_sst, reference_location): """test of flasherFlatFieldCalculator""" tel_id = 0 n_gain = 2 @@ -22,6 +22,7 @@ def test_flasherflatfieldcalculator(prod5_sst): "test array", tel_positions={0: np.zeros(3) * u.m}, tel_descriptions={0: deepcopy(prod5_sst)}, + reference_location=reference_location, ) subarray.tel[0].camera.readout.reference_pulse_shape = np.ones((1, 2)) subarray.tel[0].camera.readout.reference_pulse_sample_width = u.Quantity(1, u.ns) diff --git a/ctapipe/calib/camera/tests/test_pedestals.py b/ctapipe/calib/camera/tests/test_pedestals.py index fe47ca74a84..7f17c9f1703 100644 --- a/ctapipe/calib/camera/tests/test_pedestals.py +++ b/ctapipe/calib/camera/tests/test_pedestals.py @@ -15,7 +15,7 @@ from ctapipe.instrument import SubarrayDescription -def test_pedestal_integrator(prod5_sst): +def test_pedestal_integrator(prod5_sst, reference_location): """test of PedestalIntegrator""" tel_id = 0 @@ -28,6 +28,7 @@ def test_pedestal_integrator(prod5_sst): "test array", tel_positions={0: np.zeros(3) * u.m}, tel_descriptions={0: deepcopy(prod5_sst)}, + reference_location=reference_location, ) subarray.tel[0].camera.readout.reference_pulse_shape = np.ones((1, 2)) subarray.tel[0].camera.readout.reference_pulse_sample_width = u.Quantity(1, u.ns) diff --git a/ctapipe/conftest.py b/ctapipe/conftest.py index 3c22f5b9f65..92b61c5c841 100644 --- a/ctapipe/conftest.py +++ b/ctapipe/conftest.py @@ -4,7 +4,9 @@ from copy import deepcopy +import astropy.units as u import pytest +from astropy.coordinates import EarthLocation from pytest_astropy_header.display import PYTEST_HEADER_MODULES from ctapipe.core import run_tool @@ -616,3 +618,9 @@ def disp_reconstructor_path(model_tmp_path, gamma_train_clf): ) assert ret == 0 return out_file + + +@pytest.fixture(scope="function") +def reference_location(): + """a dummy EarthLocation to use for SubarrayDescriptions""" + return EarthLocation(lon=-17 * u.deg, lat=28 * u.deg, height=2200 * u.m) diff --git a/ctapipe/coordinates/tests/test_impact_distance.py b/ctapipe/coordinates/tests/test_impact_distance.py index 4de8abcf95c..5d959e8e192 100644 --- a/ctapipe/coordinates/tests/test_impact_distance.py +++ b/ctapipe/coordinates/tests/test_impact_distance.py @@ -54,7 +54,7 @@ def test_impact_distance(): assert np.allclose(impacts, expected_impacts) -def test_shower_impact_distance(): +def test_shower_impact_distance(reference_location): """test several boundary cases using the function that takes a Subarray and Container """ @@ -63,6 +63,7 @@ def test_shower_impact_distance(): name="test", tel_positions={1: [0, 0, 0] * u.m, 2: [0, 1, 0] * u.m, 3: [0, 2, 0] * u.m}, tel_descriptions={1: None, 2: None, 3: None}, + reference_location=reference_location, ) # coming from zenith to the center of the array, the impact distance should diff --git a/ctapipe/image/muon/tests/test_intensity_fit.py b/ctapipe/image/muon/tests/test_intensity_fit.py index 25f8a98f620..eeff33131b0 100644 --- a/ctapipe/image/muon/tests/test_intensity_fit.py +++ b/ctapipe/image/muon/tests/test_intensity_fit.py @@ -19,7 +19,7 @@ def test_chord_length(): assert np.isclose(length, 0, atol=1e-15) -def test_muon_efficiency_fit(prod5_lst): +def test_muon_efficiency_fit(prod5_lst, reference_location): from ctapipe.coordinates import CameraFrame, TelescopeFrame from ctapipe.image.muon.intensity_fitter import ( MuonIntensityFitter, @@ -29,9 +29,10 @@ def test_muon_efficiency_fit(prod5_lst): telescope = prod5_lst subarray = SubarrayDescription( - "LSTMono", - {0: [0, 0, 0] * u.m}, - {0: telescope}, + name="LSTMono", + tel_positions={0: [0, 0, 0] * u.m}, + tel_descriptions={0: telescope}, + reference_location=reference_location, ) center_x = 0.8 * u.deg @@ -94,15 +95,16 @@ def test_muon_efficiency_fit(prod5_lst): assert np.isfinite(result.likelihood_value) -def test_scts(prod5_sst): +def test_scts(prod5_sst, reference_location): from ctapipe.image.muon.intensity_fitter import MuonIntensityFitter from ctapipe.instrument import SubarrayDescription telescope = prod5_sst subarray = SubarrayDescription( - "ssts", - {0: [0, 0, 0] * u.m}, - {0: telescope}, + name="ssts", + tel_positions={0: [0, 0, 0] * u.m}, + tel_descriptions={0: telescope}, + reference_location=reference_location, ) fitter = MuonIntensityFitter(subarray=subarray) diff --git a/ctapipe/image/tests/test_extractor.py b/ctapipe/image/tests/test_extractor.py index 3a54d65f291..169f9b58413 100644 --- a/ctapipe/image/tests/test_extractor.py +++ b/ctapipe/image/tests/test_extractor.py @@ -39,7 +39,7 @@ @pytest.fixture(scope="module") -def subarray(prod5_sst): +def subarray(prod5_sst, reference_location): subarray = SubarrayDescription( "test array", tel_positions={1: np.zeros(3) * u.m, 2: np.zeros(3) * u.m}, @@ -47,6 +47,7 @@ def subarray(prod5_sst): 1: deepcopy(prod5_sst), 2: deepcopy(prod5_sst), }, + reference_location=reference_location, ) # Create reference pulse @@ -67,21 +68,23 @@ def subarray(prod5_sst): @pytest.fixture(scope="module") -def subarray_1_LST(prod3_lst): +def subarray_1_LST(prod3_lst, reference_location): subarray = SubarrayDescription( "One LST", tel_positions={1: np.zeros(3) * u.m}, tel_descriptions={1: prod3_lst}, + reference_location=reference_location, ) return subarray @pytest.fixture(scope="module") -def subarray_mst_fc(prod5_mst_flashcam): +def subarray_mst_fc(prod5_mst_flashcam, reference_location): subarray = SubarrayDescription( "One MST with FlashCam", tel_positions={1: np.zeros(3) * u.m}, tel_descriptions={1: prod5_mst_flashcam}, + reference_location=reference_location, ) return subarray diff --git a/ctapipe/image/tests/test_image_cleaner_component.py b/ctapipe/image/tests/test_image_cleaner_component.py index 7799d568b19..1b8ef34274b 100644 --- a/ctapipe/image/tests/test_image_cleaner_component.py +++ b/ctapipe/image/tests/test_image_cleaner_component.py @@ -7,7 +7,7 @@ @pytest.mark.parametrize("method", ImageCleaner.non_abstract_subclasses().keys()) -def test_image_cleaner(method, prod5_mst_nectarcam): +def test_image_cleaner(method, prod5_mst_nectarcam, reference_location): """Test that we can construct and use a component-based ImageCleaner""" config = Config( @@ -32,6 +32,7 @@ def test_image_cleaner(method, prod5_mst_nectarcam): name="test", tel_positions={1: None}, tel_descriptions={1: prod5_mst_nectarcam}, + reference_location=reference_location, ) clean = ImageCleaner.from_name(method, config=config, subarray=subarray) diff --git a/ctapipe/image/tests/test_reducer.py b/ctapipe/image/tests/test_reducer.py index b8d8df7e25e..ca6e8fcaba6 100644 --- a/ctapipe/image/tests/test_reducer.py +++ b/ctapipe/image/tests/test_reducer.py @@ -9,7 +9,7 @@ @pytest.fixture(scope="module") -def subarray_lst(prod3_lst): +def subarray_lst(prod3_lst, reference_location): tel_id = 1 subarray = SubarrayDescription( "test array lst", @@ -18,6 +18,7 @@ def subarray_lst(prod3_lst): 1: prod3_lst, 2: prod3_lst, }, + reference_location=reference_location, ) n_pixels = subarray.tel[tel_id].camera.geometry.n_pixels diff --git a/ctapipe/image/tests/test_sliding_window_correction.py b/ctapipe/image/tests/test_sliding_window_correction.py index 7f8806ebc7a..73625511c95 100644 --- a/ctapipe/image/tests/test_sliding_window_correction.py +++ b/ctapipe/image/tests/test_sliding_window_correction.py @@ -14,7 +14,7 @@ from ctapipe.instrument import SubarrayDescription -def test_sw_pulse_lst(prod5_lst): +def test_sw_pulse_lst(prod5_lst, reference_location): """ Test function of sliding window extractor for LST camera pulse shape with the correction for the integration window completeness @@ -25,6 +25,7 @@ def test_sw_pulse_lst(prod5_lst): "LST1", tel_positions={1: np.zeros(3) * u.m}, tel_descriptions={1: prod5_lst}, + reference_location=reference_location, ) tel_id = list(subarray.tel.keys())[0] diff --git a/ctapipe/instrument/subarray.py b/ctapipe/instrument/subarray.py index ccdbbf8e9ca..3382245a9a7 100644 --- a/ctapipe/instrument/subarray.py +++ b/ctapipe/instrument/subarray.py @@ -70,9 +70,9 @@ class SubarrayDescription: def __init__( self, name, - tel_positions=None, - tel_descriptions=None, - reference_location=None, + tel_positions, + tel_descriptions, + reference_location, ): """ Initialize a new SubarrayDescription @@ -358,7 +358,7 @@ def to_table(self, kind="subarray"): tab.meta.update(meta) return tab - def select_subarray(self, tel_ids, name=None): + def select_subarray(self, tel_ids, name=None) -> "SubarrayDescription": """ return a new SubarrayDescription that is a sub-array of this one @@ -385,7 +385,10 @@ def select_subarray(self, tel_ids, name=None): name = self.name + "_" + _range_extraction(tel_ids) newsub = SubarrayDescription( - name, tel_positions=tel_positions, tel_descriptions=tel_descriptions + name, + tel_positions=tel_positions, + tel_descriptions=tel_descriptions, + reference_location=self.reference_location, ) return newsub diff --git a/ctapipe/instrument/tests/test_subarray.py b/ctapipe/instrument/tests/test_subarray.py index fa99ddeff33..488cf6fc4fe 100644 --- a/ctapipe/instrument/tests/test_subarray.py +++ b/ctapipe/instrument/tests/test_subarray.py @@ -94,11 +94,12 @@ def test_tel_indexing(example_subarray): assert np.all(sub.tel_ids_to_indices([1, 2, 3]) == np.array([0, 1, 2])) -def test_tel_ids_to_mask(prod5_lst): +def test_tel_ids_to_mask(prod5_lst, reference_location): subarray = SubarrayDescription( "someone_counted_in_binary", tel_positions={1: [0, 0, 0] * u.m, 10: [50, 0, 0] * u.m}, tel_descriptions={1: prod5_lst, 10: prod5_lst}, + reference_location=reference_location, ) assert np.all(subarray.tel_ids_to_mask([]) == [False, False]) @@ -153,7 +154,7 @@ def test_hdf(example_subarray, tmp_path): assert read == example_subarray -def test_hdf_same_camera(tmp_path, prod5_lst, prod5_mst_flashcam): +def test_hdf_same_camera(tmp_path, prod5_lst, prod5_mst_flashcam, reference_location): """Test writing / reading subarray to hdf5 with a subarray that has two different telescopes with the same camera """ @@ -168,7 +169,12 @@ def test_hdf_same_camera(tmp_path, prod5_lst, prod5_mst_flashcam): } pos = {1: [0, 0, 0] * u.m, 2: [50, 0, 0] * u.m} - array = SubarrayDescription("test array", tel_positions=pos, tel_descriptions=tel) + array = SubarrayDescription( + "test array", + tel_positions=pos, + tel_descriptions=tel, + reference_location=reference_location, + ) path = tmp_path / "subarray.h5" array.to_hdf(path) @@ -176,7 +182,7 @@ def test_hdf_same_camera(tmp_path, prod5_lst, prod5_mst_flashcam): assert array == read -def test_hdf_duplicate_string_repr(tmp_path, prod5_lst): +def test_hdf_duplicate_string_repr(tmp_path, prod5_lst, reference_location): """Test writing and reading of a subarray with two telescopes that are different but have the same name. """ @@ -193,6 +199,7 @@ def test_hdf_duplicate_string_repr(tmp_path, prod5_lst): "test array", tel_positions={1: [0, 0, 0] * u.m, 2: [50, 0, 0] * u.m}, tel_descriptions={1: tel1, 2: tel2}, + reference_location=reference_location, ) # defensive checks to make sure we are actually testing this diff --git a/ctapipe/io/tests/test_toysource.py b/ctapipe/io/tests/test_toysource.py index 4119c07b3f9..f8e58c4d439 100644 --- a/ctapipe/io/tests/test_toysource.py +++ b/ctapipe/io/tests/test_toysource.py @@ -6,8 +6,7 @@ @pytest.fixture(scope="module") -def subarray(prod5_lst): - +def subarray(prod5_lst, reference_location): tels = [prod5_lst] * 4 positions = { @@ -18,7 +17,9 @@ def subarray(prod5_lst): } descriptions = {i: t for i, t in enumerate(tels, start=1)} - return SubarrayDescription("test", positions, descriptions) + return SubarrayDescription( + "test", positions, descriptions, reference_location=reference_location + ) def test_toyeventsource(subarray): diff --git a/ctapipe/visualization/tests/test_mpl.py b/ctapipe/visualization/tests/test_mpl.py index 31867d5d158..4cc0983560e 100644 --- a/ctapipe/visualization/tests/test_mpl.py +++ b/ctapipe/visualization/tests/test_mpl.py @@ -154,7 +154,7 @@ def test_camera_display_multiple(prod5_lst_cam, tmp_path): fig.savefig(tmp_path / "result.png") -def test_array_display(prod5_mst_nectarcam): +def test_array_display(prod5_mst_nectarcam, reference_location): """check that we can do basic array display functionality""" from ctapipe.containers import ( ArrayEventContainer, @@ -174,7 +174,10 @@ def test_array_display(prod5_mst_nectarcam): tel_pos[ii + 1] = pos sub = SubarrayDescription( - name="TestSubarray", tel_positions=tel_pos, tel_descriptions=tels + name="TestSubarray", + tel_positions=tel_pos, + tel_descriptions=tels, + reference_location=reference_location, ) # Create a fake event containing telescope-wise information about diff --git a/test_plugin/ctapipe_test_plugin/__init__.py b/test_plugin/ctapipe_test_plugin/__init__.py index 060c8109d8a..2c06f79619f 100644 --- a/test_plugin/ctapipe_test_plugin/__init__.py +++ b/test_plugin/ctapipe_test_plugin/__init__.py @@ -1,6 +1,7 @@ """An example (and test) plugin for ctapipe providing an EventSource and a Reconstructor""" import astropy.units as u import numpy as np +from astropy.coordinates import EarthLocation from ctapipe.containers import ( ObservationBlockContainer, @@ -57,17 +58,14 @@ ) -telescope = TelescopeDescription( - "plugin", - optics=optics, - camera=camera, -) +telescope = TelescopeDescription("plugin", optics=optics, camera=camera) subarray = SubarrayDescription( name="plugin", tel_descriptions={1: telescope}, tel_positions={1: [0, 0, 0] * u.m}, + reference_location=EarthLocation(lat=0 * u.deg, lon=0 * u.deg, height=100 * u.m), ) From 35a0885d39082cd5b9e0bdacf327c2149bc8cae3 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 27 Sep 2023 14:48:12 +0200 Subject: [PATCH 141/264] change scope of fixture --- ctapipe/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/conftest.py b/ctapipe/conftest.py index 92b61c5c841..e40abb42d72 100644 --- a/ctapipe/conftest.py +++ b/ctapipe/conftest.py @@ -620,7 +620,7 @@ def disp_reconstructor_path(model_tmp_path, gamma_train_clf): return out_file -@pytest.fixture(scope="function") +@pytest.fixture(scope="session") def reference_location(): """a dummy EarthLocation to use for SubarrayDescriptions""" return EarthLocation(lon=-17 * u.deg, lat=28 * u.deg, height=2200 * u.m) From 18832ea7ac6f3851f67ca25d6a91866d894c83eb Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 27 Sep 2023 16:05:09 +0200 Subject: [PATCH 142/264] avoid "truthiness" of EarthLocation error --- ctapipe/io/simteleventsource.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe/io/simteleventsource.py b/ctapipe/io/simteleventsource.py index e0ab8cbc4aa..632277a566c 100644 --- a/ctapipe/io/simteleventsource.py +++ b/ctapipe/io/simteleventsource.py @@ -674,9 +674,9 @@ def prepare_subarray_info(self, telescope_descriptions, header): name = self.file_.global_meta.get(b"ARRAY_CONFIG_NAME", b"MonteCarloArray") - reference_location = ( - _location_from_meta(self.file_.global_meta) or self._make_dummy_location() - ) + reference_location = _location_from_meta(self.file_.global_meta) + if reference_location is None: + reference_location = self._make_dummy_location() subarray = SubarrayDescription( name=name.decode(), From ea6ca33c008bfef68f31ba836cf1910e8d66efec Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:25:13 +0200 Subject: [PATCH 143/264] Trying new magic conditional, see if this works as intended. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9fa4a382f15..f0c6244ba26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ env: jobs: tests: - if: ${{ contains(github.event.pull_request.labels.*.name, 'documentation') == 'false' }} + if: !contains(github.event.pull_request.labels.*.name, 'documentation') runs-on: ${{ matrix.os }} strategy: matrix: From c304b890e64096f5e17fd7594fda319ecf4d96f9 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:30:16 +0200 Subject: [PATCH 144/264] Trying new magic conditional, see if this works as intended. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0c6244ba26..4259b78540a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ env: jobs: tests: - if: !contains(github.event.pull_request.labels.*.name, 'documentation') + if: ! contains(github.event.pull_request.labels.*.name, 'documentation') runs-on: ${{ matrix.os }} strategy: matrix: From f346ea6f3d93ecfd41b7c8812bc0a33e66aff78f Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:35:27 +0200 Subject: [PATCH 145/264] Trying new magic conditional, see if this works as intended. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4259b78540a..cca0f0ad0b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ env: jobs: tests: - if: ! contains(github.event.pull_request.labels.*.name, 'documentation') + if: contains(github.event.pull_request.labels.*.name, 'documentation') != true runs-on: ${{ matrix.os }} strategy: matrix: From 1450eb8e1a5602fde5c1bfc79eb133cbed74f84b Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:43:34 +0200 Subject: [PATCH 146/264] More tests of how to formulate conditional --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cca0f0ad0b6..1f57eb353c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ env: jobs: tests: - if: contains(github.event.pull_request.labels.*.name, 'documentation') != true + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false runs-on: ${{ matrix.os }} strategy: matrix: From 22e74d44e61af5bebdde4e8b6bd492e90ae7fa9c Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:04:38 +0200 Subject: [PATCH 147/264] Think I understand the problem now --- .github/workflows/ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f57eb353c9..95971a4cee4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,6 @@ env: jobs: tests: - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false runs-on: ${{ matrix.os }} strategy: matrix: @@ -66,6 +65,7 @@ jobs: if: matrix.install-method == 'mamba' env: PYTHON_VERSION: ${{ matrix.python-version }} + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | # setup correct python version sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml @@ -88,10 +88,12 @@ jobs: # Login shells on macOS prepend system paths, so we need to # prepend the python path from actions/setup-python. # Micromamba sets up ~/.bash_profile, where we need to set the path now. + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' - name: Install dependencies + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | python --version pip install codecov pytest-cov flake8 restructuredtext-lint pytest-xdist 'coverage!=6.3.0' @@ -105,10 +107,12 @@ jobs: restructuredtext-lint README.rst - name: ctapipe-info + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | ctapipe-info --all - name: Tests + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | cd $(mktemp -d) pytest -n auto --dist loadscope \ From 09e0178c2244e1610ce69b67dd56403adc07d59b Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:08:56 +0200 Subject: [PATCH 148/264] Update nitpicking ignores --- docs/conf.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index b848261c4d8..6811563ab5d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -95,6 +95,19 @@ def setup(app): # These links are ignored in the checks, necessary due to broken intersphinx for # these nitpick_ignore = [ + # needed for building the docs with python 3.11 locally. + # we use the lowest supported version on readthedocs, so that is what we use the intersphinx + # link above + ("py:class", "enum.StrEnum"), + # these are coming from traitlets: + ("py:class", "t.Union"), + ("py:class", "t.Any"), + ("py:class", "t.Dict"), + ("py:class", "t.Optional"), + ("py:class", "t.Type"), + ("py:class", "t.List"), + ("py:class", "t.Tuple"), + ("py:class", "Config"), ("py:class", "traitlets.config.configurable.Configurable"), ("py:class", "traitlets.traitlets.HasTraits"), ("py:class", "traitlets.traitlets.HasDescriptors"), @@ -108,6 +121,12 @@ def setup(app): ("py:class", "traitlets.config.application.Application"), ("py:class", "traitlets.utils.sentinel.Sentinel"), ("py:class", "traitlets.traitlets.ObserveHandler"), + ("py:obj", "traitlets.traitlets.G"), + ("py:obj", "traitlets.traitlets.S"), + ("py:class", "traitlets.traitlets.T"), + ("py:class", "re.Pattern[t.Any]"), + ("py:class", "Sentinel"), + ("py:class", "ObserveHandler"), ("py:obj", "traitlets.config.boolean_flag"), ("py:obj", "traitlets.TraitError"), ("py:obj", "-v"), # fix for wrong syntax in a traitlets docstring @@ -119,6 +138,8 @@ def setup(app): ("py:class", "astropy.coordinates.baseframe.BaseCoordinateFrame"), ("py:class", "astropy.table.table.Table"), ("py:class", "eventio.simtel.simtelfile.SimTelFile"), + ("py:class", "ctapipe.compat.StrEnum"), + ("py:class", "ctapipe.compat.StrEnum"), ] # The suffix(es) of source filenames. From 902a69139f8d9f9da31208ef6b182ccf001e6323 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:11:46 +0200 Subject: [PATCH 149/264] Fixing syntax errors --- .github/workflows/ci.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95971a4cee4..555c243f32d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,33 +62,31 @@ jobs: key: ctapipe-test-data - name: Prepare mamba installation - if: matrix.install-method == 'mamba' + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false env: PYTHON_VERSION: ${{ matrix.python-version }} - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | # setup correct python version sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml - name: mamba setup - if: matrix.install-method == 'mamba' + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false uses: mamba-org/provision-with-micromamba@v14 - name: Python setup - if: matrix.install-method == 'pip' + if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} + - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation') == false name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 # Login shells on macOS prepend system paths, so we need to # prepend the python path from actions/setup-python. # Micromamba sets up ~/.bash_profile, where we need to set the path now. - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' From 36c46a6d2e35ec893af4300ac3f90cea98486cce Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:18:20 +0200 Subject: [PATCH 150/264] Messing about with syntax --- .github/workflows/ci.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 555c243f32d..b8f68ac0ba0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: key: ctapipe-test-data - name: Prepare mamba installation - if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'mamba' env: PYTHON_VERSION: ${{ matrix.python-version }} run: | @@ -70,17 +70,20 @@ jobs: sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml - name: mamba setup - if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'mamba' uses: mamba-org/provision-with-micromamba@v14 + with: + environment-file: environment.yml + cache-downloads: true - name: Python setup - if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'pip' uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation') == false + - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 @@ -91,7 +94,6 @@ jobs: tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' - name: Install dependencies - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | python --version pip install codecov pytest-cov flake8 restructuredtext-lint pytest-xdist 'coverage!=6.3.0' From 3ba8e3e720ec672254ea0f8ac5b3fd61e3966f10 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:20:26 +0200 Subject: [PATCH 151/264] Fix conflict with main --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8f68ac0ba0..30791280b48 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' - uses: mamba-org/provision-with-micromamba@v14 + uses: mamba-org/setup-micromamba@v1 with: environment-file: environment.yml cache-downloads: true From 1ab4c43a26db7f2590326de87b88af78478bf928 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:25:55 +0200 Subject: [PATCH 152/264] Adding skip to more stages --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 304a69a0af7..a2c265ac93d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,14 +83,14 @@ jobs: sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml - name: mamba setup - if: matrix.install-method == 'mamba' + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false uses: mamba-org/setup-micromamba@v1 with: environment-file: environment.yml cache-downloads: true - name: Python setup - if: matrix.install-method == 'pip' + if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} @@ -107,6 +107,7 @@ jobs: tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' - name: Install dependencies + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | python --version pip install pytest-cov restructuredtext-lint pytest-xdist 'coverage!=6.3.0' @@ -115,6 +116,7 @@ jobs: pip freeze - name: Static codechecks + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | restructuredtext-lint README.rst From 8bbd4376bb66ec93aa66112aace6dc151bf15cf6 Mon Sep 17 00:00:00 2001 From: Noah Biederbeck Date: Thu, 19 Jan 2023 13:16:26 +0100 Subject: [PATCH 153/264] run test only if labels don't contain 'documentation' --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2c265ac93d..03332f59e77 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,7 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: + if: ${{ ! contains(github.event.pull_request.labels.*.name, 'documentation') }} runs-on: ${{ matrix.os }} needs: lint strategy: From abbdac24481cd6ac5851949b51b60e92c4248f68 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Wed, 27 Sep 2023 11:22:16 +0200 Subject: [PATCH 154/264] Trying variation of the conditional --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03332f59e77..51e2f23de21 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: - if: ${{ ! contains(github.event.pull_request.labels.*.name, 'documentation') }} + if: ${{ contains(github.event.pull_request.labels.*.name, 'documentation') == 'false' }} runs-on: ${{ matrix.os }} needs: lint strategy: From dabc4c921906fd930a69d57365b20c7a2087922b Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:25:13 +0200 Subject: [PATCH 155/264] Trying new magic conditional, see if this works as intended. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51e2f23de21..0da55406bcf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: - if: ${{ contains(github.event.pull_request.labels.*.name, 'documentation') == 'false' }} + if: !contains(github.event.pull_request.labels.*.name, 'documentation') runs-on: ${{ matrix.os }} needs: lint strategy: From 120908325e140afc51e585d1f13bc5ba24907db0 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:30:16 +0200 Subject: [PATCH 156/264] Trying new magic conditional, see if this works as intended. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0da55406bcf..084d7ee47b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: - if: !contains(github.event.pull_request.labels.*.name, 'documentation') + if: ! contains(github.event.pull_request.labels.*.name, 'documentation') runs-on: ${{ matrix.os }} needs: lint strategy: From 3aac74b738bc002286c083a8f5d5dce77be03e26 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:35:27 +0200 Subject: [PATCH 157/264] Trying new magic conditional, see if this works as intended. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 084d7ee47b3..7be79505893 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: - if: ! contains(github.event.pull_request.labels.*.name, 'documentation') + if: contains(github.event.pull_request.labels.*.name, 'documentation') != true runs-on: ${{ matrix.os }} needs: lint strategy: From c8896f1e8e0ce99226a949d0bde090768c673818 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 13:43:34 +0200 Subject: [PATCH 158/264] More tests of how to formulate conditional --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7be79505893..17e83573f42 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: - if: contains(github.event.pull_request.labels.*.name, 'documentation') != true + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false runs-on: ${{ matrix.os }} needs: lint strategy: From 7e1141573c65dce95c49d6e2c3a2c828ec080921 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:04:38 +0200 Subject: [PATCH 159/264] Think I understand the problem now --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 17e83573f42..a77c050c6d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,6 @@ jobs: with: extra_args: --files $(git diff origin/main --name-only) tests: - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false runs-on: ${{ matrix.os }} needs: lint strategy: @@ -79,6 +78,7 @@ jobs: if: matrix.install-method == 'mamba' env: PYTHON_VERSION: ${{ matrix.python-version }} + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | # setup correct python version sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml @@ -104,6 +104,7 @@ jobs: # Login shells on macOS prepend system paths, so we need to # prepend the python path from actions/setup-python. # Micromamba sets up ~/.bash_profile, where we need to set the path now. + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' From 8dde9f7d418fdb6da6adc6bb481efcbf4d531c37 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:11:46 +0200 Subject: [PATCH 160/264] Rebasing on main --- .github/workflows/ci.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a77c050c6d1..19798def29e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,10 +75,9 @@ jobs: key: ctapipe-test-data - name: Prepare mamba installation - if: matrix.install-method == 'mamba' + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false env: PYTHON_VERSION: ${{ matrix.python-version }} - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | # setup correct python version sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml @@ -91,20 +90,19 @@ jobs: cache-downloads: true - name: Python setup - if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} + - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation') == false name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 # Login shells on macOS prepend system paths, so we need to # prepend the python path from actions/setup-python. # Micromamba sets up ~/.bash_profile, where we need to set the path now. - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' From 38471fdb0b5e145f7b9b84906dbee9b1fabda63e Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:18:20 +0200 Subject: [PATCH 161/264] Messing about with syntax --- .github/workflows/ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19798def29e..4277f0f911d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,7 @@ jobs: key: ctapipe-test-data - name: Prepare mamba installation - if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'mamba' env: PYTHON_VERSION: ${{ matrix.python-version }} run: | @@ -84,19 +84,19 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false - uses: mamba-org/setup-micromamba@v1 + uses: mamba-org/provision-with-micromamba@v14 with: environment-file: environment.yml cache-downloads: true - name: Python setup - if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'pip' uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation') == false + - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 @@ -107,7 +107,6 @@ jobs: tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' - name: Install dependencies - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | python --version pip install pytest-cov restructuredtext-lint pytest-xdist 'coverage!=6.3.0' From 0b623aba2e82e60a13f0c642a059ed02f86c59c4 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:20:26 +0200 Subject: [PATCH 162/264] Fix conflict with main --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4277f0f911d..ee951d242ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,7 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false - uses: mamba-org/provision-with-micromamba@v14 + uses: mamba-org/setup-micromamba@v1 with: environment-file: environment.yml cache-downloads: true From c63ffcc1a38ac0a1f7d92d94e0406b0a1b551077 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:25:55 +0200 Subject: [PATCH 163/264] Adding skip to more stages --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee951d242ad..a2c265ac93d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,7 +90,7 @@ jobs: cache-downloads: true - name: Python setup - if: matrix.install-method == 'pip' + if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} @@ -107,6 +107,7 @@ jobs: tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' - name: Install dependencies + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | python --version pip install pytest-cov restructuredtext-lint pytest-xdist 'coverage!=6.3.0' From 58e1972f1e644dbd2a3c87df6c0e9128eff6a93b Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Fri, 6 Oct 2023 13:44:08 +0200 Subject: [PATCH 164/264] Changed the label triggering skipping tests --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2c265ac93d..d3d5188032d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,14 +83,14 @@ jobs: sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml - name: mamba setup - if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false uses: mamba-org/setup-micromamba@v1 with: environment-file: environment.yml cache-downloads: true - name: Python setup - if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'pip' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} @@ -107,7 +107,7 @@ jobs: tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' - name: Install dependencies - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false run: | python --version pip install pytest-cov restructuredtext-lint pytest-xdist 'coverage!=6.3.0' @@ -116,17 +116,17 @@ jobs: pip freeze - name: Static codechecks - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false run: | restructuredtext-lint README.rst - name: ctapipe-info - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false run: | ctapipe-info --all - name: Tests - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false run: | cd $(mktemp -d) pytest -n auto --dist loadscope \ From a70f2ff7252f093e1ed97876447c65f3ab4998f8 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 19 Oct 2023 17:31:30 +0200 Subject: [PATCH 165/264] Add more nitpick ignores to fix docs build after traitlets update --- docs/conf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index ba59f8e41f0..5ae2d8c7170 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -131,6 +131,8 @@ def setup(app): ("py:class", "traitlets.config.application.Application"), ("py:class", "traitlets.utils.sentinel.Sentinel"), ("py:class", "traitlets.traitlets.ObserveHandler"), + ("py:class", "StrDict"), + ("py:class", "ClassesType"), ("py:obj", "traitlets.traitlets.G"), ("py:obj", "traitlets.traitlets.S"), ("py:class", "traitlets.traitlets.T"), From 271600c026824df63331a3c1e59670bb5920fba3 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 19 Oct 2023 15:13:15 +0200 Subject: [PATCH 166/264] Add option to override obs_id in SimTelEventSource Simulations were performed that re-use the same CORSIKA run numbers, e.g. different pointing positions for the same particles in prod5 and also different particles for the same pointing. To still enable unique obs_ids in merged files for these productions, an "override_obs_id" option is added to the ``SimTelEventSource`` that can be used to assign new, globally unique ids. The original run number is added to the ``SimulationConfigContainer``. --- ctapipe/containers.py | 1 + ctapipe/io/simteleventsource.py | 42 ++++++++++++++-------- ctapipe/io/tests/test_simteleventsource.py | 22 ++++++++++++ docs/changes/2411.features.rst | 3 ++ 4 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 docs/changes/2411.features.rst diff --git a/ctapipe/containers.py b/ctapipe/containers.py index cb4282c5d4c..df8c8621b2d 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -772,6 +772,7 @@ class SimulationConfigContainer(Container): Configuration parameters of the simulation """ + run_number = Field(np.int32(-1), description="Original sim_telarray run number") corsika_version = Field(nan, description="CORSIKA version * 1000") simtel_version = Field(nan, description="sim_telarray version * 1000") energy_range_min = Field( diff --git a/ctapipe/io/simteleventsource.py b/ctapipe/io/simteleventsource.py index 632277a566c..70e8e93f81a 100644 --- a/ctapipe/io/simteleventsource.py +++ b/ctapipe/io/simteleventsource.py @@ -49,7 +49,7 @@ from ..coordinates import CameraFrame, shower_impact_distance from ..core import Map from ..core.provenance import Provenance -from ..core.traits import Bool, ComponentName, Float, Undefined, UseEnum +from ..core.traits import Bool, ComponentName, Float, Integer, Undefined, UseEnum from ..instrument import ( CameraDescription, CameraGeometry, @@ -483,6 +483,12 @@ class SimTelEventSource(EventSource): ), ).tag(config=True) + override_obs_id = Integer( + default_value=None, + allow_none=True, + help="Use the given obs_id instead of the run number from sim_telarray", + ).tag(config=True) + def __init__(self, input_url=Undefined, config=None, parent=None, **kwargs): """ EventSource for simtelarray files using the pyeventio library. @@ -701,11 +707,10 @@ def _make_dummy_location(self): SimulationConfigContainer), but with the lat/lon set to (0,0), i.e. on "Null Island" """ - obs_id = self.file_.header["run"] return EarthLocation( lon=0 * u.deg, lat=0 * u.deg, - height=self._simulation_config[obs_id].prod_site_alt, + height=self._simulation_config[self.obs_id].prod_site_alt, ) @staticmethod @@ -743,7 +748,7 @@ def _generate_events(self): pseudo_event_id -= 1 event_id = pseudo_event_id - obs_id = self.file_.header["run"] + obs_id = self.obs_id trigger = self._fill_trigger_info(array_event) if trigger.event_type == EventType.SUBARRAY: @@ -1007,12 +1012,14 @@ def _parse_simulation_header(self): point in time, this dictionary will always have length 1. """ - assert len(self.obs_ids) == 1 - obs_id = self.obs_ids[0] + obs_id = self.obs_id # With only one run, we can take the first entry: mc_run_head = self.file_.mc_run_headers[-1] simulation_config = SimulationConfigContainer( + run_number=self.file_.header["run"], + detector_prog_start=mc_run_head["detector_prog_start"], + detector_prog_id=mc_run_head["detector_prog_id"], corsika_version=mc_run_head["shower_prog_vers"], simtel_version=mc_run_head["detector_prog_vers"], energy_range_min=mc_run_head["E_range"][0] * u.TeV, @@ -1024,8 +1031,6 @@ def _parse_simulation_header(self): spectral_index=mc_run_head["spectral_index"], shower_prog_start=mc_run_head["shower_prog_start"], shower_prog_id=mc_run_head["shower_prog_id"], - detector_prog_start=mc_run_head["detector_prog_start"], - detector_prog_id=mc_run_head["detector_prog_id"], n_showers=mc_run_head["n_showers"], shower_reuse=mc_run_head["n_use"], max_alt=_clip_altitude_if_close(mc_run_head["alt_range"][1]) * u.rad, @@ -1056,11 +1061,20 @@ def _fill_scheduling_and_observation_blocks(self): """ az, alt = self.file_.header["direction"] - obs_id = self.file_.header["run"] + + # this event source always contains only a single OB, so we can + # also assign a single obs_id + if self.override_obs_id is not None: + self.obs_id = self.override_obs_id + else: + self.obs_id = self.file_.header["run"] + + # simulations at the moment do not have SBs, use OB id + self.sb_id = self.obs_id sb_dict = { - obs_id: SchedulingBlockContainer( - sb_id=np.uint64(obs_id), # simulations have no SBs, use OB id + self.sb_id: SchedulingBlockContainer( + sb_id=np.uint64(self.sb_id), sb_type=SchedulingBlockType.OBSERVATION, producer_id="simulation", observing_mode=ObservingMode.UNKNOWN, @@ -1069,9 +1083,9 @@ def _fill_scheduling_and_observation_blocks(self): } ob_dict = { - obs_id: ObservationBlockContainer( - obs_id=np.uint64(obs_id), - sb_id=np.uint64(obs_id), # see comment above + self.obs_id: ObservationBlockContainer( + obs_id=np.uint64(self.obs_id), + sb_id=np.uint64(self.sb_id), producer_id="simulation", state=ObservationBlockState.COMPLETED_SUCCEDED, subarray_pointing_lat=alt * u.rad, diff --git a/ctapipe/io/tests/test_simteleventsource.py b/ctapipe/io/tests/test_simteleventsource.py index b4d3c0054ff..116a8a91f8a 100644 --- a/ctapipe/io/tests/test_simteleventsource.py +++ b/ctapipe/io/tests/test_simteleventsource.py @@ -604,3 +604,25 @@ def test_starting_grammage(): with SimTelEventSource(path, focal_length_choice="EQUIVALENT") as source: e = next(iter(source)) assert e.simulation.shower.starting_grammage == 580 * u.g / u.cm**2 + + +@pytest.mark.parametrize("override_obs_id,expected_obs_id", [(None, 1), (5, 5)]) +def test_override_obs_id(override_obs_id, expected_obs_id, prod5_gamma_simtel_path): + """Test for the override_obs_id option""" + original_run_number = 1 + + with SimTelEventSource( + prod5_gamma_simtel_path, override_obs_id=override_obs_id + ) as s: + assert s.obs_id == expected_obs_id + assert s.obs_ids == [expected_obs_id] + + assert s.simulation_config.keys() == {expected_obs_id} + assert s.observation_blocks.keys() == {expected_obs_id} + assert s.scheduling_blocks.keys() == {expected_obs_id} + + # this should alway be the original run number + assert s.simulation_config[s.obs_id].run_number == original_run_number + + for e in s: + assert e.index.obs_id == expected_obs_id diff --git a/docs/changes/2411.features.rst b/docs/changes/2411.features.rst new file mode 100644 index 00000000000..d81a88b977f --- /dev/null +++ b/docs/changes/2411.features.rst @@ -0,0 +1,3 @@ +Add option ``override_obs_id`` to ``SimTelEventSource`` which allows +assigning new, unique ``obs_ids`` in case productions re-use CORSIKA run +numbers. From 864ff3aca403aa36ef37a83258a62a3a89ee8827 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 20 Oct 2023 12:39:14 +0200 Subject: [PATCH 167/264] Add ctapipe-train-disp-reconstructor config to quickstart tool --- ctapipe/tools/quickstart.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ctapipe/tools/quickstart.py b/ctapipe/tools/quickstart.py index 317d5723ab2..5244ce482f9 100644 --- a/ctapipe/tools/quickstart.py +++ b/ctapipe/tools/quickstart.py @@ -17,6 +17,7 @@ "ml_preprocessing_config.yaml", "train_energy_regressor.yaml", "train_particle_classifier.yaml", + "train_disp_reconstructor.yaml", ] README_TEXT = f""" @@ -55,13 +56,14 @@ ctapipe-process --help-all ``` -## ctapipe-train-energy-regressor / ctapipe-train-particle-classifier configs +## ctapipe-train-energy-regressor / ctapipe-train-particle-classifier / ctapipe-train-disp-reconstructor configs Included here are also base configurations for training machine learning (ML) -models for energy regression and gamma/hadron separation. +models for energy regression, gamma/hadron separation and disp origin reconstruction. - `train_energy_regressor.yaml`: configuration of energy regression model - `train_particle_classifier.yaml`: configuration of particle classification model +- `train_disp_reconstructor.yaml`: configuration of disp reconstruction models This file was generated using ctapipe version {VERSION} From 4cfc82a87ccc8238abd4a3512187fd83574c43be Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 20 Oct 2023 12:51:31 +0200 Subject: [PATCH 168/264] Add changelog --- docs/changes/2414.bugfix.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/changes/2414.bugfix.rst diff --git a/docs/changes/2414.bugfix.rst b/docs/changes/2414.bugfix.rst new file mode 100644 index 00000000000..0e6c4243c33 --- /dev/null +++ b/docs/changes/2414.bugfix.rst @@ -0,0 +1,2 @@ +Add the example config for ctapipe-train-disp-reconstructor +to the list of configs generated by ctapipe-quickstart. From 81cd459c668eadeff67f41a6192e79168827c14a Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 20 Oct 2023 13:06:23 +0200 Subject: [PATCH 169/264] Add note about performance of provided ml configs --- ctapipe/tools/quickstart.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ctapipe/tools/quickstart.py b/ctapipe/tools/quickstart.py index 5244ce482f9..319ccf316c1 100644 --- a/ctapipe/tools/quickstart.py +++ b/ctapipe/tools/quickstart.py @@ -60,6 +60,8 @@ Included here are also base configurations for training machine learning (ML) models for energy regression, gamma/hadron separation and disp origin reconstruction. +NOTE: As these files are used for unit tests, they are optimized for very fast training +and will not result in well performing models. - `train_energy_regressor.yaml`: configuration of energy regression model - `train_particle_classifier.yaml`: configuration of particle classification model From 89f3ac039c3f345a6059295b02f37942e79f197b Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 23 Oct 2023 11:06:53 +0200 Subject: [PATCH 170/264] Do not use hidden attribute _models in apply tool --- ctapipe/tools/apply_models.py | 13 +++++++------ docs/changes/2418.bugfix.rst | 2 ++ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 docs/changes/2418.bugfix.rst diff --git a/ctapipe/tools/apply_models.py b/ctapipe/tools/apply_models.py index 0a6285dcbab..2df691d8bf4 100644 --- a/ctapipe/tools/apply_models.py +++ b/ctapipe/tools/apply_models.py @@ -177,7 +177,13 @@ def _apply(self, reconstructor, tel_tables, start, stop): for tel_id, table in tel_tables.items(): tel = self.loader.subarray.tel[tel_id] - if tel not in reconstructor._models: + if len(table) == 0: + self.log.info("No events for telescope %d", tel_id) + continue + + try: + predictions = reconstructor.predict_table(tel, table) + except KeyError: self.log.warning( "No model in %s for telescope type %s, skipping tel %d", reconstructor, @@ -186,11 +192,6 @@ def _apply(self, reconstructor, tel_tables, start, stop): ) continue - if len(table) == 0: - self.log.info("No events for telescope %d", tel_id) - continue - - predictions = reconstructor.predict_table(tel, table) for prop, prediction_table in predictions.items(): # copy/overwrite columns into full feature table new_columns = prediction_table.colnames diff --git a/docs/changes/2418.bugfix.rst b/docs/changes/2418.bugfix.rst new file mode 100644 index 00000000000..4a296236ae5 --- /dev/null +++ b/docs/changes/2418.bugfix.rst @@ -0,0 +1,2 @@ +Do not use the hidden attribute `SKLearnReconstructor._models` in +`ctapipe-apply-models`. From 0d2413ca2be7183ff301a78dfdda5ac17f0b4dc3 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 23 Oct 2023 11:37:35 +0200 Subject: [PATCH 171/264] Fix changelog entry --- docs/changes/2418.bugfix.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/changes/2418.bugfix.rst b/docs/changes/2418.bugfix.rst index 4a296236ae5..bd28442a7da 100644 --- a/docs/changes/2418.bugfix.rst +++ b/docs/changes/2418.bugfix.rst @@ -1,2 +1 @@ -Do not use the hidden attribute `SKLearnReconstructor._models` in -`ctapipe-apply-models`. +Do not use a hidden attribute of `SKLearnReconstructor` in `ctapipe-apply-models`. From 92cba524a77cfeca4ef1ff9221e086fb9e657095 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 23 Oct 2023 11:51:45 +0200 Subject: [PATCH 172/264] Use double backticks in changelog --- docs/changes/2418.bugfix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/2418.bugfix.rst b/docs/changes/2418.bugfix.rst index bd28442a7da..5af5d6d3661 100644 --- a/docs/changes/2418.bugfix.rst +++ b/docs/changes/2418.bugfix.rst @@ -1 +1 @@ -Do not use a hidden attribute of `SKLearnReconstructor` in `ctapipe-apply-models`. +Do not use a hidden attribute of ``SKLearnReconstructor`` in ``ctapipe-apply-models``. From ce28ea28ec6c3cfaf310972230e72581264eda63 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 20 Sep 2023 14:58:49 +0200 Subject: [PATCH 173/264] make definition of h_max consistent --- ctapipe/reco/hillas_intersection.py | 40 +++++++++++++--------------- ctapipe/reco/hillas_reconstructor.py | 32 +++++++++++++++------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index d7288b58576..d0d20b9ef7c 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -260,16 +260,20 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): sky_pos = nom.transform_to(array_pointing.frame) tilt = SkyCoord(x=core_x * u.m, y=core_y * u.m, z=0 * u.m, frame=tilted_frame) grd = project_to_ground(tilt) - x_max = self.reconstruct_xmax( - nom.fov_lon, - nom.fov_lat, - tilt.x, - tilt.y, - hillas_dict_mod, - tel_x, - tel_y, - 90 * u.deg - array_pointing.alt, - ) + + if self.subarray.reference_location: + h_max = self.reconstruct_h_max( + nom.fov_lon, + nom.fov_lat, + tilt.x, + tilt.y, + hillas_dict_mod, + tel_x, + tel_y, + 90 * u.deg - array_pointing.alt, + ) + else: + h_max = u.Quantity(np.nan, u.m) src_error = np.sqrt(err_fov_lon**2 + err_fov_lat**2) @@ -287,8 +291,8 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): is_valid=True, alt_uncert=src_error.to(u.rad), az_uncert=src_error.to(u.rad), - h_max=x_max, - h_max_uncert=u.Quantity(np.nan * x_max.unit), + h_max=h_max, + h_max_uncert=u.Quantity(np.nan * h_max.unit), goodness_of_fit=np.nan, prefix=self.__class__.__name__, ) @@ -437,7 +441,7 @@ def reconstruct_tilted(self, hillas_parameters, tel_x, tel_y): return x_pos, y_pos, np.sqrt(var_x), np.sqrt(var_y) - def reconstruct_xmax( + def reconstruct_h_max( self, source_x, source_y, core_x, core_y, hillas_parameters, tel_x, tel_y, zen ): """ @@ -502,18 +506,12 @@ def reconstruct_xmax( mean_height *= np.cos(zen) # Add on the height of the detector above sea level - mean_height += 2100 # TODO: replace with instrument info + mean_height += self.subarray.reference_location.geodetic.height.to_value(u.m) if mean_height > 100000 or np.isnan(mean_height): mean_height = 100000 - mean_height *= u.m - # Lookup this height in the depth tables, the convert Hmax to Xmax - # x_max = self.thickness_profile(mean_height.to(u.km)) - # Convert to slant depth - # x_max /= np.cos(zen) - - return mean_height + return u.Quantity(mean_height, u.m) @staticmethod def intersect_lines(xp1, yp1, phi1, xp2, yp2, phi2): diff --git a/ctapipe/reco/hillas_reconstructor.py b/ctapipe/reco/hillas_reconstructor.py index 1fbd305d7c2..ad45809e56b 100644 --- a/ctapipe/reco/hillas_reconstructor.py +++ b/ctapipe/reco/hillas_reconstructor.py @@ -19,6 +19,7 @@ altaz_to_righthanded_cartesian, project_to_ground, ) +from ..instrument import SubarrayDescription from .reconstructor import ( HillasGeometryReconstructor, InvalidWidthException, @@ -106,7 +107,7 @@ class that reconstructs the direction of an atmospheric shower """ - def __init__(self, subarray, **kwargs): + def __init__(self, subarray: SubarrayDescription, **kwargs): super().__init__(subarray=subarray, **kwargs) _cam_radius_m = { cam: cam.geometry.guess_radius().to_value(u.m) @@ -181,7 +182,15 @@ def __call__(self, event): _, lat, lon = cartesian_to_spherical(*direction) # estimate max height of shower - h_max = self.estimate_h_max(cog_cartesian, telescope_positions) + if self.subarray.reference_location: + h_max = ( + HillasReconstructor.estimate_relative_h_max( + cog_cartesian, telescope_positions + ) + + self.subarray.reference_location.geodetic.height + ) + else: + h_max = u.Quantity(np.nan, u.m) # az is clockwise, lon counter-clockwise, make sure it stays in [0, 2pi) az = Longitude(-lon) @@ -411,19 +420,22 @@ def estimate_core_position(array_pointing, psi, positions): return core_pos_ground, core_pos_tilted - @staticmethod - def estimate_h_max(cog_vectors, positions): - """ - Estimate the max height by intersecting the lines of the cog directions of each telescope. + def estimate_relative_h_max(cog_vectors, positions): + """Estimate the relative (to the observatory) vertical height of + shower-max by intersecting the lines of the cog directions of each + telescope. Returns ------- astropy.unit.Quantity - the estimated max height + the estimated height above observatory level (not sea level) of the + shower-max point + """ positions = positions.cartesian.xyz.T.to_value(u.m) - # not sure if its better to return the length of the vector of the z component - return u.Quantity( - np.linalg.norm(line_line_intersection_3d(cog_vectors, positions)), + shower_max = u.Quantity( + line_line_intersection_3d(cog_vectors, positions), u.m, ) + + return shower_max[2] # the z-coordinate only From d292adc1995c58580b61603a69208b4495957177 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Wed, 20 Sep 2023 14:59:04 +0200 Subject: [PATCH 174/264] get tests to run --- ctapipe/conftest.py | 4 ++-- ctapipe/reco/tests/test_HillasReconstructor.py | 12 +++--------- ctapipe/reco/tests/test_hillas_intersection.py | 2 +- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/ctapipe/conftest.py b/ctapipe/conftest.py index e40abb42d72..f4f57e4dad7 100644 --- a/ctapipe/conftest.py +++ b/ctapipe/conftest.py @@ -79,11 +79,11 @@ def subarray_prod3_paranal(): @pytest.fixture(scope="session") -def example_subarray(subarray_prod3_paranal): +def example_subarray(subarray_prod5_paranal): """ Subarray corresponding to the example event """ - return subarray_prod3_paranal + return subarray_prod5_paranal @pytest.fixture(scope="function") diff --git a/ctapipe/reco/tests/test_HillasReconstructor.py b/ctapipe/reco/tests/test_HillasReconstructor.py index 9fe7c57d4de..fd8ca438495 100644 --- a/ctapipe/reco/tests/test_HillasReconstructor.py +++ b/ctapipe/reco/tests/test_HillasReconstructor.py @@ -44,12 +44,9 @@ def test_h_max_results(): ) cog_cart = altaz_to_righthanded_cartesian(cog_alt, cog_az) - - # creating the fit class and setting the the great circle member - - # performing the direction fit with the minimisation algorithm - # and a seed that is perpendicular to the up direction - h_max_reco = HillasReconstructor.estimate_h_max(cog_cart, positions) + h_max_reco = HillasReconstructor.estimate_relative_h_max( + cog_vectors=cog_cart, positions=positions + ) # the results should be close to the direction straight up assert u.isclose(h_max_reco, 1 * u.km) @@ -210,7 +207,6 @@ def test_reconstruction_against_simulation_camera_frame( ], ) def test_CameraFrame_against_TelescopeFrame(filename): - input_file = get_dataset_path(filename) # "gamma_divergent_LaPalma_baseline_20Zd_180Az_prod3_test.simtel.gz" # ) @@ -243,7 +239,6 @@ def test_CameraFrame_against_TelescopeFrame(filename): reconstructed_events = 0 for event_telescope_frame in source: - calib(event_telescope_frame) # make a copy of the calibrated event for the camera frame case # later we clean and paramretrize the 2 events in the same way @@ -281,7 +276,6 @@ def test_CameraFrame_against_TelescopeFrame(filename): elif isinstance(cam, list): assert cam == tel else: - if cam == 0 or tel == 0: kwargs["atol"] = 1e-6 assert np.isclose(cam, tel, **kwargs) diff --git a/ctapipe/reco/tests/test_hillas_intersection.py b/ctapipe/reco/tests/test_hillas_intersection.py index 94492aba3d6..d9f2f3318ea 100644 --- a/ctapipe/reco/tests/test_hillas_intersection.py +++ b/ctapipe/reco/tests/test_hillas_intersection.py @@ -83,7 +83,7 @@ def test_intersection_xmax_reco(example_subarray): ), } - x_max = hill_inter.reconstruct_xmax( + x_max = hill_inter.reconstruct_h_max( source_x=nom_pos_reco.fov_lon, source_y=nom_pos_reco.fov_lat, core_x=0 * u.m, From 258a98f2465a3b331c76af8a45a59b3652b66588 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 21 Sep 2023 16:42:34 +0200 Subject: [PATCH 175/264] revert change to conftest for now --- ctapipe/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctapipe/conftest.py b/ctapipe/conftest.py index f4f57e4dad7..e40abb42d72 100644 --- a/ctapipe/conftest.py +++ b/ctapipe/conftest.py @@ -79,11 +79,11 @@ def subarray_prod3_paranal(): @pytest.fixture(scope="session") -def example_subarray(subarray_prod5_paranal): +def example_subarray(subarray_prod3_paranal): """ Subarray corresponding to the example event """ - return subarray_prod5_paranal + return subarray_prod3_paranal @pytest.fixture(scope="function") From 5d742bece5a7db5685b90a91dd299c4a155e9634 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 21 Sep 2023 16:47:01 +0200 Subject: [PATCH 176/264] deal with case where there is no reference_location Will be fixed in another PR (should always have at least the observatory height) --- ctapipe/reco/hillas_intersection.py | 18 +++++++++++++----- ctapipe/reco/hillas_reconstructor.py | 2 +- ctapipe/reco/tests/test_hillas_intersection.py | 9 +++++---- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index d0d20b9ef7c..f834ad85214 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -261,7 +261,7 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): tilt = SkyCoord(x=core_x * u.m, y=core_y * u.m, z=0 * u.m, frame=tilted_frame) grd = project_to_ground(tilt) - if self.subarray.reference_location: + if self.subarray.reference_location is not None: h_max = self.reconstruct_h_max( nom.fov_lon, nom.fov_lat, @@ -499,17 +499,25 @@ def reconstruct_h_max( np.array(ty), ) weight = np.array(amp) - mean_height = np.sum(height * weight) / np.sum(weight) + mean_distance = np.sum(height * weight) / np.sum(weight) # This value is height above telescope in the tilted system, # we should convert to height above ground - mean_height *= np.cos(zen) + mean_height = mean_distance * np.cos(zen.to_value(u.rad)) # Add on the height of the detector above sea level - mean_height += self.subarray.reference_location.geodetic.height.to_value(u.m) + if self.subarray.reference_location is not None: + mean_height += self.subarray.reference_location.geodetic.height.to_value( + u.m + ) + else: + # FIXME: Can remoev this check once we ensure the reference_location is always loaded + warnings.warn( + "Computing h_max with no reference location. Height will be wrong." + ) if mean_height > 100000 or np.isnan(mean_height): - mean_height = 100000 + mean_height = np.nan return u.Quantity(mean_height, u.m) diff --git a/ctapipe/reco/hillas_reconstructor.py b/ctapipe/reco/hillas_reconstructor.py index ad45809e56b..6bbea1da7e5 100644 --- a/ctapipe/reco/hillas_reconstructor.py +++ b/ctapipe/reco/hillas_reconstructor.py @@ -182,7 +182,7 @@ def __call__(self, event): _, lat, lon = cartesian_to_spherical(*direction) # estimate max height of shower - if self.subarray.reference_location: + if self.subarray.reference_location is not None: h_max = ( HillasReconstructor.estimate_relative_h_max( cog_cartesian, telescope_positions diff --git a/ctapipe/reco/tests/test_hillas_intersection.py b/ctapipe/reco/tests/test_hillas_intersection.py index d9f2f3318ea..924699b74ed 100644 --- a/ctapipe/reco/tests/test_hillas_intersection.py +++ b/ctapipe/reco/tests/test_hillas_intersection.py @@ -30,8 +30,8 @@ def test_intersect(): def test_parallel(): """ - Simple test to check the intersection of lines. Try to intersect positions at (0,0) and (0,1) - with angles parallel and check the behaviour + ? Simple test to check the intersection of lines. Try to intersect positions at (0,0) and (0,1) + with angles parallel and check the behaviour """ x1 = 0 y1 = 0 @@ -83,7 +83,7 @@ def test_intersection_xmax_reco(example_subarray): ), } - x_max = hill_inter.reconstruct_h_max( + h_max = hill_inter.reconstruct_h_max( source_x=nom_pos_reco.fov_lon, source_y=nom_pos_reco.fov_lat, core_x=0 * u.m, @@ -93,7 +93,8 @@ def test_intersection_xmax_reco(example_subarray): tel_y={1: (0 * u.m), 2: (150 * u.m)}, zen=zen_pointing, ) - print(x_max) + + assert h_max > 0 * u.m def test_intersection_reco_impact_point_tilted(example_subarray): From b26add845411fe576b86bbd6b9fa685857ced891 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 28 Sep 2023 13:01:04 +0200 Subject: [PATCH 177/264] removed checks for reference_location (not needed) --- ctapipe/reco/hillas_intersection.py | 10 +--------- ctapipe/reco/hillas_reconstructor.py | 14 +++++--------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index f834ad85214..2a4bfe49c9a 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -506,15 +506,7 @@ def reconstruct_h_max( mean_height = mean_distance * np.cos(zen.to_value(u.rad)) # Add on the height of the detector above sea level - if self.subarray.reference_location is not None: - mean_height += self.subarray.reference_location.geodetic.height.to_value( - u.m - ) - else: - # FIXME: Can remoev this check once we ensure the reference_location is always loaded - warnings.warn( - "Computing h_max with no reference location. Height will be wrong." - ) + mean_height += self.subarray.reference_location.geodetic.height.to_value(u.m) if mean_height > 100000 or np.isnan(mean_height): mean_height = np.nan diff --git a/ctapipe/reco/hillas_reconstructor.py b/ctapipe/reco/hillas_reconstructor.py index 6bbea1da7e5..b4b7cd3fdf5 100644 --- a/ctapipe/reco/hillas_reconstructor.py +++ b/ctapipe/reco/hillas_reconstructor.py @@ -182,15 +182,10 @@ def __call__(self, event): _, lat, lon = cartesian_to_spherical(*direction) # estimate max height of shower - if self.subarray.reference_location is not None: - h_max = ( - HillasReconstructor.estimate_relative_h_max( - cog_cartesian, telescope_positions - ) - + self.subarray.reference_location.geodetic.height - ) - else: - h_max = u.Quantity(np.nan, u.m) + h_max = ( + self.estimate_relative_h_max(cog_cartesian, telescope_positions) + + self.subarray.reference_location.geodetic.height + ) # az is clockwise, lon counter-clockwise, make sure it stays in [0, 2pi) az = Longitude(-lon) @@ -420,6 +415,7 @@ def estimate_core_position(array_pointing, psi, positions): return core_pos_ground, core_pos_tilted + @staticmethod def estimate_relative_h_max(cog_vectors, positions): """Estimate the relative (to the observatory) vertical height of shower-max by intersecting the lines of the cog directions of each From 64426e4ace83ddf0178e0bab1e406687418d455a Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 28 Sep 2023 13:12:05 +0200 Subject: [PATCH 178/264] added initial changelog --- docs/changes/2403.bugfix.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 docs/changes/2403.bugfix.rst diff --git a/docs/changes/2403.bugfix.rst b/docs/changes/2403.bugfix.rst new file mode 100644 index 00000000000..611abd143ab --- /dev/null +++ b/docs/changes/2403.bugfix.rst @@ -0,0 +1,14 @@ +Fixed the definition of ``h_max``, which was both inconsistent between +`ctapipe.reco.HillasReconstructor` and `ctapipe.reco.HillasIntersection` +implementations, and was also incorrect since it was measured from the +observatory elevation rather than from sea level. + +The value of ``h_max`` is now defined as the height above sea level of the +shower-max point (in meters), not the distance to that point. Therefore it is +not corrected for the zenith angle of the shower. This is consistent with the +options currently used for *CORSIKA*, where the *SLANT* option is set to false, +meaning heights are actual heights not distances from the impact point, and +``x_max`` is a *depth*, not a *slant depth*. Note that this definition may be +inconsistent with other observatories where slant-depths are used, and also note +that the slant depth or distance to shower max are the more useful quantities +for shower physics. From 755eeed695213a5d9c8797e2aa816ebca9a709a9 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 28 Sep 2023 14:57:21 +0200 Subject: [PATCH 179/264] remove one more redundant check for reference loc --- ctapipe/reco/hillas_intersection.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index 2a4bfe49c9a..2d6d28f172b 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -261,19 +261,16 @@ def _predict(self, hillas_dict, array_pointing, telescopes_pointings=None): tilt = SkyCoord(x=core_x * u.m, y=core_y * u.m, z=0 * u.m, frame=tilted_frame) grd = project_to_ground(tilt) - if self.subarray.reference_location is not None: - h_max = self.reconstruct_h_max( - nom.fov_lon, - nom.fov_lat, - tilt.x, - tilt.y, - hillas_dict_mod, - tel_x, - tel_y, - 90 * u.deg - array_pointing.alt, - ) - else: - h_max = u.Quantity(np.nan, u.m) + h_max = self.reconstruct_h_max( + nom.fov_lon, + nom.fov_lat, + tilt.x, + tilt.y, + hillas_dict_mod, + tel_x, + tel_y, + 90 * u.deg - array_pointing.alt, + ) src_error = np.sqrt(err_fov_lon**2 + err_fov_lat**2) From 604fe728a715a05171594beefdf81b8fc7d5ccef Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Thu, 28 Sep 2023 14:57:48 +0200 Subject: [PATCH 180/264] fix bug where return value was incorrect Returning None here would cause an exception, since the values are unpacked into a 4-tuple --- ctapipe/reco/hillas_intersection.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index 2d6d28f172b..b07afe42947 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -310,7 +310,7 @@ def reconstruct_nominal(self, hillas_parameters): """ if len(hillas_parameters) < 2: - return None # Throw away events with < 2 images + return (np.nan, np.nan, np.nan, np.nan) # Throw away events with < 2 images # Find all pairs of Hillas parameters combos = itertools.combinations(list(hillas_parameters.values()), 2) @@ -382,7 +382,8 @@ def reconstruct_tilted(self, hillas_parameters, tel_x, tel_y): core uncertainty X """ if len(hillas_parameters) < 2: - return None # Throw away events with < 2 images + return (np.nan, np.nan, np.nan, np.nan) # Throw away events with < 2 images + hill_list = list() tx = list() ty = list() From 9675cc6e96771b6bd4a4c0092fe287bdc81fa45e Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Fri, 29 Sep 2023 15:39:40 +0200 Subject: [PATCH 181/264] better description of h_max --- ctapipe/containers.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index cb4282c5d4c..57b3c678ad5 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -920,8 +920,13 @@ class ReconstructedGeometryContainer(Container): "reconstructed core position uncertainty along tilted frame Y axis", unit=u.m, ) - h_max = Field(nan * u.m, "reconstructed height of the shower maximum", unit=u.m) + h_max = Field( + nan * u.m, + "reconstructed vertical height (above sea level) of the shower maximum", + unit=u.m, + ) h_max_uncert = Field(nan * u.m, "uncertainty of h_max", unit=u.m) + is_valid = Field( False, ( From c2bef1b48bfbb43340894a618032cd02c74ab2ce Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Fri, 29 Sep 2023 15:40:03 +0200 Subject: [PATCH 182/264] fix doctring format --- ctapipe/reco/hillas_reconstructor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/reco/hillas_reconstructor.py b/ctapipe/reco/hillas_reconstructor.py index b4b7cd3fdf5..0f82e2bc51d 100644 --- a/ctapipe/reco/hillas_reconstructor.py +++ b/ctapipe/reco/hillas_reconstructor.py @@ -423,7 +423,7 @@ def estimate_relative_h_max(cog_vectors, positions): Returns ------- - astropy.unit.Quantity + astropy.unit.Quantity: the estimated height above observatory level (not sea level) of the shower-max point From 3c9bd5be6f6aa940a82c4c169069152875389298 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Fri, 29 Sep 2023 15:40:18 +0200 Subject: [PATCH 183/264] use relative references in changelog --- docs/changes/2403.bugfix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/2403.bugfix.rst b/docs/changes/2403.bugfix.rst index 611abd143ab..042b14c59bd 100644 --- a/docs/changes/2403.bugfix.rst +++ b/docs/changes/2403.bugfix.rst @@ -1,5 +1,5 @@ Fixed the definition of ``h_max``, which was both inconsistent between -`ctapipe.reco.HillasReconstructor` and `ctapipe.reco.HillasIntersection` +`~ctapipe.reco.HillasReconstructor` and `~ctapipe.reco.HillasIntersection` implementations, and was also incorrect since it was measured from the observatory elevation rather than from sea level. From 72505520d585f96c71083e7a64b5e72fd8ab9fc7 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Tue, 3 Oct 2023 11:05:30 +0200 Subject: [PATCH 184/264] fixed phrasing --- ctapipe/containers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctapipe/containers.py b/ctapipe/containers.py index 57b3c678ad5..511be059a0d 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -922,7 +922,7 @@ class ReconstructedGeometryContainer(Container): ) h_max = Field( nan * u.m, - "reconstructed vertical height (above sea level) of the shower maximum", + "reconstructed vertical height above sea level of the shower maximum", unit=u.m, ) h_max_uncert = Field(nan * u.m, "uncertainty of h_max", unit=u.m) @@ -930,7 +930,7 @@ class ReconstructedGeometryContainer(Container): is_valid = Field( False, ( - "direction validity flag. True if the shower direction" + "Geometry validity flag. True if the shower geometry" "was properly reconstructed by the algorithm" ), ) From ad401fc5743e1606f4dceb30a90b946986273fb4 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Mon, 23 Oct 2023 14:31:31 +0200 Subject: [PATCH 185/264] define magic number --- ctapipe/reco/hillas_intersection.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index b07afe42947..0529dc7d3d9 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -44,6 +44,7 @@ ) FOV_ANGULAR_DISTANCE_LIMIT_RAD = (45 * u.deg).to_value(u.rad) +H_MAX_UPPER_LIMIT_M = 100_000 def _far_outside_fov(fov_lat, fov_lon): @@ -506,7 +507,7 @@ def reconstruct_h_max( # Add on the height of the detector above sea level mean_height += self.subarray.reference_location.geodetic.height.to_value(u.m) - if mean_height > 100000 or np.isnan(mean_height): + if mean_height > H_MAX_UPPER_LIMIT_M: mean_height = np.nan return u.Quantity(mean_height, u.m) From 9a1494ff2bc8c2262115344d19dbf67317068b98 Mon Sep 17 00:00:00 2001 From: Karl Kosack Date: Mon, 23 Oct 2023 14:31:46 +0200 Subject: [PATCH 186/264] use np.average --- ctapipe/reco/hillas_intersection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/reco/hillas_intersection.py b/ctapipe/reco/hillas_intersection.py index 0529dc7d3d9..0906cf0ff4b 100644 --- a/ctapipe/reco/hillas_intersection.py +++ b/ctapipe/reco/hillas_intersection.py @@ -498,7 +498,7 @@ def reconstruct_h_max( np.array(ty), ) weight = np.array(amp) - mean_distance = np.sum(height * weight) / np.sum(weight) + mean_distance = np.average(height, weights=weight) # This value is height above telescope in the tilted system, # we should convert to height above ground From 3b9113c2b30e9e91db72e2b13d6508adb27c97b9 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 24 Oct 2023 16:11:00 +0200 Subject: [PATCH 187/264] Add docstring for ctapipe-train-disp-reconstructor --- ctapipe/tools/train_disp_reconstructor.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 5953bda8038..e4faa6b62c4 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -1,3 +1,6 @@ +""" +Tool for training the DispReconstructor +""" import astropy.units as u import numpy as np From b1a726492b3a53a546867c276844cd92468bed02 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 24 Oct 2023 16:16:50 +0200 Subject: [PATCH 188/264] Add changelog --- docs/changes/2420.bugfix.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/2420.bugfix.rst diff --git a/docs/changes/2420.bugfix.rst b/docs/changes/2420.bugfix.rst new file mode 100644 index 00000000000..aa21eafa4fb --- /dev/null +++ b/docs/changes/2420.bugfix.rst @@ -0,0 +1 @@ +Add docstring for ``ctapipe-train-disp-reconstructor``. From 81b14310f1d15764ce2ecd17d7e426a691132ed5 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 10 Oct 2023 18:01:44 +0200 Subject: [PATCH 189/264] Fix broken urls in README --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index b477415b5fe..dc241c4939e 100644 --- a/README.rst +++ b/README.rst @@ -71,11 +71,11 @@ or via:: pip install ctapipe -**Note**: to install a specific version of ctapipe take look at the documentation `here `__. +**Note**: to install a specific version of ctapipe take look at the documentation `here `__. **Note**: ``mamba`` is a C++ reimplementation of conda and can be found `here `__. Note this is *pre-alpha* software and is not yet stable enough for end-users (expect large API changes until the first stable 1.0 release). Developers should follow the development install instructions found in the -`documentation `__. +`documentation `__. From 38d38d89c0194a45f23686ed3ca06bcb87218cc4 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 25 Oct 2023 10:11:40 +0200 Subject: [PATCH 190/264] Fix navigation_with_keys warning Set navigation_with_keys to False to get rid of the warning. Setting it to True has negative accessibility implications: https://github.com/pydata/pydata-sphinx-theme/issues/1492 --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index 5ae2d8c7170..b91f6f0bfec 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -290,6 +290,7 @@ def setup(app): "version_match": version_match, "json_url": json_url, }, + "navigation_with_keys": False, "use_edit_page_button": True, "icon_links_label": "Quick Links", "icon_links": [ From eba9cf9bbaf428440521bc16eb6f0b8ec59321ec Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 26 Oct 2023 15:16:26 +0200 Subject: [PATCH 191/264] Check if tel_id exists when looking up TelescopeParameters Fixes #2233. --- ctapipe/core/telescope_component.py | 4 +++- ctapipe/core/tests/test_telescope_component.py | 13 +++++++++++++ docs/changes/2429.feature.rst | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 docs/changes/2429.feature.rst diff --git a/ctapipe/core/telescope_component.py b/ctapipe/core/telescope_component.py index 2bac22e615e..6b49dae9227 100644 --- a/ctapipe/core/telescope_component.py +++ b/ctapipe/core/telescope_component.py @@ -217,8 +217,10 @@ def __getitem__(self, tel: Optional[Union[int, str]]): try: return self._value_for_tel_id[tel] except KeyError: + if tel not in self._subarray.tel: + raise KeyError(f"No telescope with id {tel} in subarray") raise KeyError( - f"TelescopeParameterLookup: no " + "TelescopeParameterLookup: no " f"parameter value was set for telescope with tel_id=" f"{tel}. Please set it explicitly, " f"or by telescope type or '*'." diff --git a/ctapipe/core/tests/test_telescope_component.py b/ctapipe/core/tests/test_telescope_component.py index 7aae1de47f9..e7f389953c2 100644 --- a/ctapipe/core/tests/test_telescope_component.py +++ b/ctapipe/core/tests/test_telescope_component.py @@ -342,3 +342,16 @@ class Foo(TelescopeComponent): f = Foo(mock_subarray, bar=[("type", "*", 1), ("id", 1, None)]) assert f.bar.tel[1] is None + + +def test_telescope_parameter_nonexistent_telescope(mock_subarray): + class Foo(TelescopeComponent): + bar = IntTelescopeParameter( + default_value=None, + allow_none=True, + ).tag(config=True) + + foo = Foo(subarray=mock_subarray) + + with pytest.raises(KeyError, match="No telescope with id 0"): + foo.bar.tel[0] diff --git a/docs/changes/2429.feature.rst b/docs/changes/2429.feature.rst new file mode 100644 index 00000000000..6dc4cec824d --- /dev/null +++ b/docs/changes/2429.feature.rst @@ -0,0 +1,3 @@ +In case no configuration is found for a telescope in ``TelescopeParameter``, +it is now checked whether the telescope exists at all to provide a better +error message. From eb54c6eaf9b6e706e3a58e7b4ccd797265f2f87a Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Thu, 26 Oct 2023 17:07:37 +0200 Subject: [PATCH 192/264] Check pointing coordinate frame in DispReconstructor --- ctapipe/reco/sklearn.py | 29 +++++++++++++++++++++++++---- docs/changes/2431.bugfix.rst | 2 ++ 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 docs/changes/2431.bugfix.rst diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 976ecb6079e..320ea5d579e 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -9,7 +9,7 @@ import astropy.units as u import joblib import numpy as np -from astropy.coordinates import AltAz +from astropy.coordinates import AltAz, SkyCoord from astropy.table import QTable, Table, vstack from astropy.utils.decorators import lazyproperty from sklearn.metrics import accuracy_score, r2_score, roc_auc_score @@ -777,13 +777,34 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table fov_lon = table["hillas_fov_lon"].quantity + disp * np.cos(psi) fov_lat = table["hillas_fov_lat"].quantity + disp * np.sin(psi) - # FIXME: Assume constant and parallel pointing for each run self.log.warning("Assuming constant and parallel pointing for each run") + if np.all(table["subarray_pointing_frame"] == 0): + pointing_alt = table["subarray_pointing_lat"] + pointing_az = table["subarray_pointing_lon"] + elif np.all(table["subarray_pointing_frame"] == 1): + pointing_altaz = SkyCoord( + ra=table["subarray_pointing_lon"], + dec=table["subarray_pointing_lat"], + frame="icrs", + ).transform_to(AltAz()) + pointing_alt = pointing_altaz.alt + pointing_az = pointing_altaz.az + elif np.all(table["subarray_pointing_frame"] == 2): + pointing_altaz = SkyCoord( + l=table["subarray_pointing_lon"], + b=table["subarray_pointing_lat"], + frame="galactic", + ).transform_to(AltAz()) + pointing_alt = pointing_altaz.alt + pointing_az = pointing_altaz.az + else: + raise KeyError("Unknown observation coordinate frame") + alt, az = telescope_to_horizontal( lon=fov_lon, lat=fov_lat, - pointing_alt=table["subarray_pointing_lat"], - pointing_az=table["subarray_pointing_lon"], + pointing_alt=pointing_alt, + pointing_az=pointing_az, ) altaz_result = Table( diff --git a/docs/changes/2431.bugfix.rst b/docs/changes/2431.bugfix.rst new file mode 100644 index 00000000000..92920becde9 --- /dev/null +++ b/docs/changes/2431.bugfix.rst @@ -0,0 +1,2 @@ +Check the coordinate frame in which the array pointing is given +before using it in ``DispReconstructor``. From 105c5021224fe965d2d6e7ee4f18d7a1e60c116e Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Thu, 26 Oct 2023 17:35:03 +0200 Subject: [PATCH 193/264] Use CoordinateFrameType enum --- ctapipe/reco/sklearn.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 320ea5d579e..70566de6020 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -22,6 +22,7 @@ from ..containers import ( ArrayEventContainer, + CoordinateFrameType, DispContainer, ParticleClassificationContainer, ReconstructedEnergyContainer, @@ -778,10 +779,10 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table fov_lat = table["hillas_fov_lat"].quantity + disp * np.sin(psi) self.log.warning("Assuming constant and parallel pointing for each run") - if np.all(table["subarray_pointing_frame"] == 0): + if np.all(table["subarray_pointing_frame"] is CoordinateFrameType.ALTAZ): pointing_alt = table["subarray_pointing_lat"] pointing_az = table["subarray_pointing_lon"] - elif np.all(table["subarray_pointing_frame"] == 1): + elif np.all(table["subarray_pointing_frame"] is CoordinateFrameType.ICRS): pointing_altaz = SkyCoord( ra=table["subarray_pointing_lon"], dec=table["subarray_pointing_lat"], @@ -789,7 +790,7 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table ).transform_to(AltAz()) pointing_alt = pointing_altaz.alt pointing_az = pointing_altaz.az - elif np.all(table["subarray_pointing_frame"] == 2): + elif np.all(table["subarray_pointing_frame"] is CoordinateFrameType.GALACTIC): pointing_altaz = SkyCoord( l=table["subarray_pointing_lon"], b=table["subarray_pointing_lat"], From b868cbdfeebe6d5b20440c55acc6fe1e61027ba7 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Thu, 26 Oct 2023 17:50:27 +0200 Subject: [PATCH 194/264] Change warning message --- ctapipe/reco/sklearn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 70566de6020..dc43fab87aa 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -778,7 +778,7 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table fov_lon = table["hillas_fov_lon"].quantity + disp * np.cos(psi) fov_lat = table["hillas_fov_lat"].quantity + disp * np.sin(psi) - self.log.warning("Assuming constant and parallel pointing for each run") + self.log.warning("FIXME: Assuming constant and parallel pointing for each run") if np.all(table["subarray_pointing_frame"] is CoordinateFrameType.ALTAZ): pointing_alt = table["subarray_pointing_lat"] pointing_az = table["subarray_pointing_lon"] From c83a9c68c3e55faf9b439dcf8700e55082d60992 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 27 Oct 2023 14:58:26 +0200 Subject: [PATCH 195/264] Just raise and error if training data not in altaz --- ctapipe/reco/sklearn.py | 32 ++++------------------- ctapipe/tools/train_disp_reconstructor.py | 8 ++++++ docs/changes/2431.bugfix.rst | 4 +-- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index dc43fab87aa..976ecb6079e 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -9,7 +9,7 @@ import astropy.units as u import joblib import numpy as np -from astropy.coordinates import AltAz, SkyCoord +from astropy.coordinates import AltAz from astropy.table import QTable, Table, vstack from astropy.utils.decorators import lazyproperty from sklearn.metrics import accuracy_score, r2_score, roc_auc_score @@ -22,7 +22,6 @@ from ..containers import ( ArrayEventContainer, - CoordinateFrameType, DispContainer, ParticleClassificationContainer, ReconstructedEnergyContainer, @@ -778,34 +777,13 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table fov_lon = table["hillas_fov_lon"].quantity + disp * np.cos(psi) fov_lat = table["hillas_fov_lat"].quantity + disp * np.sin(psi) - self.log.warning("FIXME: Assuming constant and parallel pointing for each run") - if np.all(table["subarray_pointing_frame"] is CoordinateFrameType.ALTAZ): - pointing_alt = table["subarray_pointing_lat"] - pointing_az = table["subarray_pointing_lon"] - elif np.all(table["subarray_pointing_frame"] is CoordinateFrameType.ICRS): - pointing_altaz = SkyCoord( - ra=table["subarray_pointing_lon"], - dec=table["subarray_pointing_lat"], - frame="icrs", - ).transform_to(AltAz()) - pointing_alt = pointing_altaz.alt - pointing_az = pointing_altaz.az - elif np.all(table["subarray_pointing_frame"] is CoordinateFrameType.GALACTIC): - pointing_altaz = SkyCoord( - l=table["subarray_pointing_lon"], - b=table["subarray_pointing_lat"], - frame="galactic", - ).transform_to(AltAz()) - pointing_alt = pointing_altaz.alt - pointing_az = pointing_altaz.az - else: - raise KeyError("Unknown observation coordinate frame") - + # FIXME: Assume constant and parallel pointing for each run + self.log.warning("Assuming constant and parallel pointing for each run") alt, az = telescope_to_horizontal( lon=fov_lon, lat=fov_lat, - pointing_alt=pointing_alt, - pointing_az=pointing_az, + pointing_alt=table["subarray_pointing_lat"], + pointing_az=table["subarray_pointing_lon"], ) altaz_result = Table( diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 5953bda8038..67741e0e4e2 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -1,6 +1,7 @@ import astropy.units as u import numpy as np +from ctapipe.containers import CoordinateFrameType from ctapipe.core import Tool from ctapipe.core.traits import Bool, Int, IntTelescopeParameter, Path from ctapipe.exceptions import TooFewEvents @@ -104,6 +105,13 @@ def start(self): self.log.info("Loading events for %s", tel_type) table = self._read_table(tel_type) + if not np.all( + table["subarray_pointing_frame"] == CoordinateFrameType.ALTAZ.value + ): + raise ValueError( + "Pointing information for training data has to be provided in horizontal coordinates" + ) + self.log.info("Train models on %s events", len(table)) self.cross_validate(tel_type, table) diff --git a/docs/changes/2431.bugfix.rst b/docs/changes/2431.bugfix.rst index 92920becde9..d5da9c18960 100644 --- a/docs/changes/2431.bugfix.rst +++ b/docs/changes/2431.bugfix.rst @@ -1,2 +1,2 @@ -Check the coordinate frame in which the array pointing is given -before using it in ``DispReconstructor``. +Check that the array pointing is given in horizontal coordinates +before training a ``DispReconstructor``. From 45d7738208552cda988d3e09cfcb332840d538e5 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 27 Oct 2023 15:31:28 +0200 Subject: [PATCH 196/264] Move the check of the coordinate frame to the right place --- ctapipe/tools/train_disp_reconstructor.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 67741e0e4e2..7edf728d1d9 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -105,13 +105,6 @@ def start(self): self.log.info("Loading events for %s", tel_type) table = self._read_table(tel_type) - if not np.all( - table["subarray_pointing_frame"] == CoordinateFrameType.ALTAZ.value - ): - raise ValueError( - "Pointing information for training data has to be provided in horizontal coordinates" - ) - self.log.info("Train models on %s events", len(table)) self.cross_validate(tel_type, table) @@ -135,6 +128,13 @@ def _read_table(self, telescope_type): f"No events after quality query for telescope type {telescope_type}" ) + if not np.all( + table["subarray_pointing_frame"] == CoordinateFrameType.ALTAZ.value + ): + raise ValueError( + "Pointing information for training data has to be provided in horizontal coordinates" + ) + table = self.models.feature_generator(table, subarray=self.loader.subarray) table[self.models.target] = self._get_true_disp(table) From ff533e30821932ff6709f0640a95cfc12f19b4fa Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 27 Oct 2023 18:08:59 +0200 Subject: [PATCH 197/264] Add disp train tool to sphinx docs --- ctapipe/tools/train_disp_reconstructor.py | 4 ++++ docs/api-reference/tools/index.rst | 3 +++ 2 files changed, 7 insertions(+) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index e4faa6b62c4..7dfc8504977 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -11,6 +11,10 @@ from ctapipe.reco import CrossValidator, DispReconstructor from ctapipe.reco.preprocessing import check_valid_rows, horizontal_to_telescope +__all__ = [ + "TrainDispReconstructor", +] + class TrainDispReconstructor(Tool): """ diff --git a/docs/api-reference/tools/index.rst b/docs/api-reference/tools/index.rst index 0d1c2dc8e6d..e9e9823e253 100644 --- a/docs/api-reference/tools/index.rst +++ b/docs/api-reference/tools/index.rst @@ -93,5 +93,8 @@ Reference/API .. automodapi:: ctapipe.tools.train_particle_classifier :no-inheritance-diagram: +.. automodapi:: ctapipe.tools.train_disp_reconstructor + :no-inheritance-diagram: + .. automodapi:: ctapipe.tools.apply_models :no-inheritance-diagram: From f34eb6fffa9a072ba897840402565b59df9fd525 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 27 Oct 2023 18:52:45 +0200 Subject: [PATCH 198/264] Fix docstrings for disp train tool --- ctapipe/tools/train_disp_reconstructor.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 7dfc8504977..784d68a6a18 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -22,7 +22,8 @@ class TrainDispReconstructor(Tool): The tool first performs a cross validation to give an initial estimate on the quality of the estimation and then finally trains two models - (|disp| and sign(disp)) per telescope type on the full dataset. + (estimating ``norm(disp)`` and ``sign(disp)`` respectively) per + telescope type on the full dataset. """ name = "ctapipe-train-disp-reconstructor" @@ -61,9 +62,9 @@ class TrainDispReconstructor(Tool): project_disp = Bool( default_value=False, help=( - "If true, true |disp| is the distance between shower cog and" + "If true, ``true_disp`` is the distance between shower cog and" " the true source position along the reconstructed main shower axis." - "If false, true |disp| is the distance between shower cog" + "If false, ``true_disp`` is the distance between shower cog" " and the true source position." ), ).tag(config=True) From 933ee75e9450ccd608a7f9290e31443fbac63304 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 31 Oct 2023 11:15:59 +0100 Subject: [PATCH 199/264] Fix unwanted default columns in disp output --- ctapipe/reco/sklearn.py | 12 ++++++++---- ctapipe/reco/utils.py | 12 ++++++------ ctapipe/tools/tests/test_apply_models.py | 2 +- docs/changes/2440.bugfix.rst | 1 + 4 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 docs/changes/2440.bugfix.rst diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 976ecb6079e..1ae0bc78158 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -416,7 +416,7 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table result, ReconstructedEnergyContainer, prefix=self.prefix, - stereo=False, + add_tel_prefix=True, ) return {ReconstructionProperty.ENERGY: result} @@ -480,7 +480,10 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table } ) add_defaults_and_meta( - result, ParticleClassificationContainer, prefix=self.prefix, stereo=False + result, + ParticleClassificationContainer, + prefix=self.prefix, + add_tel_prefix=True, ) return {ReconstructionProperty.PARTICLE_TYPE: result} @@ -770,7 +773,8 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table disp_result, DispContainer, prefix=f"{self.prefix}_parameter", - stereo=False, + # disp is always per telescope, so no need to add the prefix + add_tel_prefix=False, ) psi = table["hillas_psi"].quantity.to_value(u.rad) @@ -797,7 +801,7 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table altaz_result, ReconstructedGeometryContainer, prefix=self.prefix, - stereo=False, + add_tel_prefix=True, ) return { diff --git a/ctapipe/reco/utils.py b/ctapipe/reco/utils.py index bf26d948074..66824292cea 100644 --- a/ctapipe/reco/utils.py +++ b/ctapipe/reco/utils.py @@ -1,4 +1,4 @@ -def add_defaults_and_meta(table, container, prefix=None, stereo=True): +def add_defaults_and_meta(table, container, prefix=None, add_tel_prefix=False): """ Fill column descriptions and default values into table for container @@ -10,7 +10,7 @@ def add_defaults_and_meta(table, container, prefix=None, stereo=True): the container class to add columns and descriptions to the table prefix : str prefix for the column names - stereo : bool + add_tel_prefix : bool If False, add a ``tel_`` prefix to the column names to signal it's telescope-wise quantity """ @@ -18,13 +18,13 @@ def add_defaults_and_meta(table, container, prefix=None, stereo=True): prefix = container.default_prefix for name, field in container.fields.items(): - if not stereo and name == "telescopes": + if add_tel_prefix and name == "telescopes": continue - if stereo: - colname = f"{prefix}_{name}" - else: + if add_tel_prefix: colname = f"{prefix}_tel_{name}" + else: + colname = f"{prefix}_{name}" if colname not in table.colnames and field.default is not None: table[colname] = field.default diff --git a/ctapipe/tools/tests/test_apply_models.py b/ctapipe/tools/tests/test_apply_models.py index 13f8edb805a..32b0e4bcc86 100644 --- a/ctapipe/tools/tests/test_apply_models.py +++ b/ctapipe/tools/tests/test_apply_models.py @@ -103,7 +103,6 @@ def test_apply_all( energy_regressor_path, particle_classifier_path, disp_reconstructor_path, - dl2_shower_geometry_file_lapalma, tmp_path, ): from ctapipe.tools.apply_models import ApplyModels @@ -211,6 +210,7 @@ def test_apply_all( assert f"{prefix_disp}_tel_is_valid" in tel_events.colnames assert f"{prefix_disp}_parameter_norm" in tel_events.colnames assert f"{prefix_disp}_parameter_is_valid" in tel_events.colnames + assert f"{prefix_disp}_parameter_tel_is_valid" not in tel_events.colnames # check that the "--no-dl1-parameters" option worked assert "hillas_intensity" not in tel_events.colnames diff --git a/docs/changes/2440.bugfix.rst b/docs/changes/2440.bugfix.rst new file mode 100644 index 00000000000..435d4288113 --- /dev/null +++ b/docs/changes/2440.bugfix.rst @@ -0,0 +1 @@ +Fix additional, unwanted columns being written into disp prediction output. From 6d40f5d38635c35db3c0d9aa52cb35602964d5f3 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 31 Oct 2023 11:49:12 +0100 Subject: [PATCH 200/264] Fix docstring --- ctapipe/reco/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/reco/utils.py b/ctapipe/reco/utils.py index 66824292cea..48e14445b17 100644 --- a/ctapipe/reco/utils.py +++ b/ctapipe/reco/utils.py @@ -11,7 +11,7 @@ def add_defaults_and_meta(table, container, prefix=None, add_tel_prefix=False): prefix : str prefix for the column names add_tel_prefix : bool - If False, add a ``tel_`` prefix to the column names to signal it's + If True, add a ``tel_`` prefix to the column names to signal it's telescope-wise quantity """ if prefix is None: From 4788832641139f7fa1e5e295c226bb58bb8b4726 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Tue, 31 Oct 2023 11:51:31 +0100 Subject: [PATCH 201/264] More nitpick ignores to fix docs build --- docs/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index b91f6f0bfec..4bcb2131e40 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -131,10 +131,14 @@ def setup(app): ("py:class", "traitlets.config.application.Application"), ("py:class", "traitlets.utils.sentinel.Sentinel"), ("py:class", "traitlets.traitlets.ObserveHandler"), + ("py:class", "dict[K, V]"), + ("py:class", "G"), + ("py:class", "t.Sequence"), ("py:class", "StrDict"), ("py:class", "ClassesType"), ("py:obj", "traitlets.traitlets.G"), ("py:obj", "traitlets.traitlets.S"), + ("py:obj", "traitlets.traitlets.T"), ("py:class", "traitlets.traitlets.T"), ("py:class", "re.Pattern[t.Any]"), ("py:class", "Sentinel"), From 4c9d8d1c4a5bb88496b898ba361a3c37d77e6dfa Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:04:38 +0200 Subject: [PATCH 202/264] Think I understand the problem now --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d3d5188032d..2701b1603ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,6 +78,7 @@ jobs: if: matrix.install-method == 'mamba' env: PYTHON_VERSION: ${{ matrix.python-version }} + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | # setup correct python version sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml @@ -103,6 +104,7 @@ jobs: # Login shells on macOS prepend system paths, so we need to # prepend the python path from actions/setup-python. # Micromamba sets up ~/.bash_profile, where we need to set the path now. + if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' From 60e12036c4f49e0b8361db1b08c4fb3571ea9b29 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:20:26 +0200 Subject: [PATCH 203/264] Fix conflict with main --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2701b1603ab..504fd385252 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,7 +85,7 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false - uses: mamba-org/setup-micromamba@v1 + uses: mamba-org/provision-with-micromamba@v14 with: environment-file: environment.yml cache-downloads: true From 25574ae066f7a32d18322362005c81cd2de2ab05 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Thu, 5 Oct 2023 14:11:46 +0200 Subject: [PATCH 204/264] Rebasing on main --- .github/workflows/ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 504fd385252..0925b21d4c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,10 +75,9 @@ jobs: key: ctapipe-test-data - name: Prepare mamba installation - if: matrix.install-method == 'mamba' + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false env: PYTHON_VERSION: ${{ matrix.python-version }} - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | # setup correct python version sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml @@ -97,14 +96,13 @@ jobs: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} + - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation') == false name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 # Login shells on macOS prepend system paths, so we need to # prepend the python path from actions/setup-python. # Micromamba sets up ~/.bash_profile, where we need to set the path now. - if: contains(github.event.pull_request.labels.*.name, 'documentation') == false run: | tee -a ~/.bash_profile <<<'export PATH="$pythonLocation/bin:$PATH"' From 198d05dca95f9d08a8cb5148b64ca1a9a1534778 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Tue, 31 Oct 2023 14:31:11 +0100 Subject: [PATCH 205/264] Change label --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0925b21d4c9..2c3e565cb1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,7 @@ jobs: key: ctapipe-test-data - name: Prepare mamba installation - if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation') == false + if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false env: PYTHON_VERSION: ${{ matrix.python-version }} run: | @@ -96,7 +96,7 @@ jobs: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation') == false + - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 From a306dd951873e9ecce5c06d1768355e7a258dabe Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Tue, 31 Oct 2023 15:29:53 +0100 Subject: [PATCH 206/264] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c3e565cb1f..82d948772f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,7 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false - uses: mamba-org/provision-with-micromamba@v14 + uses: mamba-org/provision-with-micromamba@v1 with: environment-file: environment.yml cache-downloads: true From 01324c05ceace8fcf3a02f14cb882fd078dbdaac Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Tue, 31 Oct 2023 15:30:29 +0100 Subject: [PATCH 207/264] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82d948772f0..2e235d95e8d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,7 @@ jobs: - name: mamba setup if: matrix.install-method == 'mamba' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false - uses: mamba-org/provision-with-micromamba@v1 + uses: mamba-org/setup-micromamba@v1 with: environment-file: environment.yml cache-downloads: true From 1baacf510d94d8eeb43d7152a8053c1567d62c52 Mon Sep 17 00:00:00 2001 From: Daniel Morcuende Date: Thu, 2 Nov 2023 12:06:03 +0100 Subject: [PATCH 208/264] Bump setuptools and setuptools scm versions Versions in current build settings seem not compatible --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 73a42e69d99..1c196d0946c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools >= 40.6.0", "setuptools_scm[toml]>=3.4"] +requires = ["setuptools>=64", "setuptools_scm[toml]>=8"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] From d35e4c4626d4f837983c860c3885a1ad8e98e71d Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 2 Nov 2023 12:43:05 +0100 Subject: [PATCH 209/264] Fix logic condition in CI config --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e235d95e8d..68bc0fec85d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,7 +96,7 @@ jobs: python-version: ${{ matrix.python-version }} check-latest: true - - if: ${{ matrix.install-method == 'pip' && runner.os == 'macOS' }} && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false + - if: matrix.install-method == 'pip' && runner.os == 'macOS' && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false name: Fix Python PATH on macOS # See https://github.com/actions/setup-python/issues/132 and # https://github.com/actions/setup-python/issues/132#issuecomment-779406058 From 329d6b842531cc8a9dcf63b83832bb5d487ba63a Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 2 Nov 2023 12:45:37 +0100 Subject: [PATCH 210/264] Make sure CI uses correct python version --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68bc0fec85d..fee4fbdb0db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,8 +108,10 @@ jobs: - name: Install dependencies if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false + env: + PYTHON_VERSION: ${{ matrix.python-version }} run: | - python --version + python --version | grep "Python ${PYTHON_VERSION}" pip install pytest-cov restructuredtext-lint pytest-xdist 'coverage!=6.3.0' pip install .[all] pip install ./test_plugin From 40d3f05d562005739bb31600bebc7c89b1d7774b Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 2 Nov 2023 12:48:32 +0100 Subject: [PATCH 211/264] Move rst check of README into lint job --- .github/workflows/ci.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fee4fbdb0db..eba29b903d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,10 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + - name: Check README syntax + run: | + pip install restructuredtext-lint + restructuredtext-lint README.rst - uses: pre-commit/action@v3.0.0 with: extra_args: --files $(git diff origin/main --name-only) @@ -112,16 +116,11 @@ jobs: PYTHON_VERSION: ${{ matrix.python-version }} run: | python --version | grep "Python ${PYTHON_VERSION}" - pip install pytest-cov restructuredtext-lint pytest-xdist 'coverage!=6.3.0' + pip install pytest-cov pytest-xdist 'coverage!=6.3.0' pip install .[all] pip install ./test_plugin pip freeze - - name: Static codechecks - if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false - run: | - restructuredtext-lint README.rst - - name: ctapipe-info if: contains(github.event.pull_request.labels.*.name, 'documentation-only') == false run: | From e29e4974c324531ceef39d8a3edcc93f072d2870 Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Mon, 6 Nov 2023 11:13:33 +0100 Subject: [PATCH 212/264] Removed stray : from ctapipe.io page --- docs/api-reference/io/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/api-reference/io/index.rst b/docs/api-reference/io/index.rst index 82f18d7c908..a0f03f6f8da 100644 --- a/docs/api-reference/io/index.rst +++ b/docs/api-reference/io/index.rst @@ -114,7 +114,7 @@ for new data: column of an output table. -Serialization of Containers: +Serialization of Containers ============================ The `~ctapipe.io.TableWriter` and `~ctapipe.io.TableReader` base classes provide @@ -127,7 +127,7 @@ using the `~ctapipe.io.HDF5TableReader`, or more generically using the array values in a column cannot be read into a ``pandas.DataFrame``, since it only supports scalar values). -Writing Output Files: +Writing Output Files ===================== The `DataWriter` Component allows one to write a series of events (stored in @@ -144,12 +144,12 @@ information. It can be used in an event loop like: calibrate(event) write_data(event) -Reading Output Tables: +Reading Output Tables ====================== In addition to using an `EventSource` to read R0-DL1 data files, one can also access full *tables* for files that are in HDF5 format (e.g. DL1 and higher files). -`~ctapipe.io.TableLoader`: is a a convenient way to load and join together the +`~ctapipe.io.TableLoader` is a a convenient way to load and join together the tables in a ctapipe output file into one or more high-level tables useful for analysis. Which information is read and joined is controlled by the TableLoader's configuration options. From 9de22c297bef75c0a57a735e95f19fdd1ae3a38a Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Mon, 6 Nov 2023 11:17:04 +0100 Subject: [PATCH 213/264] Added newline to get python block rendering properly --- docs/api-reference/io/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/api-reference/io/index.rst b/docs/api-reference/io/index.rst index a0f03f6f8da..bbcb6dddadb 100644 --- a/docs/api-reference/io/index.rst +++ b/docs/api-reference/io/index.rst @@ -169,6 +169,7 @@ into one big table, joining the simulation information if available: You can also load telescope events for specific selections of telescopes: + .. code-block:: python # by str representation of the type From 0ebff9d7ac2b367408f7ee23f8e0c8c330ec2e82 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 31 Oct 2023 15:19:26 +0100 Subject: [PATCH 214/264] Remove redundant is_valid field and use same prefix for containers in disp --- ctapipe/containers.py | 7 ++++--- ctapipe/reco/sklearn.py | 19 ++++++------------- docs/changes/2443.optimization.rst | 3 +++ 3 files changed, 13 insertions(+), 16 deletions(-) create mode 100644 docs/changes/2443.optimization.rst diff --git a/ctapipe/containers.py b/ctapipe/containers.py index 3fbb88a762c..d94f39eea99 100644 --- a/ctapipe/containers.py +++ b/ctapipe/containers.py @@ -988,10 +988,11 @@ class DispContainer(Container): Standard output of disp reconstruction algorithms for origin reconstruction """ - default_prefix = "disp_parameter" + default_prefix = "disp" - norm = Field(nan * u.deg, "reconstructed value for disp", unit=u.deg) - is_valid = Field(False, "true if the predictions are valid") + parameter = Field( + nan * u.deg, "reconstructed value for disp (= sign * norm)", unit=u.deg + ) class ReconstructedContainer(Container): diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 1ae0bc78158..9e909ae5227 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -493,7 +493,7 @@ class DispReconstructor(Reconstructor): Predict absolute value and sign for disp origin reconstruction for each telescope. """ - target = "true_norm" + target = "true_disp" prefix = traits.Unicode(default_value="disp", allow_none=False).tag(config=True) @@ -722,8 +722,7 @@ def __call__(self, event: ArrayEventContainer) -> None: ) else: disp_container = DispContainer( - norm=u.Quantity(np.nan, self.unit), - is_valid=False, + parameter=u.Quantity(np.nan, self.unit), ) altaz_container = ReconstructedGeometryContainer( alt=u.Quantity(np.nan, u.deg, copy=False), @@ -731,7 +730,7 @@ def __call__(self, event: ArrayEventContainer) -> None: is_valid=False, ) - disp_container.prefix = f"{self.prefix}_parameter" + disp_container.prefix = f"{self.prefix}_tel" altaz_container.prefix = f"{self.prefix}_tel" event.dl2.tel[tel_id].disp[self.prefix] = disp_container event.dl2.tel[tel_id].geometry[self.prefix] = altaz_container @@ -763,18 +762,12 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table valid = self.quality_query.get_table_mask(table) disp[valid], is_valid[valid] = self._predict(key, table[valid]) - disp_result = Table( - { - f"{self.prefix}_parameter_norm": disp, - f"{self.prefix}_parameter_is_valid": is_valid, - } - ) + disp_result = Table({f"{self.prefix}_tel_parameter": disp}) add_defaults_and_meta( disp_result, DispContainer, - prefix=f"{self.prefix}_parameter", - # disp is always per telescope, so no need to add the prefix - add_tel_prefix=False, + prefix=self.prefix, + add_tel_prefix=True, ) psi = table["hillas_psi"].quantity.to_value(u.rad) diff --git a/docs/changes/2443.optimization.rst b/docs/changes/2443.optimization.rst new file mode 100644 index 00000000000..50c3793a9b1 --- /dev/null +++ b/docs/changes/2443.optimization.rst @@ -0,0 +1,3 @@ +Remove redundant ``is_valid`` field in ``DispContainer`` and rename the remaining field. +Use the same prefix for both containers filled by ``DispReconstructor``. +Fix default name of ``DispReconstructor`` target column. From 76628bdab1ec5460c6871fbb03a5922e3eb0b0ab Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 11:50:09 +0100 Subject: [PATCH 215/264] Adapt missing DispContainer assingment --- ctapipe/reco/sklearn.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 9e909ae5227..8d5d7fe9bd9 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -690,12 +690,10 @@ def __call__(self, event: ArrayEventContainer) -> None: if passes_quality_checks: disp, valid = self._predict(self.subarray.tel[tel_id], table) - disp_container = DispContainer( - norm=disp[0], - is_valid=valid[0], - ) if valid: + disp_container = DispContainer(parameter=disp[0]) + hillas = event.dl1.tel[tel_id].parameters.hillas psi = hillas.psi.to_value(u.rad) @@ -715,6 +713,9 @@ def __call__(self, event: ArrayEventContainer) -> None: ) else: + disp_container = DispContainer( + parameter=u.Quantity(np.nan, self.unit), + ) altaz_container = ReconstructedGeometryContainer( alt=u.Quantity(np.nan, u.deg, copy=False), az=u.Quantity(np.nan, u.deg, copy=False), From da7bb4f22193634dbb665bdf394ab3a2a3a0cce1 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 11:50:35 +0100 Subject: [PATCH 216/264] Adapt relevant tests --- ctapipe/tools/tests/test_apply_models.py | 5 ++--- ctapipe/tools/tests/test_process_ml.py | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ctapipe/tools/tests/test_apply_models.py b/ctapipe/tools/tests/test_apply_models.py index 32b0e4bcc86..1075cb13bc3 100644 --- a/ctapipe/tools/tests/test_apply_models.py +++ b/ctapipe/tools/tests/test_apply_models.py @@ -208,9 +208,8 @@ def test_apply_all( assert f"{prefix_disp}_tel_alt" in tel_events.colnames assert f"{prefix_disp}_tel_az" in tel_events.colnames assert f"{prefix_disp}_tel_is_valid" in tel_events.colnames - assert f"{prefix_disp}_parameter_norm" in tel_events.colnames - assert f"{prefix_disp}_parameter_is_valid" in tel_events.colnames - assert f"{prefix_disp}_parameter_tel_is_valid" not in tel_events.colnames + assert f"{prefix_disp}_tel_parameter" in tel_events.colnames + assert f"{prefix_disp}_parameter" not in tel_events.colnames # check that the "--no-dl1-parameters" option worked assert "hillas_intensity" not in tel_events.colnames diff --git a/ctapipe/tools/tests/test_process_ml.py b/ctapipe/tools/tests/test_process_ml.py index a4fb75d428d..6a25f503aa5 100644 --- a/ctapipe/tools/tests/test_process_ml.py +++ b/ctapipe/tools/tests/test_process_ml.py @@ -161,8 +161,7 @@ def test_process_apply_disp( run_tool(tool, argv=argv, cwd=tmp_path, raises=True) tel_events = read_table(output, "/dl2/event/telescope/disp/disp/tel_004") - assert "disp_parameter_norm" in tel_events.colnames - assert "disp_parameter_is_valid" in tel_events.colnames + assert "disp_tel_parameter" in tel_events.colnames tel_events = read_table(output, "/dl2/event/telescope/geometry/disp/tel_004") assert "disp_tel_alt" in tel_events.colnames From 36ca50876b83e302a823919bb811453391493157 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 12:18:43 +0100 Subject: [PATCH 217/264] Bump data model version; switch changelog to datamodel --- ctapipe/io/datawriter.py | 9 ++++++--- ctapipe/io/hdf5eventsource.py | 1 + .../{2443.optimization.rst => 2443.datamodel.rst} | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) rename docs/changes/{2443.optimization.rst => 2443.datamodel.rst} (99%) diff --git a/ctapipe/io/datawriter.py b/ctapipe/io/datawriter.py index 3a5cc8f00dd..99bac55dd13 100644 --- a/ctapipe/io/datawriter.py +++ b/ctapipe/io/datawriter.py @@ -48,8 +48,11 @@ def _get_tel_index(event, tel_id): # (meaning readers need to update scripts) # - increase the minor number if new columns or datasets are added # - increase the patch number if there is a small bugfix to the model. -DATA_MODEL_VERSION = "v5.0.0" +DATA_MODEL_VERSION = "v6.0.0" DATA_MODEL_CHANGE_HISTORY = """ +- v6.0.0: - Remove redundant 'is_valid' column in ``DispContainer``. + - Rename content of ``DispContainer`` from 'norm' to 'parameter' and use the same + default prefix ('disp') for all containers filled by ``DispReconstructor``. - v5.0.0: - Change DL2 telescope-wise container prefixes from {algorithm}_tel to {algorithm}_tel_{kind}. As of now, this only changes 'tel_distance' to 'tel_impact_distance' - v4.0.0: - Changed how ctapipe-specific metadata is stored in hdf5 attributes. @@ -58,8 +61,8 @@ def _get_tel_index(event, tel_id): and true parameters. - Telescope Impact Parameters were added. - Effective focal length and nominal focal length are both included - in the optics description now. Moved `TelescopeDescription.type` - to `OpticsDescription.size_type`. Added `OpticsDescription.reflector_shape`. + in the optics description now. Moved ``TelescopeDescription.type`` + to ``OpticsDescription.size_type``. Added ``OpticsDescription.reflector_shape``. - n_samples, n_samples_long, n_channels and n_pixels are now part of CameraReadout. - The reference_location (EarthLocation origin of the telescope coordinates) diff --git a/ctapipe/io/hdf5eventsource.py b/ctapipe/io/hdf5eventsource.py index c7bda1f9b7d..030d1044735 100644 --- a/ctapipe/io/hdf5eventsource.py +++ b/ctapipe/io/hdf5eventsource.py @@ -70,6 +70,7 @@ COMPATIBLE_DATA_MODEL_VERSIONS = [ "v4.0.0", "v5.0.0", + "v6.0.0", ] diff --git a/docs/changes/2443.optimization.rst b/docs/changes/2443.datamodel.rst similarity index 99% rename from docs/changes/2443.optimization.rst rename to docs/changes/2443.datamodel.rst index 50c3793a9b1..a8bf52c0233 100644 --- a/docs/changes/2443.optimization.rst +++ b/docs/changes/2443.datamodel.rst @@ -1,3 +1,4 @@ Remove redundant ``is_valid`` field in ``DispContainer`` and rename the remaining field. Use the same prefix for both containers filled by ``DispReconstructor``. + Fix default name of ``DispReconstructor`` target column. From f44b1772cfaf8dbf0f4982cf168c5d747a9004ed Mon Sep 17 00:00:00 2001 From: Tomas Bylund Date: Mon, 6 Nov 2023 13:02:30 +0100 Subject: [PATCH 218/264] Fixed underlining to match length of title --- docs/api-reference/io/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/api-reference/io/index.rst b/docs/api-reference/io/index.rst index bbcb6dddadb..adbc43492b4 100644 --- a/docs/api-reference/io/index.rst +++ b/docs/api-reference/io/index.rst @@ -14,7 +14,7 @@ in-memory storage of event data Reading Event Data -=================== +================== This module provides a set of *event sources* that are python generators that loop through an input file or stream and fill in @@ -115,7 +115,7 @@ for new data: Serialization of Containers -============================ +=========================== The `~ctapipe.io.TableWriter` and `~ctapipe.io.TableReader` base classes provide an interface to implement subclasses that write/read Containers to/from @@ -128,7 +128,7 @@ array values in a column cannot be read into a ``pandas.DataFrame``, since it only supports scalar values). Writing Output Files -===================== +==================== The `DataWriter` Component allows one to write a series of events (stored in `ctapipe.containers.ArrayEventContainer`) to a standardized HDF5 format file @@ -145,7 +145,7 @@ information. It can be used in an event loop like: write_data(event) Reading Output Tables -====================== +===================== In addition to using an `EventSource` to read R0-DL1 data files, one can also access full *tables* for files that are in HDF5 format (e.g. DL1 and higher files). From 40b41f9c71b57efde50e4a18a2ab1cdb601633ce Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 13:06:56 +0100 Subject: [PATCH 219/264] Fix failing test --- ctapipe/io/tests/test_hdf5eventsource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/io/tests/test_hdf5eventsource.py b/ctapipe/io/tests/test_hdf5eventsource.py index bae1eb1359b..2f139575064 100644 --- a/ctapipe/io/tests/test_hdf5eventsource.py +++ b/ctapipe/io/tests/test_hdf5eventsource.py @@ -28,7 +28,7 @@ def test_is_compatible(compatible_file, request): def test_metadata(dl1_file): with HDF5EventSource(input_url=dl1_file) as source: assert source.is_simulation - assert source.datamodel_version == (5, 0, 0) + assert source.datamodel_version == (6, 0, 0) assert set(source.datalevels) == { DataLevel.DL1_IMAGES, DataLevel.DL1_PARAMETERS, From d04e9e4495e7ba404259ff1dec771edc5b3a4b2a Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 14:44:50 +0100 Subject: [PATCH 220/264] Include DispContainer in HDF5EventSource --- ctapipe/io/datawriter.py | 4 ++-- ctapipe/io/hdf5eventsource.py | 4 +++- ctapipe/io/tests/test_hdf5eventsource.py | 2 +- docs/changes/2443.datamodel.rst | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ctapipe/io/datawriter.py b/ctapipe/io/datawriter.py index 99bac55dd13..398e4acbb2f 100644 --- a/ctapipe/io/datawriter.py +++ b/ctapipe/io/datawriter.py @@ -48,9 +48,9 @@ def _get_tel_index(event, tel_id): # (meaning readers need to update scripts) # - increase the minor number if new columns or datasets are added # - increase the patch number if there is a small bugfix to the model. -DATA_MODEL_VERSION = "v6.0.0" +DATA_MODEL_VERSION = "v5.1.0" DATA_MODEL_CHANGE_HISTORY = """ -- v6.0.0: - Remove redundant 'is_valid' column in ``DispContainer``. +- v5.1.0: - Remove redundant 'is_valid' column in ``DispContainer``. - Rename content of ``DispContainer`` from 'norm' to 'parameter' and use the same default prefix ('disp') for all containers filled by ``DispReconstructor``. - v5.0.0: - Change DL2 telescope-wise container prefixes from {algorithm}_tel to {algorithm}_tel_{kind}. diff --git a/ctapipe/io/hdf5eventsource.py b/ctapipe/io/hdf5eventsource.py index 030d1044735..9b7e533d06e 100644 --- a/ctapipe/io/hdf5eventsource.py +++ b/ctapipe/io/hdf5eventsource.py @@ -16,6 +16,7 @@ CameraHillasParametersContainer, CameraTimingParametersContainer, ConcentrationContainer, + DispContainer, DL1CameraContainer, EventIndexContainer, HillasParametersContainer, @@ -64,13 +65,14 @@ "geometry": ReconstructedGeometryContainer, "classification": ParticleClassificationContainer, "impact": TelescopeImpactParameterContainer, + "disp": DispContainer, } COMPATIBLE_DATA_MODEL_VERSIONS = [ "v4.0.0", "v5.0.0", - "v6.0.0", + "v5.1.0", ] diff --git a/ctapipe/io/tests/test_hdf5eventsource.py b/ctapipe/io/tests/test_hdf5eventsource.py index 2f139575064..d64e2ed7902 100644 --- a/ctapipe/io/tests/test_hdf5eventsource.py +++ b/ctapipe/io/tests/test_hdf5eventsource.py @@ -28,7 +28,7 @@ def test_is_compatible(compatible_file, request): def test_metadata(dl1_file): with HDF5EventSource(input_url=dl1_file) as source: assert source.is_simulation - assert source.datamodel_version == (6, 0, 0) + assert source.datamodel_version == (5, 1, 0) assert set(source.datalevels) == { DataLevel.DL1_IMAGES, DataLevel.DL1_PARAMETERS, diff --git a/docs/changes/2443.datamodel.rst b/docs/changes/2443.datamodel.rst index a8bf52c0233..0d97889347e 100644 --- a/docs/changes/2443.datamodel.rst +++ b/docs/changes/2443.datamodel.rst @@ -2,3 +2,5 @@ Remove redundant ``is_valid`` field in ``DispContainer`` and rename the remainin Use the same prefix for both containers filled by ``DispReconstructor``. Fix default name of ``DispReconstructor`` target column. + +Let ``HDF5EventSource`` load ``DispContainer``. From 567ec771c29fba7492abdf2956600a6d7b91530a Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 17 Nov 2023 09:51:23 +0100 Subject: [PATCH 221/264] Fix coverage report not being found by codecov --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eba29b903d1..2ec9eb6e9a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -131,10 +131,10 @@ jobs: run: | cd $(mktemp -d) pytest -n auto --dist loadscope \ - --cov --cov-report=xml \ + --cov --cov-report=xml:$GITHUB_WORKSPACE/coverage.xml \ --doctest-modules --doctest-glob='*.rst' \ - --ignore=$HOME/work/ctapipe/ctapipe/docs/conf.py \ - --pyargs ctapipe $HOME/work/ctapipe/ctapipe/docs + --ignore=$GITHUB_WORKSPACE/docs/conf.py \ + --pyargs ctapipe $GITHUB_WORKSPACE/docs ctapipe-info --version From 8acee473230cf33437349928a569c8dce66be9e2 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 17 Nov 2023 09:53:25 +0100 Subject: [PATCH 222/264] Make CI fail on codecov error --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ec9eb6e9a2..4a1d62d175a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,6 +140,8 @@ jobs: - uses: codecov/codecov-action@v3 if: contains(matrix.extra-args, 'codecov') + with: + fail_ci_if_error: true docs: runs-on: ubuntu-latest From bb7cc84150e4a60cf0a3681aad93798c29f0c404 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Wed, 25 Oct 2023 16:19:19 +0200 Subject: [PATCH 223/264] Load training data in chunks when training an energy regressor --- ctapipe/tools/train_energy_regressor.py | 72 ++++++++++++++++++------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 89647f6c39b..e0f412f169b 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -2,6 +2,8 @@ Tool for training the EnergyRegressor """ import numpy as np +from astropy.table import vstack +from tqdm.auto import tqdm from ctapipe.core import Tool from ctapipe.core.traits import Int, IntTelescopeParameter, Path @@ -53,6 +55,12 @@ class TrainEnergyRegressor(Tool): ), ).tag(config=True) + chunk_size = Int( + default_value=100000, + allow_none=True, + help="How many subarray events to load at once before training on n_events.", + ).tag(config=True) + random_seed = Int( default_value=0, help="Random seed for sampling and cross validation" ).tag(config=True) @@ -61,6 +69,7 @@ class TrainEnergyRegressor(Tool): ("i", "input"): "TableLoader.input_url", ("o", "output"): "TrainEnergyRegressor.output_path", "n-events": "TrainEnergyRegressor.n_events", + "chunk-size": "TrainEnergyRegressor.chunk_size", "cv-output": "CrossValidator.output_path", } @@ -113,31 +122,56 @@ def start(self): self.log.info("done") def _read_table(self, telescope_type): - table = self.loader.read_telescope_events([telescope_type]) - self.log.info("Events read from input: %d", len(table)) - if len(table) == 0: - raise TooFewEvents( - f"Input file does not contain any events for telescope type {telescope_type}" - ) + chunk_iterator = self.loader.read_telescope_events_chunked( + self.chunk_size, + telescopes=[telescope_type], + ) + bar = tqdm( + chunk_iterator, + desc=f"Loading training events for {telescope_type}", + unit=" Array Events", + total=chunk_iterator.n_total, + ) + table = [] + n_events_in_file = 0 + n_valid_events_in_file = 0 + + with bar: + for chunk, (start, stop, table_chunk) in enumerate(chunk_iterator): + self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) + n_events_in_file += len(table_chunk) + + mask = self.regressor.quality_query.get_table_mask(table_chunk) + table_chunk = table_chunk[mask] + self.log.debug( + "Events in chunk %d after applying quality_query: %d", + chunk, + len(table_chunk), + ) + n_valid_events_in_file += len(table_chunk) + + table_chunk = self.regressor.feature_generator( + table_chunk, subarray=self.loader.subarray + ) + feature_names = self.regressor.features + [self.regressor.target] + table_chunk = table_chunk[feature_names] + + valid = check_valid_rows(table_chunk) + if np.any(~valid): + self.log.warning("Dropping non-predictable events.") + table_chunk = table_chunk[valid] - mask = self.regressor.quality_query.get_table_mask(table) - table = table[mask] - self.log.info("Events after applying quality query: %d", len(table)) + table.append(table_chunk) + bar.update(stop - start) + + table = vstack(table) + self.log.info("Events read from input: %d", n_events_in_file) + self.log.info("Events after applying quality query: %d", n_valid_events_in_file) if len(table) == 0: raise TooFewEvents( f"No events after quality query for telescope type {telescope_type}" ) - table = self.regressor.feature_generator(table, subarray=self.loader.subarray) - - feature_names = self.regressor.features + [self.regressor.target] - table = table[feature_names] - - valid = check_valid_rows(table) - if np.any(~valid): - self.log.warning("Dropping non-predictable events.") - table = table[valid] - n_events = self.n_events.tel[telescope_type] if n_events is not None: if n_events > len(table): From 08495766a277441e23a6f1efbf6b84c1382076fe Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Wed, 25 Oct 2023 17:27:03 +0200 Subject: [PATCH 224/264] Check event validity after merging chunks and make it faster --- ctapipe/tools/train_disp_reconstructor.py | 2 +- ctapipe/tools/train_energy_regressor.py | 12 ++++++------ ctapipe/tools/train_particle_classifier.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 80352a0bb29..1d53c588ae3 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -152,7 +152,7 @@ def _read_table(self, telescope_type): table = table[columns] valid = check_valid_rows(table) - if np.any(~valid): + if not np.all(valid): self.log.warning("Dropping non-predicable events.") table = table[valid] diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index e0f412f169b..11ad2ce548d 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -129,7 +129,7 @@ def _read_table(self, telescope_type): bar = tqdm( chunk_iterator, desc=f"Loading training events for {telescope_type}", - unit=" Array Events", + unit=" Telescope Events", total=chunk_iterator.n_total, ) table = [] @@ -156,11 +156,6 @@ def _read_table(self, telescope_type): feature_names = self.regressor.features + [self.regressor.target] table_chunk = table_chunk[feature_names] - valid = check_valid_rows(table_chunk) - if np.any(~valid): - self.log.warning("Dropping non-predictable events.") - table_chunk = table_chunk[valid] - table.append(table_chunk) bar.update(stop - start) @@ -172,6 +167,11 @@ def _read_table(self, telescope_type): f"No events after quality query for telescope type {telescope_type}" ) + valid = check_valid_rows(table) + if not np.all(valid): + self.log.warning("Dropping non-predictable events.") + table = table[valid] + n_events = self.n_events.tel[telescope_type] if n_events is not None: if n_events > len(table): diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index b8511c6fd1e..21c5e21fdd3 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -184,7 +184,7 @@ def _read_table(self, telescope_type, loader, n_events=None): table = table[columns] valid = check_valid_rows(table) - if np.any(~valid): + if not np.all(valid): self.log.warning("Dropping non-predictable events.") table = table[valid] From 8b60cf5799fdea790e8d674dbe3618e2c4e6ff16 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Thu, 26 Oct 2023 15:27:22 +0200 Subject: [PATCH 225/264] Do all event validation in chunk loop; remove loading bar - Since the total number of telescope events in a file is not known when loading in chunks (only the total number of subarray events), a progress bar for loading does not make sense. --- ctapipe/tools/train_energy_regressor.py | 58 ++++++++++++------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 11ad2ce548d..3032e9237b3 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -3,7 +3,6 @@ """ import numpy as np from astropy.table import vstack -from tqdm.auto import tqdm from ctapipe.core import Tool from ctapipe.core.traits import Int, IntTelescopeParameter, Path @@ -126,51 +125,48 @@ def _read_table(self, telescope_type): self.chunk_size, telescopes=[telescope_type], ) - bar = tqdm( - chunk_iterator, - desc=f"Loading training events for {telescope_type}", - unit=" Telescope Events", - total=chunk_iterator.n_total, - ) table = [] n_events_in_file = 0 n_valid_events_in_file = 0 + n_non_predictable = 0 + + for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): + self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) + n_events_in_file += len(table_chunk) + + mask = self.regressor.quality_query.get_table_mask(table_chunk) + table_chunk = table_chunk[mask] + self.log.debug( + "Events in chunk %d after applying quality_query: %d", + chunk, + len(table_chunk), + ) + n_valid_events_in_file += len(table_chunk) - with bar: - for chunk, (start, stop, table_chunk) in enumerate(chunk_iterator): - self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) - n_events_in_file += len(table_chunk) - - mask = self.regressor.quality_query.get_table_mask(table_chunk) - table_chunk = table_chunk[mask] - self.log.debug( - "Events in chunk %d after applying quality_query: %d", - chunk, - len(table_chunk), - ) - n_valid_events_in_file += len(table_chunk) + table_chunk = self.regressor.feature_generator( + table_chunk, subarray=self.loader.subarray + ) + feature_names = self.regressor.features + [self.regressor.target] + table_chunk = table_chunk[feature_names] - table_chunk = self.regressor.feature_generator( - table_chunk, subarray=self.loader.subarray - ) - feature_names = self.regressor.features + [self.regressor.target] - table_chunk = table_chunk[feature_names] + valid = check_valid_rows(table_chunk) + if not np.all(valid): + n_non_predictable += np.sum(valid) + table_chunk = table_chunk[valid] - table.append(table_chunk) - bar.update(stop - start) + table.append(table_chunk) table = vstack(table) self.log.info("Events read from input: %d", n_events_in_file) self.log.info("Events after applying quality query: %d", n_valid_events_in_file) + if len(table) == 0: raise TooFewEvents( f"No events after quality query for telescope type {telescope_type}" ) - valid = check_valid_rows(table) - if not np.all(valid): - self.log.warning("Dropping non-predictable events.") - table = table[valid] + if n_non_predictable > 0: + self.log.warning("Dropping %d non-predictable events.", n_non_predictable) n_events = self.n_events.tel[telescope_type] if n_events is not None: From 88f00b501ebcce6d7a7447018f38c60a4104e892 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Thu, 26 Oct 2023 16:14:35 +0200 Subject: [PATCH 226/264] Chunked loading for training particle clf and training disp reco --- ctapipe/tools/train_disp_reconstructor.py | 80 +++++++++++++++------- ctapipe/tools/train_particle_classifier.py | 67 +++++++++++++----- 2 files changed, 103 insertions(+), 44 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 1d53c588ae3..7ba282c9728 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -3,6 +3,7 @@ """ import astropy.units as u import numpy as np +from astropy.table import vstack from ctapipe.containers import CoordinateFrameType from ctapipe.core import Tool @@ -56,6 +57,12 @@ class TrainDispReconstructor(Tool): ), ).tag(config=True) + chunk_size = Int( + default_value=100000, + allow_none=True, + help="How many subarray events to load at once before training on n_events.", + ).tag(config=True) + random_seed = Int( default_value=0, help="Random seed for sampling and cross validation" ).tag(config=True) @@ -121,40 +128,61 @@ def start(self): self.log.info("done") def _read_table(self, telescope_type): - table = self.loader.read_telescope_events([telescope_type]) - self.log.info("Events read from input: %d", len(table)) - if len(table) == 0: - raise TooFewEvents( - f"Input file does not contain any events for telescope type {telescope_type}" + chunk_iterator = self.loader.read_telescope_events_chunked( + self.chunk_size, + telescopes=[telescope_type], + ) + table = [] + n_events_in_file = 0 + n_valid_events_in_file = 0 + n_non_predictable = 0 + + for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): + self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) + n_events_in_file += len(table_chunk) + + mask = self.models.quality_query.get_table_mask(table_chunk) + table_chunk = table_chunk[mask] + self.log.debug( + "Events in chunk %d after applying quality_query: %d", + chunk, + len(table_chunk), ) + n_valid_events_in_file += len(table_chunk) - mask = self.models.quality_query.get_table_mask(table) - table = table[mask] - self.log.info("Events after applying quality query: %d", len(table)) - if len(table) == 0: - raise TooFewEvents( - f"No events after quality query for telescope type {telescope_type}" - ) + if not np.all( + table_chunk["subarray_pointing_frame"] == CoordinateFrameType.ALTAZ.value + ): + raise ValueError( + "Pointing information for training data has to be provided in horizontal coordinates" + ) - if not np.all( - table["subarray_pointing_frame"] == CoordinateFrameType.ALTAZ.value - ): - raise ValueError( - "Pointing information for training data has to be provided in horizontal coordinates" + table_chunk = self.models.feature_generator( + table_chunk, subarray=self.loader.subarray ) + table_chunk[self.models.target] = self._get_true_disp(table_chunk) + # Add true energy for energy-dependent performance plots + columns = self.models.features + [self.models.target, "true_energy"] + table_chunk = table_chunk[columns] + + valid = check_valid_rows(table_chunk) + if not np.all(valid): + n_non_predictable += np.sum(valid) + table_chunk = table_chunk[valid] - table = self.models.feature_generator(table, subarray=self.loader.subarray) + table.append(table_chunk) - table[self.models.target] = self._get_true_disp(table) + table = vstack(table) + self.log.info("Events read from input: %d", n_events_in_file) + self.log.info("Events after applying quality query: %d", n_valid_events_in_file) - # Add true energy for energy-dependent performance plots - columns = self.models.features + [self.models.target, "true_energy"] - table = table[columns] + if len(table) == 0: + raise TooFewEvents( + f"No events after quality query for telescope type {telescope_type}" + ) - valid = check_valid_rows(table) - if not np.all(valid): - self.log.warning("Dropping non-predicable events.") - table = table[valid] + if n_non_predictable > 0: + self.log.warning("Dropping %d non-predictable events.", n_non_predictable) n_events = self.n_events.tel[telescope_type] if n_events is not None: diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 21c5e21fdd3..d3d1d8074db 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -78,6 +78,15 @@ class TrainParticleClassifier(Tool): ), ).tag(config=True) + chunk_size = Int( + default_value=100000, + allow_none=True, + help=( + "How many subarray events to load at once before training on" + " n_signal and n_background events." + ), + ).tag(config=True) + random_seed = Int( default_value=0, help="Random number seed for sampling and the cross validation splitting", @@ -162,31 +171,53 @@ def start(self): self.log.info("done") def _read_table(self, telescope_type, loader, n_events=None): - table = loader.read_telescope_events([telescope_type]) - self.log.info("Events read from input: %d", len(table)) - if len(table) == 0: - raise TooFewEvents( - f"Input file does not contain any events for telescope type {telescope_type}" + chunk_iterator = loader.read_telescope_events_chunked( + self.chunk_size, + telescopes=[telescope_type], + ) + table = [] + n_events_in_file = 0 + n_valid_events_in_file = 0 + n_non_predictable = 0 + + for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): + self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) + n_events_in_file += len(table_chunk) + + mask = self.classifier.quality_query.get_table_mask(table_chunk) + table_chunk = table_chunk[mask] + self.log.debug( + "Events in chunk %d after applying quality_query: %d", + chunk, + len(table_chunk), ) + n_valid_events_in_file += len(table_chunk) + + table_chunk = self.classifier.feature_generator( + table_chunk, subarray=self.subarray + ) + # Add true energy for energy-dependent performance plots + columns = self.classifier.features + [self.classifier.target, "true_energy"] + table_chunk = table_chunk[columns] + + valid = check_valid_rows(table_chunk) + if not np.all(valid): + n_non_predictable += np.sum(valid) + table_chunk = table_chunk[valid] + + table.append(table_chunk) + + table = vstack(table) + self.log.info("Events read from input: %d", n_events_in_file) + self.log.info("Events after applying quality query: %d", n_valid_events_in_file) - mask = self.classifier.quality_query.get_table_mask(table) - table = table[mask] - self.log.info("Events after applying quality query: %d", len(table)) if len(table) == 0: raise TooFewEvents( f"No events after quality query for telescope type {telescope_type}" ) - table = self.classifier.feature_generator(table, subarray=self.subarray) - - # Add true energy for energy-dependent performance plots - columns = self.classifier.features + [self.classifier.target, "true_energy"] - table = table[columns] - - valid = check_valid_rows(table) - if not np.all(valid): - self.log.warning("Dropping non-predictable events.") - table = table[valid] + if n_non_predictable > 0: + self.log.warning("Dropping %d non-predictable events.", n_non_predictable) if n_events is not None: if n_events > len(table): From 525e3ba9a47cc7b0b32ec1ee566aa115806a0b26 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Thu, 26 Oct 2023 16:14:49 +0200 Subject: [PATCH 227/264] Add changelog --- docs/changes/2423.optimization.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/changes/2423.optimization.rst diff --git a/docs/changes/2423.optimization.rst b/docs/changes/2423.optimization.rst new file mode 100644 index 00000000000..b6e1567767a --- /dev/null +++ b/docs/changes/2423.optimization.rst @@ -0,0 +1,3 @@ +Load data and apply event and column selection in chunks in ``ctapipe-train-*`` +before merging afterwards. +This reduces memory usage. From 4ac7709a2139f9bc1fbb01bc28ce328428dcceba Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 13:02:26 +0100 Subject: [PATCH 228/264] Fix line too long --- ctapipe/tools/train_disp_reconstructor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 7ba282c9728..ec69a3d13b8 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -151,7 +151,8 @@ def _read_table(self, telescope_type): n_valid_events_in_file += len(table_chunk) if not np.all( - table_chunk["subarray_pointing_frame"] == CoordinateFrameType.ALTAZ.value + table_chunk["subarray_pointing_frame"] + == CoordinateFrameType.ALTAZ.value ): raise ValueError( "Pointing information for training data has to be provided in horizontal coordinates" From 3fae0b0af16ea8da5033611c4090d587e8ce0dff Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 6 Nov 2023 14:16:59 +0100 Subject: [PATCH 229/264] Count invalid events as non-predictable, not valid events --- ctapipe/tools/train_disp_reconstructor.py | 2 +- ctapipe/tools/train_energy_regressor.py | 2 +- ctapipe/tools/train_particle_classifier.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index ec69a3d13b8..6b3ad6d0314 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -168,7 +168,7 @@ def _read_table(self, telescope_type): valid = check_valid_rows(table_chunk) if not np.all(valid): - n_non_predictable += np.sum(valid) + n_non_predictable += np.sum(~valid) table_chunk = table_chunk[valid] table.append(table_chunk) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 3032e9237b3..7fe7986b380 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -151,7 +151,7 @@ def _read_table(self, telescope_type): valid = check_valid_rows(table_chunk) if not np.all(valid): - n_non_predictable += np.sum(valid) + n_non_predictable += np.sum(~valid) table_chunk = table_chunk[valid] table.append(table_chunk) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index d3d1d8074db..76865cd5366 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -202,7 +202,7 @@ def _read_table(self, telescope_type, loader, n_events=None): valid = check_valid_rows(table_chunk) if not np.all(valid): - n_non_predictable += np.sum(valid) + n_non_predictable += np.sum(~valid) table_chunk = table_chunk[valid] table.append(table_chunk) From 8378645763482fac1f0239cc81fabc68eb0eaa75 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 7 Nov 2023 10:42:08 +0100 Subject: [PATCH 230/264] Refactor reading training data into standalone funtion --- ctapipe/tools/train_disp_reconstructor.py | 104 +++++---------------- ctapipe/tools/train_energy_regressor.py | 81 +++------------- ctapipe/tools/train_particle_classifier.py | 94 +++++-------------- ctapipe/tools/utils.py | 89 ++++++++++++++++++ 4 files changed, 151 insertions(+), 217 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 6b3ad6d0314..715e42a3cf5 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -3,15 +3,14 @@ """ import astropy.units as u import numpy as np -from astropy.table import vstack -from ctapipe.containers import CoordinateFrameType from ctapipe.core import Tool from ctapipe.core.traits import Bool, Int, IntTelescopeParameter, Path -from ctapipe.exceptions import TooFewEvents from ctapipe.io import TableLoader from ctapipe.reco import CrossValidator, DispReconstructor -from ctapipe.reco.preprocessing import check_valid_rows, horizontal_to_telescope +from ctapipe.reco.preprocessing import horizontal_to_telescope + +from .utils import read_training_events __all__ = [ "TrainDispReconstructor", @@ -118,7 +117,28 @@ def start(self): self.log.info("Training models for %d types", len(types)) for tel_type in types: self.log.info("Loading events for %s", tel_type) - table = self._read_table(tel_type) + feature_names = self.models.features + [ + "true_energy", + "subarray_pointing_lat", + "subarray_pointing_lon", + "true_alt", + "true_az", + "hillas_fov_lat", + "hillas_fov_lon", + "hillas_psi", + ] + table = read_training_events( + self.loader, + self.chunk_size, + tel_type, + self.models, + feature_names, + self.log, + self.rng, + self.n_events.tel[tel_type], + ) + table[self.models.target] = self._get_true_disp(table) + table = table[self.models.features + [self.models.target, "true_energy"]] self.log.info("Train models on %s events", len(table)) self.cross_validate(tel_type, table) @@ -127,80 +147,6 @@ def start(self): self.models.fit(tel_type, table) self.log.info("done") - def _read_table(self, telescope_type): - chunk_iterator = self.loader.read_telescope_events_chunked( - self.chunk_size, - telescopes=[telescope_type], - ) - table = [] - n_events_in_file = 0 - n_valid_events_in_file = 0 - n_non_predictable = 0 - - for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): - self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) - n_events_in_file += len(table_chunk) - - mask = self.models.quality_query.get_table_mask(table_chunk) - table_chunk = table_chunk[mask] - self.log.debug( - "Events in chunk %d after applying quality_query: %d", - chunk, - len(table_chunk), - ) - n_valid_events_in_file += len(table_chunk) - - if not np.all( - table_chunk["subarray_pointing_frame"] - == CoordinateFrameType.ALTAZ.value - ): - raise ValueError( - "Pointing information for training data has to be provided in horizontal coordinates" - ) - - table_chunk = self.models.feature_generator( - table_chunk, subarray=self.loader.subarray - ) - table_chunk[self.models.target] = self._get_true_disp(table_chunk) - # Add true energy for energy-dependent performance plots - columns = self.models.features + [self.models.target, "true_energy"] - table_chunk = table_chunk[columns] - - valid = check_valid_rows(table_chunk) - if not np.all(valid): - n_non_predictable += np.sum(~valid) - table_chunk = table_chunk[valid] - - table.append(table_chunk) - - table = vstack(table) - self.log.info("Events read from input: %d", n_events_in_file) - self.log.info("Events after applying quality query: %d", n_valid_events_in_file) - - if len(table) == 0: - raise TooFewEvents( - f"No events after quality query for telescope type {telescope_type}" - ) - - if n_non_predictable > 0: - self.log.warning("Dropping %d non-predictable events.", n_non_predictable) - - n_events = self.n_events.tel[telescope_type] - if n_events is not None: - if n_events > len(table): - self.log.warning( - "Number of events in table (%d) is less than requested number of events %d", - len(table), - n_events, - ) - else: - self.log.info("Sampling %d events", n_events) - idx = self.rng.choice(len(table), n_events, replace=False) - idx.sort() - table = table[idx] - - return table - def _get_true_disp(self, table): fov_lon, fov_lat = horizontal_to_telescope( alt=table["true_alt"], diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 7fe7986b380..8aa9fd753da 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -2,14 +2,13 @@ Tool for training the EnergyRegressor """ import numpy as np -from astropy.table import vstack from ctapipe.core import Tool from ctapipe.core.traits import Int, IntTelescopeParameter, Path -from ctapipe.exceptions import TooFewEvents from ctapipe.io import TableLoader from ctapipe.reco import CrossValidator, EnergyRegressor -from ctapipe.reco.preprocessing import check_valid_rows + +from .utils import read_training_events __all__ = [ "TrainEnergyRegressor", @@ -111,7 +110,17 @@ def start(self): self.log.info("Training models for %d types", len(types)) for tel_type in types: self.log.info("Loading events for %s", tel_type) - table = self._read_table(tel_type) + feature_names = self.regressor.features + [self.regressor.target] + table = read_training_events( + self.loader, + self.chunk_size, + tel_type, + self.regressor, + feature_names, + self.log, + self.rng, + self.n_events.tel[tel_type], + ) self.log.info("Train on %s events", len(table)) self.cross_validate(tel_type, table) @@ -120,70 +129,6 @@ def start(self): self.regressor.fit(tel_type, table) self.log.info("done") - def _read_table(self, telescope_type): - chunk_iterator = self.loader.read_telescope_events_chunked( - self.chunk_size, - telescopes=[telescope_type], - ) - table = [] - n_events_in_file = 0 - n_valid_events_in_file = 0 - n_non_predictable = 0 - - for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): - self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) - n_events_in_file += len(table_chunk) - - mask = self.regressor.quality_query.get_table_mask(table_chunk) - table_chunk = table_chunk[mask] - self.log.debug( - "Events in chunk %d after applying quality_query: %d", - chunk, - len(table_chunk), - ) - n_valid_events_in_file += len(table_chunk) - - table_chunk = self.regressor.feature_generator( - table_chunk, subarray=self.loader.subarray - ) - feature_names = self.regressor.features + [self.regressor.target] - table_chunk = table_chunk[feature_names] - - valid = check_valid_rows(table_chunk) - if not np.all(valid): - n_non_predictable += np.sum(~valid) - table_chunk = table_chunk[valid] - - table.append(table_chunk) - - table = vstack(table) - self.log.info("Events read from input: %d", n_events_in_file) - self.log.info("Events after applying quality query: %d", n_valid_events_in_file) - - if len(table) == 0: - raise TooFewEvents( - f"No events after quality query for telescope type {telescope_type}" - ) - - if n_non_predictable > 0: - self.log.warning("Dropping %d non-predictable events.", n_non_predictable) - - n_events = self.n_events.tel[telescope_type] - if n_events is not None: - if n_events > len(table): - self.log.warning( - "Number of events in table (%d) is less than requested number of events %d", - len(table), - n_events, - ) - else: - self.log.info("Sampling %d events", n_events) - idx = self.rng.choice(len(table), n_events, replace=False) - idx.sort() - table = table[idx] - - return table - def finish(self): """ Write-out trained models and cross-validation results. diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 76865cd5366..aa56d8ec723 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -6,10 +6,10 @@ from ctapipe.core.tool import Tool from ctapipe.core.traits import Int, IntTelescopeParameter, Path -from ctapipe.exceptions import TooFewEvents from ctapipe.io import TableLoader from ctapipe.reco import CrossValidator, ParticleClassifier -from ctapipe.reco.preprocessing import check_valid_rows + +from .utils import read_training_events __all__ = [ "TrainParticleClassifier", @@ -170,76 +170,30 @@ def start(self): self.classifier.fit(tel_type, table) self.log.info("done") - def _read_table(self, telescope_type, loader, n_events=None): - chunk_iterator = loader.read_telescope_events_chunked( - self.chunk_size, - telescopes=[telescope_type], - ) - table = [] - n_events_in_file = 0 - n_valid_events_in_file = 0 - n_non_predictable = 0 - - for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): - self.log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) - n_events_in_file += len(table_chunk) - - mask = self.classifier.quality_query.get_table_mask(table_chunk) - table_chunk = table_chunk[mask] - self.log.debug( - "Events in chunk %d after applying quality_query: %d", - chunk, - len(table_chunk), - ) - n_valid_events_in_file += len(table_chunk) - - table_chunk = self.classifier.feature_generator( - table_chunk, subarray=self.subarray - ) - # Add true energy for energy-dependent performance plots - columns = self.classifier.features + [self.classifier.target, "true_energy"] - table_chunk = table_chunk[columns] - - valid = check_valid_rows(table_chunk) - if not np.all(valid): - n_non_predictable += np.sum(~valid) - table_chunk = table_chunk[valid] - - table.append(table_chunk) - - table = vstack(table) - self.log.info("Events read from input: %d", n_events_in_file) - self.log.info("Events after applying quality query: %d", n_valid_events_in_file) - - if len(table) == 0: - raise TooFewEvents( - f"No events after quality query for telescope type {telescope_type}" - ) - - if n_non_predictable > 0: - self.log.warning("Dropping %d non-predictable events.", n_non_predictable) - - if n_events is not None: - if n_events > len(table): - self.log.warning( - "Number of events in table (%d) is less than requested number of events %d", - len(table), - n_events, - ) - else: - self.log.info("Sampling %d events", n_events) - idx = self.rng.choice(len(table), n_events, replace=False) - idx.sort() - table = table[idx] - - return table - def _read_input_data(self, tel_type): - signal = self._read_table( - tel_type, self.signal_loader, self.n_signal.tel[tel_type] + feature_names = self.classifier.features + [ + self.classifier.target, + "true_energy", + ] + signal = read_training_events( + self.signal_loader, + self.chunk_size, + tel_type, + self.classifier, + feature_names, + self.log, + self.rng, + self.n_signal.tel[tel_type], ) - background = self._read_table( - tel_type, self.background_loader, self.n_background.tel[tel_type] + background = read_training_events( + self.background_loader, + self.chunk_size, + tel_type, + self.classifier, + feature_names, + self.log, + self.rng, + self.n_signal.tel[tel_type], ) table = vstack([signal, background]) self.log.info( diff --git a/ctapipe/tools/utils.py b/ctapipe/tools/utils.py index 131046fbc1c..b2bd0223953 100644 --- a/ctapipe/tools/utils.py +++ b/ctapipe/tools/utils.py @@ -5,6 +5,14 @@ import sys from collections import OrderedDict +import numpy as np +from astropy.table import vstack + +from ctapipe.containers import CoordinateFrameType +from ctapipe.exceptions import TooFewEvents +from ctapipe.reco.preprocessing import check_valid_rows +from ctapipe.reco.sklearn import DispReconstructor + if sys.version_info < (3, 10): from importlib_metadata import distribution else: @@ -71,3 +79,84 @@ def get_all_descriptions(): descriptions[name] = "[no documentation. Please add a docstring]" return descriptions + + +def read_training_events( + loader, + chunk_size, + telescope_type, + reconstructor, + feature_names, + logger, + rng, + n_events=None, +): + chunk_iterator = loader.read_telescope_events_chunked( + chunk_size, + telescopes=[telescope_type], + ) + table = [] + n_events_in_file = 0 + n_valid_events_in_file = 0 + n_non_predictable = 0 + + for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): + logger.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) + n_events_in_file += len(table_chunk) + + if isinstance(reconstructor, DispReconstructor): + if not np.all( + table_chunk["subarray_pointing_frame"] + == CoordinateFrameType.ALTAZ.value + ): + raise ValueError( + "Pointing information for training data has to be provided in horizontal coordinates" + ) + + mask = reconstructor.quality_query.get_table_mask(table_chunk) + table_chunk = table_chunk[mask] + logger.debug( + "Events in chunk %d after applying quality_query: %d", + chunk, + len(table_chunk), + ) + n_valid_events_in_file += len(table_chunk) + + table_chunk = reconstructor.feature_generator( + table_chunk, subarray=loader.subarray + ) + table_chunk = table_chunk[feature_names] + + valid = check_valid_rows(table_chunk) + if not np.all(valid): + n_non_predictable += np.sum(~valid) + table_chunk = table_chunk[valid] + + table.append(table_chunk) + + table = vstack(table) + logger.info("Events read from input: %d", n_events_in_file) + logger.info("Events after applying quality query: %d", n_valid_events_in_file) + + if len(table) == 0: + raise TooFewEvents( + f"No events after quality query for telescope type {telescope_type}" + ) + + if n_non_predictable > 0: + logger.warning("Dropping %d non-predictable events.", n_non_predictable) + + if n_events is not None: + if n_events > len(table): + logger.warning( + "Number of events in table (%d) is less than requested number of events %d", + len(table), + n_events, + ) + else: + logger.info("Sampling %d events", n_events) + idx = rng.choice(len(table), n_events, replace=False) + idx.sort() + table = table[idx] + + return table From a3891834a884db5b864b56491c4e099ce8d742fa Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 10 Nov 2023 12:20:59 +0100 Subject: [PATCH 231/264] Add docstring --- ctapipe/tools/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ctapipe/tools/utils.py b/ctapipe/tools/utils.py index b2bd0223953..be946e6be78 100644 --- a/ctapipe/tools/utils.py +++ b/ctapipe/tools/utils.py @@ -91,6 +91,7 @@ def read_training_events( rng, n_events=None, ): + """Chunked loading of events for training ML models""" chunk_iterator = loader.read_telescope_events_chunked( chunk_size, telescopes=[telescope_type], From b52be8427321e65cf30e5400ff484359b59d7de5 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 14 Nov 2023 10:23:40 +0100 Subject: [PATCH 232/264] Add type hints --- ctapipe/tools/utils.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ctapipe/tools/utils.py b/ctapipe/tools/utils.py index be946e6be78..379b6b0bde8 100644 --- a/ctapipe/tools/utils.py +++ b/ctapipe/tools/utils.py @@ -4,14 +4,18 @@ import importlib import sys from collections import OrderedDict +from logging import Logger import numpy as np from astropy.table import vstack from ctapipe.containers import CoordinateFrameType +from ctapipe.core.traits import Int from ctapipe.exceptions import TooFewEvents +from ctapipe.instrument.telescope import TelescopeDescription +from ctapipe.io import TableLoader from ctapipe.reco.preprocessing import check_valid_rows -from ctapipe.reco.sklearn import DispReconstructor +from ctapipe.reco.sklearn import DispReconstructor, SKLearnReconstructor if sys.version_info < (3, 10): from importlib_metadata import distribution @@ -82,13 +86,13 @@ def get_all_descriptions(): def read_training_events( - loader, - chunk_size, - telescope_type, - reconstructor, - feature_names, - logger, - rng, + loader: TableLoader, + chunk_size: Int, + telescope_type: TelescopeDescription, + reconstructor: SKLearnReconstructor, + feature_names: list, + logger: Logger, + rng: np.random.Generator, n_events=None, ): """Chunked loading of events for training ML models""" From f93e2459ce91c9211fae1043a3df5894b2a8bff7 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 14 Nov 2023 11:24:26 +0100 Subject: [PATCH 233/264] Use relative imports, default logger, and correct type hint --- ctapipe/tools/train_disp_reconstructor.py | 2 +- ctapipe/tools/train_energy_regressor.py | 2 +- ctapipe/tools/train_particle_classifier.py | 4 +- ctapipe/tools/utils.py | 43 ++++++++++++---------- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 715e42a3cf5..72a551e8597 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -133,8 +133,8 @@ def start(self): tel_type, self.models, feature_names, - self.log, self.rng, + self.log, self.n_events.tel[tel_type], ) table[self.models.target] = self._get_true_disp(table) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 8aa9fd753da..9db47e1161e 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -117,8 +117,8 @@ def start(self): tel_type, self.regressor, feature_names, - self.log, self.rng, + self.log, self.n_events.tel[tel_type], ) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index aa56d8ec723..59656d8441c 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -181,8 +181,8 @@ def _read_input_data(self, tel_type): tel_type, self.classifier, feature_names, - self.log, self.rng, + self.log, self.n_signal.tel[tel_type], ) background = read_training_events( @@ -191,8 +191,8 @@ def _read_input_data(self, tel_type): tel_type, self.classifier, feature_names, - self.log, self.rng, + self.log, self.n_signal.tel[tel_type], ) table = vstack([signal, background]) diff --git a/ctapipe/tools/utils.py b/ctapipe/tools/utils.py index 379b6b0bde8..9e7c76eb837 100644 --- a/ctapipe/tools/utils.py +++ b/ctapipe/tools/utils.py @@ -2,20 +2,23 @@ """Utils to create scripts and command-line tools""" import argparse import importlib +import logging import sys from collections import OrderedDict -from logging import Logger +from typing import Type import numpy as np from astropy.table import vstack -from ctapipe.containers import CoordinateFrameType -from ctapipe.core.traits import Int -from ctapipe.exceptions import TooFewEvents -from ctapipe.instrument.telescope import TelescopeDescription -from ctapipe.io import TableLoader -from ctapipe.reco.preprocessing import check_valid_rows -from ctapipe.reco.sklearn import DispReconstructor, SKLearnReconstructor +from ..containers import CoordinateFrameType +from ..core.traits import Int +from ..exceptions import TooFewEvents +from ..instrument.telescope import TelescopeDescription +from ..io import TableLoader +from ..reco.preprocessing import check_valid_rows +from ..reco.sklearn import DispReconstructor, SKLearnReconstructor + +LOG = logging.getLogger(__name__) if sys.version_info < (3, 10): from importlib_metadata import distribution @@ -89,10 +92,10 @@ def read_training_events( loader: TableLoader, chunk_size: Int, telescope_type: TelescopeDescription, - reconstructor: SKLearnReconstructor, + reconstructor: Type[SKLearnReconstructor], feature_names: list, - logger: Logger, rng: np.random.Generator, + log=LOG, n_events=None, ): """Chunked loading of events for training ML models""" @@ -106,7 +109,7 @@ def read_training_events( n_non_predictable = 0 for chunk, (_, _, table_chunk) in enumerate(chunk_iterator): - logger.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) + log.debug("Events read from chunk %d: %d", chunk, len(table_chunk)) n_events_in_file += len(table_chunk) if isinstance(reconstructor, DispReconstructor): @@ -115,12 +118,13 @@ def read_training_events( == CoordinateFrameType.ALTAZ.value ): raise ValueError( - "Pointing information for training data has to be provided in horizontal coordinates" + "Pointing information for training data" + " has to be provided in horizontal coordinates" ) mask = reconstructor.quality_query.get_table_mask(table_chunk) table_chunk = table_chunk[mask] - logger.debug( + log.debug( "Events in chunk %d after applying quality_query: %d", chunk, len(table_chunk), @@ -140,8 +144,8 @@ def read_training_events( table.append(table_chunk) table = vstack(table) - logger.info("Events read from input: %d", n_events_in_file) - logger.info("Events after applying quality query: %d", n_valid_events_in_file) + log.info("Events read from input: %d", n_events_in_file) + log.info("Events after applying quality query: %d", n_valid_events_in_file) if len(table) == 0: raise TooFewEvents( @@ -149,17 +153,18 @@ def read_training_events( ) if n_non_predictable > 0: - logger.warning("Dropping %d non-predictable events.", n_non_predictable) + log.warning("Dropping %d non-predictable events.", n_non_predictable) if n_events is not None: if n_events > len(table): - logger.warning( - "Number of events in table (%d) is less than requested number of events %d", + log.warning( + "Number of events in table (%d) is less" + " than requested number of events %d", len(table), n_events, ) else: - logger.info("Sampling %d events", n_events) + log.info("Sampling %d events", n_events) idx = rng.choice(len(table), n_events, replace=False) idx.sort() table = table[idx] From b61576e2ac2104880355f4590e1b236d98d2b999 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 14 Nov 2023 12:15:23 +0100 Subject: [PATCH 234/264] Use keyword arguments --- ctapipe/tools/train_disp_reconstructor.py | 16 +++++------ ctapipe/tools/train_energy_regressor.py | 16 +++++------ ctapipe/tools/train_particle_classifier.py | 32 +++++++++++----------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 72a551e8597..a188b4260d0 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -128,14 +128,14 @@ def start(self): "hillas_psi", ] table = read_training_events( - self.loader, - self.chunk_size, - tel_type, - self.models, - feature_names, - self.rng, - self.log, - self.n_events.tel[tel_type], + loader=self.loader, + chunk_size=self.chunk_size, + telescope_type=tel_type, + reconstructor=self.models, + feature_names=feature_names, + rng=self.rng, + log=self.log, + n_events=self.n_events.tel[tel_type], ) table[self.models.target] = self._get_true_disp(table) table = table[self.models.features + [self.models.target, "true_energy"]] diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 9db47e1161e..2c9d411f594 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -112,14 +112,14 @@ def start(self): self.log.info("Loading events for %s", tel_type) feature_names = self.regressor.features + [self.regressor.target] table = read_training_events( - self.loader, - self.chunk_size, - tel_type, - self.regressor, - feature_names, - self.rng, - self.log, - self.n_events.tel[tel_type], + loader=self.loader, + chunk_size=self.chunk_size, + telescope_type=tel_type, + reconstructor=self.regressor, + feature_names=feature_names, + rng=self.rng, + log=self.log, + n_events=self.n_events.tel[tel_type], ) self.log.info("Train on %s events", len(table)) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 59656d8441c..90324b5d5b8 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -176,24 +176,24 @@ def _read_input_data(self, tel_type): "true_energy", ] signal = read_training_events( - self.signal_loader, - self.chunk_size, - tel_type, - self.classifier, - feature_names, - self.rng, - self.log, - self.n_signal.tel[tel_type], + loader=self.signal_loader, + chunk_size=self.chunk_size, + telescope_type=tel_type, + reconstructor=self.classifier, + feature_names=feature_names, + rng=self.rng, + log=self.log, + n_events=self.n_signal.tel[tel_type], ) background = read_training_events( - self.background_loader, - self.chunk_size, - tel_type, - self.classifier, - feature_names, - self.rng, - self.log, - self.n_signal.tel[tel_type], + loader=self.background_loader, + chunk_size=self.chunk_size, + telescope_type=tel_type, + reconstructor=self.classifier, + feature_names=feature_names, + rng=self.rng, + log=self.log, + n_events=self.n_signal.tel[tel_type], ) table = vstack([signal, background]) self.log.info( From bb01357995f58fc742ead3162eb2e1e10f98e087 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 14 Nov 2023 14:08:59 +0100 Subject: [PATCH 235/264] Use n_background for background events --- ctapipe/tools/train_particle_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 90324b5d5b8..70c53b63419 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -193,7 +193,7 @@ def _read_input_data(self, tel_type): feature_names=feature_names, rng=self.rng, log=self.log, - n_events=self.n_signal.tel[tel_type], + n_events=self.n_background.tel[tel_type], ) table = vstack([signal, background]) self.log.info( From 5337fe37f63a88fa1a581c1b4c676ebb00cd9027 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 10 Nov 2023 17:18:53 +0100 Subject: [PATCH 236/264] Add comments to ml config files --- .../resources/train_disp_reconstructor.yaml | 56 ++++++++++++------ ctapipe/resources/train_energy_regressor.yaml | 59 +++++++++++-------- .../resources/train_particle_classifier.yaml | 53 ++++++++++++----- 3 files changed, 110 insertions(+), 58 deletions(-) diff --git a/ctapipe/resources/train_disp_reconstructor.yaml b/ctapipe/resources/train_disp_reconstructor.yaml index de10603bbc9..f5b441dfe82 100644 --- a/ctapipe/resources/train_disp_reconstructor.yaml +++ b/ctapipe/resources/train_disp_reconstructor.yaml @@ -4,25 +4,50 @@ # # Configuration for training machine-learning models # ====================================================================== + TrainDispReconstructor: + random_seed: 0 # Seed used for sampling n_events for training + n_events: # The number of events used for training that can be provided + - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). + - [type, "MST*", None] # If none, all events in the file are used + CrossValidator: n_cross_validations: 5 + rng_seed: 1337 DispReconstructor: - norm_cls: ExtraTreesRegressor - norm_config: + prefix: disp # Prefix of the output generated by the DispReconstructor (Default: "disp") + + # All regression algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) + norm_cls: ExtraTreesRegressor # scikit-learn algorithm to be used for the norm(disp) models + norm_config: # Settings passed to the scikit-learn algorithm n_estimators: 10 max_depth: 10 n_jobs: -1 - log_target: True + log_target: True # If true, norm(disp) models predict log(norm(disp)) (output = exp(prediciton)) - sign_cls: ExtraTreesClassifier - sign_config: + # All classification algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) + sign_cls: ExtraTreesClassifier # scikit-learn algorithm to be used for the sign(disp) models + sign_config: # Settings passed to the scikit-learn algorithm n_estimators: 10 max_depth: 10 n_jobs: -1 + QualityQuery: # Event Selection performed before training the models + quality_criteria: + # - [, ] + - ["HillasValid", "HillasReconstructor_is_valid"] + - ["enough intensity", "hillas_intensity > 50"] + - ["Positive width", "hillas_width > 0"] + - ["enough pixels", "morphology_n_pixels > 3"] + - ["not clipped", "leakage_intensity_width_2 < 0.5"] + + FeatureGenerator: # On-the-fly generation of additional features + features: # Supported functions: "sin", "cos", "tan", "arctan2", "log", "log10", "exp", "sqrt" + # - [, ] + - ["area", "hillas_width * hillas_length"] + features: - hillas_intensity - hillas_r @@ -51,18 +76,13 @@ TrainDispReconstructor: - intensity_std - intensity_skewness - intensity_kurtosis - - area - - ExtraTreesRegressor_energy - - ExtraTreesRegressor_tel_energy + - ExtraTreesRegressor_energy # Mean predicted energy of the array event + - ExtraTreesRegressor_tel_energy # Energy prediction for single telescope image + - area # Features generated by the FeatureGenerator + # still have to be listed here for the models + # to use them. - QualityQuery: - quality_criteria: - - ["HillasValid", "HillasReconstructor_is_valid"] - - ["enough intensity", "hillas_intensity > 50"] - - ["Positive width", "hillas_width > 0"] - - ["enough pixels", "morphology_n_pixels > 3"] - - ["not clipped", "leakage_intensity_width_2 < 0.5"] + stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. + StereoMeanCombiner: + weights: None # Options: None, intensity, konrad - FeatureGenerator: - features: - - ["area", "hillas_width * hillas_length"] \ No newline at end of file diff --git a/ctapipe/resources/train_energy_regressor.yaml b/ctapipe/resources/train_energy_regressor.yaml index d713e26bba0..579b2b97191 100644 --- a/ctapipe/resources/train_energy_regressor.yaml +++ b/ctapipe/resources/train_energy_regressor.yaml @@ -6,18 +6,43 @@ # ====================================================================== TrainEnergyRegressor: + random_seed: 0 # Seed used for sampling n_events for training + n_events: # The number of events used for training that can be provided + - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). + - [type, "MST*", None] # If none, all events in the file are used + CrossValidator: n_cross_validations: 5 + rng_seed: 1337 EnergyRegressor: - model_cls: ExtraTreesRegressor - log_target: True + prefix: ExtraTreesRegressor # Prefix of the output generated by the EnergyRegressor + # (Default: Name of the used scikit-learn algorithm). + log_target: True # If true, models predict log(energy) (output = exp(prediciton)) - model_config: + # All regression algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) + model_cls: ExtraTreesRegressor # scikit-learn algorithm to be used for the models + model_config: # Settings passed to the scikit-learn algorithm n_estimators: 10 max_depth: 10 n_jobs: -1 + QualityQuery: # Event Selection performed before training the models + quality_criteria: + # - [, ] + - ["HillasValid", "HillasReconstructor_is_valid"] + - ["enough intensity", "hillas_intensity > 50"] + - ["Positive width", "hillas_width > 0"] + - ["enough pixels", "morphology_n_pixels > 3"] + - ["not clipped", "leakage_intensity_width_2 < 0.5"] + + FeatureGenerator: # On-the-fly generation of additional features + features: # Supported functions: "sin", "cos", "tan", "arctan2", "log", "log10", "exp", "sqrt" + # - [, ] + - ["area", "hillas_width * hillas_length"] + - ["n_telescopes_triggered", "subarray.multiplicity(tels_with_trigger)"] + - ["n_telescopes_hillas_reconstructor", "subarray.multiplicity(HillasReconstructor_telescopes)"] + features: - hillas_intensity - hillas_r @@ -49,28 +74,12 @@ TrainEnergyRegressor: - intensity_std - intensity_skewness - intensity_kurtosis - - area - - n_telescopes_triggered - - n_telescopes_hillas_reconstructor + - area # Features generated by the FeatureGenerator + - n_telescopes_triggered # still have to be listed here for the models + - n_telescopes_hillas_reconstructor # to use them. - stereo_combiner_cls: "StereoMeanCombiner" + stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. StereoMeanCombiner: - log_target: true - - QualityQuery: - quality_criteria: - - ["HillasValid", "HillasReconstructor_is_valid"] - - ["enough intensity", "hillas_intensity > 50"] - - ["Positive width", "hillas_width > 0"] - - ["enough pixels", "morphology_n_pixels > 3"] - - ["not clipped", "leakage_intensity_width_2 < 0.5"] - - FeatureGenerator: - features: - - ["area", "hillas_width * hillas_length"] - - ["n_telescopes_triggered", "subarray.multiplicity(tels_with_trigger)"] - - ["n_telescopes_hillas_reconstructor", "subarray.multiplicity(HillasReconstructor_telescopes)"] - - - + weights: None # Options: None, intensity, konrad + log_target: true # If true, calculate exp(mean(log(values))) diff --git a/ctapipe/resources/train_particle_classifier.yaml b/ctapipe/resources/train_particle_classifier.yaml index a7ef64ec98f..dd8061519bc 100644 --- a/ctapipe/resources/train_particle_classifier.yaml +++ b/ctapipe/resources/train_particle_classifier.yaml @@ -4,16 +4,44 @@ # # Configuration for training machine-learning models # ====================================================================== + TrainParticleClassifier: + random_seed: 0 # Seed used for sampling n_* events for training + n_signal: # The number of signal events used for training that can be provided + - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). + - [type, "MST*", None] # If none, all events in the file are used + n_background: # Same as above, but for background events. + - [type, "LST*", None] + - [type, "MST*", None] + CrossValidator: n_cross_validations: 5 + rng_seed: 1337 ParticleClassifier: - model_cls: ExtraTreesClassifier - model_config: + prefix: ExtraTreesClassifier # Prefix of the output generated by the ParticleClassifier + # (Default: Name of the used scikit-learn algorithm). + + # All classification algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) + model_cls: ExtraTreesClassifier # scikit-learn algorithm to be used for the models + model_config: # Settings passed to the scikit-learn algorithm n_estimators: 10 max_depth: 10 n_jobs: -1 + + QualityQuery: # Event Selection performed before training the models + quality_criteria: + # - [, ] + - ["HillasValid", "HillasReconstructor_is_valid"] + - ["enough intensity", "hillas_intensity > 50"] + - ["Positive width", "hillas_width > 0"] + - ["enough pixels", "morphology_n_pixels > 3"] + - ["not clipped", "leakage_intensity_width_2 < 0.5"] + + FeatureGenerator: # On-the-fly generation of additional features + features: # Supported functions: "sin", "cos", "tan", "arctan2", "log", "log10", "exp", "sqrt" + # - [, ] + - ["area", "hillas_width * hillas_length"] features: - hillas_intensity @@ -46,18 +74,13 @@ TrainParticleClassifier: - intensity_std - intensity_skewness - intensity_kurtosis - - area - - ExtraTreesRegressor_energy - - ExtraTreesRegressor_tel_energy + - ExtraTreesRegressor_energy # Mean predicted energy of the array event + - ExtraTreesRegressor_tel_energy # Energy prediction for single telescope image + - area # Features generated by the FeatureGenerator + # still have to be listed here for the models + # to use them. - QualityQuery: - quality_criteria: - - ["HillasValid", "HillasReconstructor_is_valid"] - - ["enough intensity", "hillas_intensity > 50"] - - ["Positive width", "hillas_width > 0"] - - ["enough pixels", "morphology_n_pixels > 3"] - - ["not clipped", "leakage_intensity_width_2 < 0.5"] + stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. + StereoMeanCombiner: + weights: None # Options: None, intensity, konrad - FeatureGenerator: - features: - - ["area", "hillas_width * hillas_length"] From 0738ea948b7b312ec5435263420b87eb308c3da6 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 13 Nov 2023 11:00:53 +0100 Subject: [PATCH 237/264] Minor changes and changelog --- ctapipe/resources/train_disp_reconstructor.yaml | 9 ++++----- ctapipe/resources/train_energy_regressor.yaml | 6 +++--- ctapipe/resources/train_particle_classifier.yaml | 9 ++++----- docs/changes/2455.optimization.rst | 1 + 4 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 docs/changes/2455.optimization.rst diff --git a/ctapipe/resources/train_disp_reconstructor.yaml b/ctapipe/resources/train_disp_reconstructor.yaml index f5b441dfe82..6a32983d1fc 100644 --- a/ctapipe/resources/train_disp_reconstructor.yaml +++ b/ctapipe/resources/train_disp_reconstructor.yaml @@ -6,10 +6,10 @@ # ====================================================================== TrainDispReconstructor: - random_seed: 0 # Seed used for sampling n_events for training + random_seed: 0 # Seed used for sampling n_events for training. n_events: # The number of events used for training that can be provided - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). - - [type, "MST*", None] # If none, all events in the file are used + - [type, "MST*", None] # If none, all events in the file are used. CrossValidator: n_cross_validations: 5 @@ -78,9 +78,8 @@ TrainDispReconstructor: - intensity_kurtosis - ExtraTreesRegressor_energy # Mean predicted energy of the array event - ExtraTreesRegressor_tel_energy # Energy prediction for single telescope image - - area # Features generated by the FeatureGenerator - # still have to be listed here for the models - # to use them. + - area # Features generated by the FeatureGenerator still have to be listed here + # for the models to use them. stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. StereoMeanCombiner: diff --git a/ctapipe/resources/train_energy_regressor.yaml b/ctapipe/resources/train_energy_regressor.yaml index 579b2b97191..2ce2c1efa12 100644 --- a/ctapipe/resources/train_energy_regressor.yaml +++ b/ctapipe/resources/train_energy_regressor.yaml @@ -6,10 +6,10 @@ # ====================================================================== TrainEnergyRegressor: - random_seed: 0 # Seed used for sampling n_events for training + random_seed: 0 # Seed used for sampling n_events for training. n_events: # The number of events used for training that can be provided - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). - - [type, "MST*", None] # If none, all events in the file are used + - [type, "MST*", None] # If none, all events in the file are used. CrossValidator: n_cross_validations: 5 @@ -18,7 +18,7 @@ TrainEnergyRegressor: EnergyRegressor: prefix: ExtraTreesRegressor # Prefix of the output generated by the EnergyRegressor # (Default: Name of the used scikit-learn algorithm). - log_target: True # If true, models predict log(energy) (output = exp(prediciton)) + log_target: True # If true, models predict log(energy) (output = exp(prediciton)). # All regression algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) model_cls: ExtraTreesRegressor # scikit-learn algorithm to be used for the models diff --git a/ctapipe/resources/train_particle_classifier.yaml b/ctapipe/resources/train_particle_classifier.yaml index dd8061519bc..b0656aa1c73 100644 --- a/ctapipe/resources/train_particle_classifier.yaml +++ b/ctapipe/resources/train_particle_classifier.yaml @@ -6,10 +6,10 @@ # ====================================================================== TrainParticleClassifier: - random_seed: 0 # Seed used for sampling n_* events for training + random_seed: 0 # Seed used for sampling n_* events for training. n_signal: # The number of signal events used for training that can be provided - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). - - [type, "MST*", None] # If none, all events in the file are used + - [type, "MST*", None] # If none, all events in the file are used. n_background: # Same as above, but for background events. - [type, "LST*", None] - [type, "MST*", None] @@ -76,9 +76,8 @@ TrainParticleClassifier: - intensity_kurtosis - ExtraTreesRegressor_energy # Mean predicted energy of the array event - ExtraTreesRegressor_tel_energy # Energy prediction for single telescope image - - area # Features generated by the FeatureGenerator - # still have to be listed here for the models - # to use them. + - area # Features generated by the FeatureGenerator still have to be listed here + # for the models to use them. stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. StereoMeanCombiner: diff --git a/docs/changes/2455.optimization.rst b/docs/changes/2455.optimization.rst new file mode 100644 index 00000000000..357575d400f --- /dev/null +++ b/docs/changes/2455.optimization.rst @@ -0,0 +1 @@ +Make default ML config files more readable and add comments. From b586dab84ccd0678c6dd1b6b0b2b6bdd274c3873 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Tue, 14 Nov 2023 10:03:10 +0100 Subject: [PATCH 238/264] Give working example for n_events, but use all events by default --- ctapipe/resources/train_disp_reconstructor.yaml | 8 ++++---- ctapipe/resources/train_energy_regressor.yaml | 8 ++++---- ctapipe/resources/train_particle_classifier.yaml | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ctapipe/resources/train_disp_reconstructor.yaml b/ctapipe/resources/train_disp_reconstructor.yaml index 6a32983d1fc..8e305f73094 100644 --- a/ctapipe/resources/train_disp_reconstructor.yaml +++ b/ctapipe/resources/train_disp_reconstructor.yaml @@ -6,10 +6,10 @@ # ====================================================================== TrainDispReconstructor: - random_seed: 0 # Seed used for sampling n_events for training. - n_events: # The number of events used for training that can be provided - - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). - - [type, "MST*", None] # If none, all events in the file are used. + random_seed: 0 # Seed used for sampling n_events for training. + n_events: # The number of events used for training that can be provided + # - [type, "LST*", 1000] # independently for each telescope type (e.g. "LST_LST_LSTCam"). + # - [type, "MST*", 1000] # If not specified, all events in the file are used. CrossValidator: n_cross_validations: 5 diff --git a/ctapipe/resources/train_energy_regressor.yaml b/ctapipe/resources/train_energy_regressor.yaml index 2ce2c1efa12..5a6658957c0 100644 --- a/ctapipe/resources/train_energy_regressor.yaml +++ b/ctapipe/resources/train_energy_regressor.yaml @@ -6,10 +6,10 @@ # ====================================================================== TrainEnergyRegressor: - random_seed: 0 # Seed used for sampling n_events for training. - n_events: # The number of events used for training that can be provided - - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). - - [type, "MST*", None] # If none, all events in the file are used. + random_seed: 0 # Seed used for sampling n_events for training. + n_events: # The number of events used for training that can be provided + # - [type, "LST*", 1000] # independently for each telescope type (e.g. "LST_LST_LSTCam"). + # - [type, "MST*", 1000] # If not specified, all events in the file are used. CrossValidator: n_cross_validations: 5 diff --git a/ctapipe/resources/train_particle_classifier.yaml b/ctapipe/resources/train_particle_classifier.yaml index b0656aa1c73..687cc4434f9 100644 --- a/ctapipe/resources/train_particle_classifier.yaml +++ b/ctapipe/resources/train_particle_classifier.yaml @@ -6,13 +6,13 @@ # ====================================================================== TrainParticleClassifier: - random_seed: 0 # Seed used for sampling n_* events for training. - n_signal: # The number of signal events used for training that can be provided - - [type, "LST*", None] # independently for each telescope type (e.g. "LST_LST_LSTCam"). - - [type, "MST*", None] # If none, all events in the file are used. - n_background: # Same as above, but for background events. - - [type, "LST*", None] - - [type, "MST*", None] + random_seed: 0 # Seed used for sampling n_* events for training. + n_signal: # The number of signal events used for training that can be provided + # - [type, "LST*", 1000] # independently for each telescope type (e.g. "LST_LST_LSTCam"). + # - [type, "MST*", 1000] # If not specified, all events in the file are used. + n_background: # Same as above, but for background events. + # - [type, "LST*", 1000] + # - [type, "MST*", 1000] CrossValidator: n_cross_validations: 5 From 496beb60d28fdcfc8b0b20814e83ea6b0e29533b Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Wed, 15 Nov 2023 14:04:40 +0100 Subject: [PATCH 239/264] Better explanation of log_target --- ctapipe/resources/train_disp_reconstructor.yaml | 3 ++- ctapipe/resources/train_energy_regressor.yaml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ctapipe/resources/train_disp_reconstructor.yaml b/ctapipe/resources/train_disp_reconstructor.yaml index 8e305f73094..f13ecf24f83 100644 --- a/ctapipe/resources/train_disp_reconstructor.yaml +++ b/ctapipe/resources/train_disp_reconstructor.yaml @@ -25,7 +25,8 @@ TrainDispReconstructor: max_depth: 10 n_jobs: -1 - log_target: True # If true, norm(disp) models predict log(norm(disp)) (output = exp(prediciton)) + log_target: True # If true, norm(disp) models predict log(norm(disp)) and the output is + # prefix_parameter = sign_prediction * exp(norm_prediction) # All classification algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) sign_cls: ExtraTreesClassifier # scikit-learn algorithm to be used for the sign(disp) models diff --git a/ctapipe/resources/train_energy_regressor.yaml b/ctapipe/resources/train_energy_regressor.yaml index 5a6658957c0..8a0f7458345 100644 --- a/ctapipe/resources/train_energy_regressor.yaml +++ b/ctapipe/resources/train_energy_regressor.yaml @@ -18,7 +18,8 @@ TrainEnergyRegressor: EnergyRegressor: prefix: ExtraTreesRegressor # Prefix of the output generated by the EnergyRegressor # (Default: Name of the used scikit-learn algorithm). - log_target: True # If true, models predict log(energy) (output = exp(prediciton)). + log_target: True # If true, models predict log(energy) and the output is + # prefix_energy = exp(model_prediction). # All regression algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) model_cls: ExtraTreesRegressor # scikit-learn algorithm to be used for the models From 279614fa61ef140c079ae7d858a87ec7b66f12b0 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Mon, 6 Nov 2023 14:09:08 +0100 Subject: [PATCH 240/264] Enable str/Path as input to get_hdf5_datalevels --- ctapipe/io/hdf5eventsource.py | 29 +++++++++++++++++------------ ctapipe/io/tests/test_hdf5.py | 20 ++++++++++++++++++++ docs/changes/2451.feature.rst | 2 ++ 3 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 docs/changes/2451.feature.rst diff --git a/ctapipe/io/hdf5eventsource.py b/ctapipe/io/hdf5eventsource.py index 9b7e533d06e..455578b55d1 100644 --- a/ctapipe/io/hdf5eventsource.py +++ b/ctapipe/io/hdf5eventsource.py @@ -1,7 +1,8 @@ import logging +from contextlib import ExitStack from functools import lru_cache from pathlib import Path -from typing import Dict +from typing import Dict, Union import astropy.units as u import numpy as np @@ -76,24 +77,28 @@ ] -def get_hdf5_datalevels(h5file): +def get_hdf5_datalevels(h5file: Union[tables.File, str, Path]): """Get the data levels present in the hdf5 file""" datalevels = [] - if "/r1/event/telescope" in h5file.root: - datalevels.append(DataLevel.R1) + with ExitStack() as stack: + if not isinstance(h5file, tables.File): + h5file = stack.enter_context(tables.open_file(h5file)) - if "/dl1/event/telescope/images" in h5file.root: - datalevels.append(DataLevel.DL1_IMAGES) + if "/r1/event/telescope" in h5file.root: + datalevels.append(DataLevel.R1) - if "/dl1/event/telescope/parameters" in h5file.root: - datalevels.append(DataLevel.DL1_PARAMETERS) + if "/dl1/event/telescope/images" in h5file.root: + datalevels.append(DataLevel.DL1_IMAGES) - if "/dl1/event/telescope/muon" in h5file.root: - datalevels.append(DataLevel.DL1_MUON) + if "/dl1/event/telescope/parameters" in h5file.root: + datalevels.append(DataLevel.DL1_PARAMETERS) - if "/dl2" in h5file.root: - datalevels.append(DataLevel.DL2) + if "/dl1/event/telescope/muon" in h5file.root: + datalevels.append(DataLevel.DL1_MUON) + + if "/dl2" in h5file.root: + datalevels.append(DataLevel.DL2) return tuple(datalevels) diff --git a/ctapipe/io/tests/test_hdf5.py b/ctapipe/io/tests/test_hdf5.py index 75f8a19b206..1f6f10a5511 100644 --- a/ctapipe/io/tests/test_hdf5.py +++ b/ctapipe/io/tests/test_hdf5.py @@ -1,4 +1,5 @@ import enum +from pathlib import Path import numpy as np import pandas as pd @@ -17,6 +18,7 @@ ) from ctapipe.core.container import Container, Field from ctapipe.io import read_table +from ctapipe.io.datalevels import DataLevel from ctapipe.io.hdf5tableio import HDF5TableReader, HDF5TableWriter @@ -1014,3 +1016,21 @@ class Container1(Container): assert c1.prefix == "bar" assert c2.value == value assert c2.prefix == "foo" + + +@pytest.mark.parametrize("input_type", (str, Path, tables.File)) +def test_hdf5_datalevels(input_type, dl2_shower_geometry_file): + from ctapipe.io import get_hdf5_datalevels + + if input_type is tables.File: + with tables.open_file(dl2_shower_geometry_file) as h5file: + datalevels = get_hdf5_datalevels(h5file) + else: + path = input_type(dl2_shower_geometry_file) + datalevels = get_hdf5_datalevels(path) + + assert set(datalevels) == { + DataLevel.DL1_IMAGES, + DataLevel.DL1_PARAMETERS, + DataLevel.DL2, + } diff --git a/docs/changes/2451.feature.rst b/docs/changes/2451.feature.rst new file mode 100644 index 00000000000..6aa123a7002 --- /dev/null +++ b/docs/changes/2451.feature.rst @@ -0,0 +1,2 @@ +Add support for using ``str`` and ``Path`` objects as input +to ``ctapipe.io.get_hdf5_datalevels``. From 41b9fb4233fd6278be9b00fcdae0e6f6193f1add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6se?= Date: Fri, 27 Oct 2023 21:57:01 +0200 Subject: [PATCH 241/264] Manually include already published changelog entry. --- CHANGES.rst | 2 ++ docs/changes/2388.bug.rst | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 docs/changes/2388.bug.rst diff --git a/CHANGES.rst b/CHANGES.rst index eab102af3b5..0368fb9ca02 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -46,6 +46,8 @@ Bug Fixes - The ```HillasIntersection``` method used to fail when individual events were reconstructed to originate from a FoV offset of more than 90 degrees. This is now fixed by returning an INVALID container for a reconstructed offset of larger than 45 degrees. [`#2265 `__] +- Fixed a bug in the calculation of the full numeric pixel likelihood and the corresponding tests. [`#2388 `__] + Maintenance ----------- diff --git a/docs/changes/2388.bug.rst b/docs/changes/2388.bug.rst deleted file mode 100644 index 0d7d716c1aa..00000000000 --- a/docs/changes/2388.bug.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a bug in the calculation of the full numeric pixel likelihood and the corresponding tests. \ No newline at end of file From f5e6c5e54c6e6b4611bd6b599bd7efb9c29194c1 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 17 Nov 2023 12:39:41 +0100 Subject: [PATCH 242/264] Use editable install to fix coverage --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a1d62d175a..e3e5be5d089 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,7 +117,7 @@ jobs: run: | python --version | grep "Python ${PYTHON_VERSION}" pip install pytest-cov pytest-xdist 'coverage!=6.3.0' - pip install .[all] + pip install -e .[all] pip install ./test_plugin pip freeze From 933c22ec4ebe34241ef0034b704e5840a1044883 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Fri, 17 Nov 2023 12:53:15 +0100 Subject: [PATCH 243/264] Do not duplicate docs in config files --- .../resources/train_disp_reconstructor.yaml | 28 ++++++++++--------- ctapipe/resources/train_energy_regressor.yaml | 24 ++++++++-------- .../resources/train_particle_classifier.yaml | 19 +++++++------ 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/ctapipe/resources/train_disp_reconstructor.yaml b/ctapipe/resources/train_disp_reconstructor.yaml index f13ecf24f83..499c068491b 100644 --- a/ctapipe/resources/train_disp_reconstructor.yaml +++ b/ctapipe/resources/train_disp_reconstructor.yaml @@ -16,21 +16,23 @@ TrainDispReconstructor: rng_seed: 1337 DispReconstructor: - prefix: disp # Prefix of the output generated by the DispReconstructor (Default: "disp") + # prefix: # Add a prefix of the output here, if you want to apply multiple + # DispReconstructors on the same file (e.g. for comparing different settings) - # All regression algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) - norm_cls: ExtraTreesRegressor # scikit-learn algorithm to be used for the norm(disp) models - norm_config: # Settings passed to the scikit-learn algorithm + # All regression algorithms in scikit-learn are supported + # (https://scikit-learn.org/stable/modules/classes.html) + norm_cls: ExtraTreesRegressor + norm_config: n_estimators: 10 max_depth: 10 n_jobs: -1 - log_target: True # If true, norm(disp) models predict log(norm(disp)) and the output is - # prefix_parameter = sign_prediction * exp(norm_prediction) + log_target: True - # All classification algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) - sign_cls: ExtraTreesClassifier # scikit-learn algorithm to be used for the sign(disp) models - sign_config: # Settings passed to the scikit-learn algorithm + # All classification algorithms in scikit-learn are supported + # (https://scikit-learn.org/stable/modules/classes.html) + sign_cls: ExtraTreesClassifier + sign_config: n_estimators: 10 max_depth: 10 n_jobs: -1 @@ -45,7 +47,7 @@ TrainDispReconstructor: - ["not clipped", "leakage_intensity_width_2 < 0.5"] FeatureGenerator: # On-the-fly generation of additional features - features: # Supported functions: "sin", "cos", "tan", "arctan2", "log", "log10", "exp", "sqrt" + features: # - [, ] - ["area", "hillas_width * hillas_length"] @@ -82,7 +84,7 @@ TrainDispReconstructor: - area # Features generated by the FeatureGenerator still have to be listed here # for the models to use them. - stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. - StereoMeanCombiner: - weights: None # Options: None, intensity, konrad + # stereo_combiner_cls: "StereoMeanCombiner" + # StereoMeanCombiner: # Here you can set options for StereoMeanCombiner + # weights: # (e.g. which kind of weights to use). diff --git a/ctapipe/resources/train_energy_regressor.yaml b/ctapipe/resources/train_energy_regressor.yaml index 8a0f7458345..a2ecdcfa9c2 100644 --- a/ctapipe/resources/train_energy_regressor.yaml +++ b/ctapipe/resources/train_energy_regressor.yaml @@ -16,14 +16,15 @@ TrainEnergyRegressor: rng_seed: 1337 EnergyRegressor: - prefix: ExtraTreesRegressor # Prefix of the output generated by the EnergyRegressor - # (Default: Name of the used scikit-learn algorithm). - log_target: True # If true, models predict log(energy) and the output is - # prefix_energy = exp(model_prediction). + # prefix: # Add a prefix of the output here, if you want to apply multiple + # EnergyRegressors on the same file (e.g. for comparing different settings) - # All regression algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) - model_cls: ExtraTreesRegressor # scikit-learn algorithm to be used for the models - model_config: # Settings passed to the scikit-learn algorithm + log_target: True + + # All regression algorithms in scikit-learn are supported + # (https://scikit-learn.org/stable/modules/classes.html) + model_cls: ExtraTreesRegressor + model_config: n_estimators: 10 max_depth: 10 n_jobs: -1 @@ -38,7 +39,7 @@ TrainEnergyRegressor: - ["not clipped", "leakage_intensity_width_2 < 0.5"] FeatureGenerator: # On-the-fly generation of additional features - features: # Supported functions: "sin", "cos", "tan", "arctan2", "log", "log10", "exp", "sqrt" + features: # - [, ] - ["area", "hillas_width * hillas_length"] - ["n_telescopes_triggered", "subarray.multiplicity(tels_with_trigger)"] @@ -79,8 +80,7 @@ TrainEnergyRegressor: - n_telescopes_triggered # still have to be listed here for the models - n_telescopes_hillas_reconstructor # to use them. - stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. - StereoMeanCombiner: - weights: None # Options: None, intensity, konrad - log_target: true # If true, calculate exp(mean(log(values))) + # stereo_combiner_cls: "StereoMeanCombiner" + # StereoMeanCombiner: # Here you can set options for StereoMeanCombiner + # weights: # (e.g. which kind of weights to use). diff --git a/ctapipe/resources/train_particle_classifier.yaml b/ctapipe/resources/train_particle_classifier.yaml index 687cc4434f9..ae4a81272e0 100644 --- a/ctapipe/resources/train_particle_classifier.yaml +++ b/ctapipe/resources/train_particle_classifier.yaml @@ -19,12 +19,13 @@ TrainParticleClassifier: rng_seed: 1337 ParticleClassifier: - prefix: ExtraTreesClassifier # Prefix of the output generated by the ParticleClassifier - # (Default: Name of the used scikit-learn algorithm). + # prefix: # Add a prefix of the output here, if you want to apply multiple + # ParticleClassifiers on the same file (e.g. for comparing different settings) - # All classification algorithms in scikit-learn are supported (https://scikit-learn.org/stable/modules/classes.html) - model_cls: ExtraTreesClassifier # scikit-learn algorithm to be used for the models - model_config: # Settings passed to the scikit-learn algorithm + # All classification algorithms in scikit-learn are supported + # (https://scikit-learn.org/stable/modules/classes.html) + model_cls: ExtraTreesClassifier + model_config: n_estimators: 10 max_depth: 10 n_jobs: -1 @@ -39,7 +40,7 @@ TrainParticleClassifier: - ["not clipped", "leakage_intensity_width_2 < 0.5"] FeatureGenerator: # On-the-fly generation of additional features - features: # Supported functions: "sin", "cos", "tan", "arctan2", "log", "log10", "exp", "sqrt" + features: # - [, ] - ["area", "hillas_width * hillas_length"] @@ -79,7 +80,7 @@ TrainParticleClassifier: - area # Features generated by the FeatureGenerator still have to be listed here # for the models to use them. - stereo_combiner_cls: "StereoMeanCombiner" # No other combiners are implemented atm. - StereoMeanCombiner: - weights: None # Options: None, intensity, konrad + # stereo_combiner_cls: "StereoMeanCombiner" + # StereoMeanCombiner: # Here you can set options for StereoMeanCombiner + # weights: # (e.g. which kind of weights to use). From 5ee0e9b1b7e207caa46081708f34090bd0ff5ca6 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 17 Nov 2023 12:57:04 +0100 Subject: [PATCH 244/264] Make muon test pass --- ctapipe/image/muon/tests/test_intensity_fit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe/image/muon/tests/test_intensity_fit.py b/ctapipe/image/muon/tests/test_intensity_fit.py index eeff33131b0..1f424178c17 100644 --- a/ctapipe/image/muon/tests/test_intensity_fit.py +++ b/ctapipe/image/muon/tests/test_intensity_fit.py @@ -37,7 +37,7 @@ def test_muon_efficiency_fit(prod5_lst, reference_location): center_x = 0.8 * u.deg center_y = 0.4 * u.deg - radius = 1.2 * u.deg + radius = 1.1 * u.deg ring_width = 0.05 * u.deg impact_parameter = 5 * u.m phi = 0 * u.rad From 9fa541271a01b18e4089be75fff8deafaedbfb27 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Fri, 17 Nov 2023 15:37:36 +0100 Subject: [PATCH 245/264] Fix indentation in docs resulting in wrong rendering --- ctapipe/image/pixel_likelihood.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctapipe/image/pixel_likelihood.py b/ctapipe/image/pixel_likelihood.py index 2da4ee6c070..2680cb457ed 100644 --- a/ctapipe/image/pixel_likelihood.py +++ b/ctapipe/image/pixel_likelihood.py @@ -72,8 +72,8 @@ def neg_log_likelihood_approx(image, prediction, spe_width, pedestal): - \\ln{P} = \\frac{\\ln{2 π} + \\ln{θ}}{2} + \\frac{(s - μ)^2}{2 θ} - We keep the constants in this because the actual value of the likelihood - can be used to calculate a goodness-of-fit value + We keep the constants in this because the actual value of the likelihood + can be used to calculate a goodness-of-fit value Parameters From b7546901cf7928994bf82192eb22f92decc59901 Mon Sep 17 00:00:00 2001 From: Lukas Beiske Date: Mon, 20 Nov 2023 14:24:01 +0100 Subject: [PATCH 246/264] Add true_impact_distance to cv output --- ctapipe/reco/sklearn.py | 1 + ctapipe/tools/train_disp_reconstructor.py | 6 +++++- ctapipe/tools/train_energy_regressor.py | 5 ++++- ctapipe/tools/train_particle_classifier.py | 1 + docs/changes/2468.optimization.rst | 1 + 5 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 docs/changes/2468.optimization.rst diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 8d5d7fe9bd9..fec334d9390 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -894,6 +894,7 @@ def __call__(self, telescope_type, table): "prediction": cv_prediction, "truth": truth, "true_energy": test["true_energy"], + "true_impact_distance": test["true_impact_distance"], } ) ) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index a188b4260d0..a5a968d226c 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -119,6 +119,7 @@ def start(self): self.log.info("Loading events for %s", tel_type) feature_names = self.models.features + [ "true_energy", + "true_impact_distance", "subarray_pointing_lat", "subarray_pointing_lon", "true_alt", @@ -138,7 +139,10 @@ def start(self): n_events=self.n_events.tel[tel_type], ) table[self.models.target] = self._get_true_disp(table) - table = table[self.models.features + [self.models.target, "true_energy"]] + table = table[ + self.models.features + + [self.models.target, "true_energy", "true_impact_distance"] + ] self.log.info("Train models on %s events", len(table)) self.cross_validate(tel_type, table) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 2c9d411f594..0d210762f1e 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -110,7 +110,10 @@ def start(self): self.log.info("Training models for %d types", len(types)) for tel_type in types: self.log.info("Loading events for %s", tel_type) - feature_names = self.regressor.features + [self.regressor.target] + feature_names = self.regressor.features + [ + self.regressor.target, + "true_impact_distance", + ] table = read_training_events( loader=self.loader, chunk_size=self.chunk_size, diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 70c53b63419..0002c683d39 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -174,6 +174,7 @@ def _read_input_data(self, tel_type): feature_names = self.classifier.features + [ self.classifier.target, "true_energy", + "true_impact_distance", ] signal = read_training_events( loader=self.signal_loader, diff --git a/docs/changes/2468.optimization.rst b/docs/changes/2468.optimization.rst new file mode 100644 index 00000000000..e8028ab65b4 --- /dev/null +++ b/docs/changes/2468.optimization.rst @@ -0,0 +1 @@ +Add ``true_impact_distance`` to the output of ``CrossValidator``. From b0de499a7d6c6c90c9a70941767451600d363545 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Wed, 22 Nov 2023 14:09:12 +0100 Subject: [PATCH 247/264] Make provenance test independent of test execution order --- ctapipe/core/tests/test_provenance.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ctapipe/core/tests/test_provenance.py b/ctapipe/core/tests/test_provenance.py index 12994090413..f67f8a68742 100644 --- a/ctapipe/core/tests/test_provenance.py +++ b/ctapipe/core/tests/test_provenance.py @@ -7,8 +7,15 @@ @pytest.fixture -def provenance(): +def provenance(monkeypatch): + # the singleton nature of Provenance messes with + # the order-independence of the tests asserting + # the provenance contains the correct information + # so we monkeypatch back to an empty state here prov = Provenance() + monkeypatch.setattr(prov, "_activities", []) + monkeypatch.setattr(prov, "_finished_activities", []) + prov.start_activity("test1") prov.add_input_file("input.txt") prov.add_output_file("output.txt") From 17c22cea22a155d7d3a505ed4239a1d165f99b82 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 23 Nov 2023 11:10:39 +0100 Subject: [PATCH 248/264] Update citation --- README.rst | 21 +++++++++++---------- docs/changes/2470.feature.rst | 2 ++ docs/conf.py | 1 + 3 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 docs/changes/2470.feature.rst diff --git a/README.rst b/README.rst index dc241c4939e..4077b8fa4f7 100644 --- a/README.rst +++ b/README.rst @@ -42,16 +42,17 @@ cite using this bibtex entry: .. code:: - @inproceedings{ctapipe-icrc-2021, - author = {Nöthe, Maximilian and Kosack, Karl and Nickel, Lukas and Peresano, Michele}, - title = {Prototype Open Event Reconstruction Pipeline for the Cherenkov Telescope Array}, - doi = {10.22323/1.395.0744}, - booktitle = {Proceedings, 37th International Cosmic Ray Conference}, - year=2021, - volume={395}, - number={744}, - location={Berlin, Germany}, - } + @inproceedings{ctapipe-icrc-2023, + author = {Linhoff, Maximilian and Beiske, Lukas and Biederbeck, Noah and Fröse, Stefan and Kosack, Karl and Nickel, Lukas}, + title = {ctapipe -- Prototype Open Event Reconstruction Pipeline for the Cherenkov Telescope Array}, + usera = {for the CTA Consortium and Observatory}, + doi = {10.22323/1.444.0703}, + booktitle = {Proceedings, 38th International Cosmic Ray Conference}, + year=2023, + volume={444}, + number={703}, + location={Nagoya, Japan}, + } Installation for Users diff --git a/docs/changes/2470.feature.rst b/docs/changes/2470.feature.rst new file mode 100644 index 00000000000..7dd07c2bfe8 --- /dev/null +++ b/docs/changes/2470.feature.rst @@ -0,0 +1,2 @@ +The recommended citation for ctapipe has been updated to the ICRC 2023 proceeding, +please update. diff --git a/docs/conf.py b/docs/conf.py index 4bcb2131e40..14524efb707 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -136,6 +136,7 @@ def setup(app): ("py:class", "t.Sequence"), ("py:class", "StrDict"), ("py:class", "ClassesType"), + ("py:class", "traitlets.traitlets.G"), ("py:obj", "traitlets.traitlets.G"), ("py:obj", "traitlets.traitlets.S"), ("py:obj", "traitlets.traitlets.T"), From 0c15c8950f4e8ca99206b08f3adb524ce737ee80 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Wed, 25 Oct 2023 12:01:44 +0200 Subject: [PATCH 249/264] Remove python warnings - Use logging of the component - No R1 is expected, so its just debug level - No DL0 is not expected, so keep it as warning --- ctapipe/calib/camera/calibrator.py | 7 +++---- ctapipe/calib/camera/tests/test_calibrator.py | 17 ++--------------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/ctapipe/calib/camera/calibrator.py b/ctapipe/calib/camera/calibrator.py index 0e29f7f228c..cebb856af33 100644 --- a/ctapipe/calib/camera/calibrator.py +++ b/ctapipe/calib/camera/calibrator.py @@ -129,7 +129,7 @@ def __init__( self.image_extractors = {} if image_extractor is None: - for (_, _, name) in self.image_extractor_type: + for _, _, name in self.image_extractor_type: self.image_extractors[name] = ImageExtractor.from_name( name, subarray=self.subarray, parent=self ) @@ -156,7 +156,7 @@ def __init__( def _check_r1_empty(self, waveforms): if waveforms is None: if not self._r1_empty_warn: - warnings.warn( + self.log.debug( "Encountered an event with no R1 data. " "DL0 is unchanged in this circumstance." ) @@ -168,7 +168,7 @@ def _check_r1_empty(self, waveforms): def _check_dl0_empty(self, waveforms): if waveforms is None: if not self._dl0_empty_warn: - warnings.warn( + self.log.warning( "Encountered an event with no DL0 data. " "DL1 is unchanged in this circumstance." ) @@ -245,7 +245,6 @@ def _calibrate_dl1(self, event, tel_id): is_valid=True, ) else: - # shift waveforms if time_shift calibration is available if time_shift is not None: if self.apply_waveform_time_shift.tel[tel_id]: diff --git a/ctapipe/calib/camera/tests/test_calibrator.py b/ctapipe/calib/camera/tests/test_calibrator.py index b70c6a4aee1..b8e9be699f7 100644 --- a/ctapipe/calib/camera/tests/test_calibrator.py +++ b/ctapipe/calib/camera/tests/test_calibrator.py @@ -101,11 +101,6 @@ def test_check_r1_empty(example_event, example_subarray): calibrator = CameraCalibrator(subarray=example_subarray) tel_id = list(example_event.r0.tel)[0] waveform = example_event.r1.tel[tel_id].waveform.copy() - with pytest.warns(UserWarning): - example_event.r1.tel[tel_id].waveform = None - calibrator._calibrate_dl0(example_event, tel_id) - assert example_event.dl0.tel[tel_id].waveform is None - assert calibrator._check_r1_empty(None) is True assert calibrator._check_r1_empty(waveform) is False @@ -115,8 +110,7 @@ def test_check_r1_empty(example_event, example_subarray): ) event = ArrayEventContainer() event.dl0.tel[tel_id].waveform = np.full((2048, 128), 2) - with pytest.warns(UserWarning): - calibrator(event) + calibrator(event) assert (event.dl0.tel[tel_id].waveform == 2).all() assert (event.dl1.tel[tel_id].image == 2 * 128).all() @@ -126,19 +120,13 @@ def test_check_dl0_empty(example_event, example_subarray): tel_id = list(example_event.r0.tel)[0] calibrator._calibrate_dl0(example_event, tel_id) waveform = example_event.dl0.tel[tel_id].waveform.copy() - with pytest.warns(UserWarning): - example_event.dl0.tel[tel_id].waveform = None - calibrator._calibrate_dl1(example_event, tel_id) - assert example_event.dl1.tel[tel_id].image is None - assert calibrator._check_dl0_empty(None) is True assert calibrator._check_dl0_empty(waveform) is False calibrator = CameraCalibrator(subarray=example_subarray) event = ArrayEventContainer() event.dl1.tel[tel_id].image = np.full(2048, 2) - with pytest.warns(UserWarning): - calibrator(event) + calibrator(event) assert (event.dl1.tel[tel_id].image == 2).all() @@ -267,7 +255,6 @@ def test_shift_waveforms(): def test_invalid_pixels(example_event, example_subarray): - # switching off the corrections makes it easier to test for # the exact value of 1.0 config = Config( From 2b567088a6e70a6f2d23a6aa75316b3b9048b3e4 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Wed, 25 Oct 2023 12:15:45 +0200 Subject: [PATCH 250/264] Remove unused import --- ctapipe/calib/camera/calibrator.py | 2 -- ctapipe/calib/camera/tests/test_calibrator.py | 1 - 2 files changed, 3 deletions(-) diff --git a/ctapipe/calib/camera/calibrator.py b/ctapipe/calib/camera/calibrator.py index cebb856af33..c7864ca2e23 100644 --- a/ctapipe/calib/camera/calibrator.py +++ b/ctapipe/calib/camera/calibrator.py @@ -3,8 +3,6 @@ calibration and image extraction, as well as supporting algorithms. """ -import warnings - import astropy.units as u import numpy as np from numba import float32, float64, guvectorize, int64 diff --git a/ctapipe/calib/camera/tests/test_calibrator.py b/ctapipe/calib/camera/tests/test_calibrator.py index b8e9be699f7..b16b9dcc68e 100644 --- a/ctapipe/calib/camera/tests/test_calibrator.py +++ b/ctapipe/calib/camera/tests/test_calibrator.py @@ -5,7 +5,6 @@ import astropy.units as u import numpy as np -import pytest from scipy.stats import norm from traitlets.config import Config From b213b39644846c53dfc4451277bff929b9c7ba98 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Wed, 25 Oct 2023 12:25:28 +0200 Subject: [PATCH 251/264] Add changelog --- docs/changes/2421.bugfix.rst | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changes/2421.bugfix.rst diff --git a/docs/changes/2421.bugfix.rst b/docs/changes/2421.bugfix.rst new file mode 100644 index 00000000000..5a67551f26f --- /dev/null +++ b/docs/changes/2421.bugfix.rst @@ -0,0 +1,5 @@ +Remove warnings about missing R1 or DL0 data when using the CameraCalibrator. +These were previously emitted directly as pytho warnings and did not use the +component logging system, which they now do. +As we do not actually expect R1 to be present it was also moved down to +debug level. From de7cb58250cb39fd48fb96bbc23339d4034af250 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Thu, 26 Oct 2023 16:51:42 +0200 Subject: [PATCH 252/264] Fix typo --- docs/changes/2421.bugfix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/2421.bugfix.rst b/docs/changes/2421.bugfix.rst index 5a67551f26f..8f462c1a517 100644 --- a/docs/changes/2421.bugfix.rst +++ b/docs/changes/2421.bugfix.rst @@ -1,5 +1,5 @@ Remove warnings about missing R1 or DL0 data when using the CameraCalibrator. -These were previously emitted directly as pytho warnings and did not use the +These were previously emitted directly as python warnings and did not use the component logging system, which they now do. As we do not actually expect R1 to be present it was also moved down to debug level. From 9681523bd739f73a241de616def01bafd8a61010 Mon Sep 17 00:00:00 2001 From: Maximilian Linhoff Date: Thu, 23 Nov 2023 16:11:48 +0100 Subject: [PATCH 253/264] Do not run codecov action on documentation-only --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3e5be5d089..b65aca8270a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -139,7 +139,7 @@ jobs: ctapipe-info --version - uses: codecov/codecov-action@v3 - if: contains(matrix.extra-args, 'codecov') + if: contains(matrix.extra-args, 'codecov') && contains(github.event.pull_request.labels.*.name, 'documentation-only') == false with: fail_ci_if_error: true From f209f549a7e72e42608cd995c976f9fffc4e108c Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Thu, 26 Oct 2023 16:48:33 +0200 Subject: [PATCH 254/264] Allow setting n_jobs on tool invocation - It can be useful to set n_jobs indepently from the config file - For the sklearn reconstructors this requires setting n_jobs on every model, that is attached to the reconstructor - Fixes #2307 --- ctapipe/reco/reconstructor.py | 14 ++++++- ctapipe/reco/sklearn.py | 15 ++++++++ ctapipe/reco/tests/test_sklearn.py | 44 ++++++++++++++++++++++ ctapipe/tools/apply_models.py | 9 +++++ ctapipe/tools/train_disp_reconstructor.py | 9 +++++ ctapipe/tools/train_energy_regressor.py | 8 ++++ ctapipe/tools/train_particle_classifier.py | 8 ++++ 7 files changed, 106 insertions(+), 1 deletion(-) diff --git a/ctapipe/reco/reconstructor.py b/ctapipe/reco/reconstructor.py index 28402449ee4..9bacb63a802 100644 --- a/ctapipe/reco/reconstructor.py +++ b/ctapipe/reco/reconstructor.py @@ -70,7 +70,7 @@ class Reconstructor(TelescopeComponent): algorithms should inherit from """ - #: ctapipe_rco entry points may provide Reconstructor implementations + #: ctapipe_reco entry points may provide Reconstructor implementations plugin_entry_point = "ctapipe_reco" def __init__(self, subarray, **kwargs): @@ -141,6 +141,18 @@ def read(cls, path, parent=None, subarray=None, **kwargs): Provenance().add_input_file(path, role="reconstructor") return instance + def set_n_jobs(self, n_jobs): + """ + Set n_jobs if applicable for the reconsructor. + This is not just a traits option of the class, because + for example in the case of the SKLearnReconstructors you need + to set the property of all of the sklearn models for it to be + applied in the fit and predict steps. + """ + self.log.warning( + f"Trying to set n_jobs to {n_jobs}, but the reconstructor does not make any use of it." + ) + class HillasGeometryReconstructor(Reconstructor): """ diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index fec334d9390..7b4d2e953dd 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -222,6 +222,13 @@ def fit(self, key, table): y = self._table_to_y(table, mask=valid) self._models[key].fit(X, y) + def set_n_jobs(self, n_jobs): + """ + Update n_jobs of all associated models. + """ + for model in self._models.values(): + setattr(model, "n_jobs", n_jobs) + class SKLearnRegressionReconstructor(SKLearnReconstructor): """ @@ -803,6 +810,14 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table ReconstructionProperty.GEOMETRY: altaz_result, } + def set_n_jobs(self, n_jobs): + """ + Update n_jobs of all associated models. + """ + for (disp, sign) in self._models.values(): + setattr(disp, "n_jobs", n_jobs) + setattr(sign, "n_jobs", n_jobs) + class CrossValidator(Component): """Class to train sklearn based reconstructors in a cross validation""" diff --git a/ctapipe/reco/tests/test_sklearn.py b/ctapipe/reco/tests/test_sklearn.py index 50b4a016880..a2c0e83e6ca 100644 --- a/ctapipe/reco/tests/test_sklearn.py +++ b/ctapipe/reco/tests/test_sklearn.py @@ -9,6 +9,7 @@ from ctapipe.core import Component from ctapipe.reco import EnergyRegressor, ParticleClassifier from ctapipe.reco.reconstructor import ReconstructionProperty +from ctapipe.reco.sklearn import DispReconstructor KEY = "LST_LST_LSTCam" @@ -166,6 +167,49 @@ def test_regressor_single_event(model_cls, example_table, example_subarray): assert valid[0] == False +def test_set_n_jobs(example_subarray): + config = Config( + { + "EnergyRegressor": { + "model_cls": "RandomForestRegressor", + "model_config": {"n_estimators": 20, "max_depth": 15, "n_jobs": -1}, + } + } + ) + regressor = EnergyRegressor( + example_subarray, + config=config, + ) + + regressor._models["telescope"] = regressor._new_model() + assert regressor._models["telescope"].n_jobs == -1 + regressor.set_n_jobs(42) + assert regressor._models["telescope"].n_jobs == 42 + + # DISP has two models per telescope, check that aswell + config = Config( + { + "DispReconstructor": { + "norm_cls": "RandomForestRegressor", + "norm_config": {"n_estimators": 20, "max_depth": 15, "n_jobs": -1}, + "sign_cls": "RandomForestClassifier", + "sign_config": {"n_estimators": 20, "max_depth": 15, "n_jobs": -1}, + } + } + ) + disp = DispReconstructor( + example_subarray, + config=config, + ) + + disp._models["telescope"] = disp._new_models() + assert disp._models["telescope"][0].n_jobs == -1 + assert disp._models["telescope"][1].n_jobs == -1 + disp.set_n_jobs(42) + assert disp._models["telescope"][0].n_jobs == 42 + assert disp._models["telescope"][1].n_jobs == 42 + + @pytest.mark.parametrize( "model_cls", ["KNeighborsClassifier", "RandomForestClassifier"] ) diff --git a/ctapipe/tools/apply_models.py b/ctapipe/tools/apply_models.py index 2df691d8bf4..764cb0493b0 100644 --- a/ctapipe/tools/apply_models.py +++ b/ctapipe/tools/apply_models.py @@ -68,6 +68,12 @@ class ApplyModels(Tool): help="How many subarray events to load at once for making predictions.", ).tag(config=True) + n_jobs = Integer( + default_value=None, + allow_none=True, + help="Number of threads to use for the reconstruction. This overwrites the values in the config", + ).tag(config=True) + progress_bar = Bool( help="show progress bar during processing", default_value=True, @@ -150,6 +156,9 @@ def setup(self): Reconstructor.read(path, parent=self, subarray=self.loader.subarray) for path in self.reconstructor_paths ] + if self.n_jobs: + for r in self._reconstructors: + r.set_n_jobs(self.n_jobs) def start(self): """Apply models to input tables""" diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index a5a968d226c..30efd15c822 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -66,6 +66,12 @@ class TrainDispReconstructor(Tool): default_value=0, help="Random seed for sampling and cross validation" ).tag(config=True) + n_jobs = Int( + default_value=None, + allow_none=True, + help="Number of threads to use for the reconstruction. This overwrites the values in the config", + ).tag(config=True) + project_disp = Bool( default_value=False, help=( @@ -103,6 +109,9 @@ def setup(self): self.n_events.attach_subarray(self.loader.subarray) self.models = DispReconstructor(self.loader.subarray, parent=self) + if self.n_jobs: + self.models.set_n_jobs(self.n_jobs) + self.cross_validate = CrossValidator(parent=self, model_component=self.models) self.rng = np.random.default_rng(self.random_seed) self.check_output(self.output_path, self.cross_validate.output_path) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 0d210762f1e..f7f636a1e85 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -63,6 +63,12 @@ class TrainEnergyRegressor(Tool): default_value=0, help="Random seed for sampling and cross validation" ).tag(config=True) + n_jobs = Int( + default_value=None, + allow_none=True, + help="Number of threads to use for the reconstruction. This overwrites the values in the config", + ).tag(config=True) + aliases = { ("i", "input"): "TableLoader.input_url", ("o", "output"): "TrainEnergyRegressor.output_path", @@ -94,6 +100,8 @@ def setup(self): self.n_events.attach_subarray(self.loader.subarray) self.regressor = EnergyRegressor(self.loader.subarray, parent=self) + if self.n_jobs: + self.regressor.set_n_jobs(self.n_jobs) self.cross_validate = CrossValidator( parent=self, model_component=self.regressor ) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 0002c683d39..337027130d9 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -92,6 +92,12 @@ class TrainParticleClassifier(Tool): help="Random number seed for sampling and the cross validation splitting", ).tag(config=True) + n_jobs = Int( + default_value=None, + allow_none=True, + help="Number of threads to use for the reconstruction. This overwrites the values in the config", + ).tag(config=True) + aliases = { "signal": "TrainParticleClassifier.input_url_signal", "background": "TrainParticleClassifier.input_url_background", @@ -144,6 +150,8 @@ def setup(self): self.n_background.attach_subarray(self.subarray) self.classifier = ParticleClassifier(subarray=self.subarray, parent=self) + if self.n_jobs: + self.classifier.set_n_jobs(self.n_jobs) self.rng = np.random.default_rng(self.random_seed) self.cross_validate = CrossValidator( parent=self, model_component=self.classifier From 18818e287d332aee993fcf99768d0aa7266454ba Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Thu, 26 Oct 2023 16:54:56 +0200 Subject: [PATCH 255/264] Add changelog --- docs/changes/2430.feature.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/changes/2430.feature.rst diff --git a/docs/changes/2430.feature.rst b/docs/changes/2430.feature.rst new file mode 100644 index 00000000000..2794c7cd5e2 --- /dev/null +++ b/docs/changes/2430.feature.rst @@ -0,0 +1,3 @@ +Allow setting n_jobs on the command line for the +train_* and apply_models tools using a new `n_jobs` flag. +This temporarily overwrites any settings in the (model) config(s). From a2e6722235bf9b83404c97f5933bdffe7c224751 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Thu, 26 Oct 2023 17:35:01 +0200 Subject: [PATCH 256/264] Add alias --- ctapipe/tools/apply_models.py | 1 + ctapipe/tools/train_disp_reconstructor.py | 1 + ctapipe/tools/train_energy_regressor.py | 1 + ctapipe/tools/train_particle_classifier.py | 1 + 4 files changed, 4 insertions(+) diff --git a/ctapipe/tools/apply_models.py b/ctapipe/tools/apply_models.py index 764cb0493b0..cd557ea7465 100644 --- a/ctapipe/tools/apply_models.py +++ b/ctapipe/tools/apply_models.py @@ -83,6 +83,7 @@ class ApplyModels(Tool): ("i", "input"): "ApplyModels.input_url", ("r", "reconstructor"): "ApplyModels.reconstructor_paths", ("o", "output"): "ApplyModels.output_path", + "n-jobs": "ApplyModels.n_jobs", "chunk-size": "ApplyModels.chunk_size", } diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 30efd15c822..3579cea061a 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -86,6 +86,7 @@ class TrainDispReconstructor(Tool): ("i", "input"): "TableLoader.input_url", ("o", "output"): "TrainDispReconstructor.output_path", "n-events": "TrainDispReconstructor.n_events", + "n-jobs": "TrainDispReconstructor.n_jobs", "cv-output": "CrossValidator.output_path", } diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index f7f636a1e85..2294fc2f35f 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -74,6 +74,7 @@ class TrainEnergyRegressor(Tool): ("o", "output"): "TrainEnergyRegressor.output_path", "n-events": "TrainEnergyRegressor.n_events", "chunk-size": "TrainEnergyRegressor.chunk_size", + "n-jobs": "TrainEnergyRegressor.n_jobs", "cv-output": "CrossValidator.output_path", } diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 337027130d9..d40b3de0f36 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -103,6 +103,7 @@ class TrainParticleClassifier(Tool): "background": "TrainParticleClassifier.input_url_background", "n-signal": "TrainParticleClassifier.n_signal", "n-background": "TrainParticleClassifier.n_background", + "n-jobs": "TrainParticleClassifier.n_jobs", ("o", "output"): "TrainParticleClassifier.output_path", "cv-output": "CrossValidator.output_path", } From 35226bd6b64e845a93681328183a14d4b52aa7b9 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 12:41:01 +0100 Subject: [PATCH 257/264] Set n_jobs directly in reconstructor class --- ctapipe/tools/train_disp_reconstructor.py | 4 +--- ctapipe/tools/train_energy_regressor.py | 5 ++--- ctapipe/tools/train_particle_classifier.py | 4 +--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 3579cea061a..83635c1f946 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -86,7 +86,7 @@ class TrainDispReconstructor(Tool): ("i", "input"): "TableLoader.input_url", ("o", "output"): "TrainDispReconstructor.output_path", "n-events": "TrainDispReconstructor.n_events", - "n-jobs": "TrainDispReconstructor.n_jobs", + "n-jobs": "DispReconstructor.n_jobs", "cv-output": "CrossValidator.output_path", } @@ -110,8 +110,6 @@ def setup(self): self.n_events.attach_subarray(self.loader.subarray) self.models = DispReconstructor(self.loader.subarray, parent=self) - if self.n_jobs: - self.models.set_n_jobs(self.n_jobs) self.cross_validate = CrossValidator(parent=self, model_component=self.models) self.rng = np.random.default_rng(self.random_seed) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 2294fc2f35f..c9eba337081 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -74,7 +74,7 @@ class TrainEnergyRegressor(Tool): ("o", "output"): "TrainEnergyRegressor.output_path", "n-events": "TrainEnergyRegressor.n_events", "chunk-size": "TrainEnergyRegressor.chunk_size", - "n-jobs": "TrainEnergyRegressor.n_jobs", + "n-jobs": "EnergyRegressor.n_jobs", "cv-output": "CrossValidator.output_path", } @@ -101,8 +101,7 @@ def setup(self): self.n_events.attach_subarray(self.loader.subarray) self.regressor = EnergyRegressor(self.loader.subarray, parent=self) - if self.n_jobs: - self.regressor.set_n_jobs(self.n_jobs) + self.log.warning(f"{self.regressor._models}") self.cross_validate = CrossValidator( parent=self, model_component=self.regressor ) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index d40b3de0f36..bf6fd212fb3 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -103,7 +103,7 @@ class TrainParticleClassifier(Tool): "background": "TrainParticleClassifier.input_url_background", "n-signal": "TrainParticleClassifier.n_signal", "n-background": "TrainParticleClassifier.n_background", - "n-jobs": "TrainParticleClassifier.n_jobs", + "n-jobs": "ParticleClassifier.n_jobs", ("o", "output"): "TrainParticleClassifier.output_path", "cv-output": "CrossValidator.output_path", } @@ -151,8 +151,6 @@ def setup(self): self.n_background.attach_subarray(self.subarray) self.classifier = ParticleClassifier(subarray=self.subarray, parent=self) - if self.n_jobs: - self.classifier.set_n_jobs(self.n_jobs) self.rng = np.random.default_rng(self.random_seed) self.cross_validate = CrossValidator( parent=self, model_component=self.classifier From e2863d3eb66a7ba93698381871e289ecc9158647 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 12:42:23 +0100 Subject: [PATCH 258/264] Remove double loop --- ctapipe/tools/apply_models.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ctapipe/tools/apply_models.py b/ctapipe/tools/apply_models.py index cd557ea7465..dee234f6c95 100644 --- a/ctapipe/tools/apply_models.py +++ b/ctapipe/tools/apply_models.py @@ -153,13 +153,12 @@ def setup(self): ) ) - self._reconstructors = [ - Reconstructor.read(path, parent=self, subarray=self.loader.subarray) - for path in self.reconstructor_paths - ] - if self.n_jobs: - for r in self._reconstructors: - r.set_n_jobs(self.n_jobs) + self._reconstructors = [] + for path in self.reconstructor_paths: + r = Reconstructor.read(path, parent=self, subarray=self.loader.subarray) + if self.n_jobs: + r.n_jobs = self.n_jobs + self._reconstructors.append(r) def start(self): """Apply models to input tables""" From dcf18854a16081301bad6dca642b6b25bc522939 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 12:44:02 +0100 Subject: [PATCH 259/264] Use traitlets observe to change value of n_jobs --- ctapipe/reco/reconstructor.py | 20 ++++++--------- ctapipe/reco/sklearn.py | 39 ++++++++++++++++++++---------- ctapipe/reco/tests/test_sklearn.py | 4 +-- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/ctapipe/reco/reconstructor.py b/ctapipe/reco/reconstructor.py index 9bacb63a802..57a7a8a6eaf 100644 --- a/ctapipe/reco/reconstructor.py +++ b/ctapipe/reco/reconstructor.py @@ -8,7 +8,7 @@ from ctapipe.containers import ArrayEventContainer, TelescopeImpactParameterContainer from ctapipe.core import Provenance, QualityQuery, TelescopeComponent -from ctapipe.core.traits import List +from ctapipe.core.traits import Integer, List from ..compat import StrEnum from ..coordinates import shower_impact_distance @@ -73,6 +73,12 @@ class Reconstructor(TelescopeComponent): #: ctapipe_reco entry points may provide Reconstructor implementations plugin_entry_point = "ctapipe_reco" + n_jobs = Integer( + default_value=None, + allow_none=True, + help="Number of threads to use for the reconstruction if supported by the reconstructor.", + ).tag(config=True) + def __init__(self, subarray, **kwargs): super().__init__(subarray=subarray, **kwargs) self.quality_query = StereoQualityQuery(parent=self) @@ -141,18 +147,6 @@ def read(cls, path, parent=None, subarray=None, **kwargs): Provenance().add_input_file(path, role="reconstructor") return instance - def set_n_jobs(self, n_jobs): - """ - Set n_jobs if applicable for the reconsructor. - This is not just a traits option of the class, because - for example in the case of the SKLearnReconstructors you need - to set the property of all of the sklearn models for it to be - applied in the fit and predict steps. - """ - self.log.warning( - f"Trying to set n_jobs to {n_jobs}, but the reconstructor does not make any use of it." - ) - class HillasGeometryReconstructor(Reconstructor): """ diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 7b4d2e953dd..20d38fdb29f 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -16,7 +16,7 @@ from sklearn.model_selection import KFold, StratifiedKFold from sklearn.utils import all_estimators from tqdm import tqdm -from traitlets import TraitError +from traitlets import TraitError, observe from ctapipe.exceptions import TooFewEvents @@ -103,7 +103,7 @@ class SKLearnReconstructor(Reconstructor): help="If given, load serialized model from this path", ).tag(config=True) - def __init__(self, subarray=None, models=None, **kwargs): + def __init__(self, subarray=None, models=None, n_jobs=None, **kwargs): # Run the Component __init__ first to handle the configuration # and make `self.load_path` available Component.__init__(self, **kwargs) @@ -199,7 +199,10 @@ def instrument_table(self): return QTable(self.subarray.to_table("joined")) def _new_model(self): - return SUPPORTED_MODELS[self.model_cls](**self.model_config) + cfg = self.model_config + if self.n_jobs: + cfg["n_jobs"] = self.n_jobs + return SUPPORTED_MODELS[self.model_cls](**cfg) def _table_to_y(self, table, mask=None): """ @@ -222,12 +225,17 @@ def fit(self, key, table): y = self._table_to_y(table, mask=valid) self._models[key].fit(X, y) - def set_n_jobs(self, n_jobs): + @observe("n_jobs") + def _set_n_jobs(self, n_jobs): + self._propagate_n_jobs(n_jobs.new) + + def _propagate_n_jobs(self, n_jobs): """ Update n_jobs of all associated models. """ - for model in self._models.values(): - setattr(model, "n_jobs", n_jobs) + if hasattr(self, "_models"): + for model in self._models.values(): + model.n_jobs = n_jobs class SKLearnRegressionReconstructor(SKLearnReconstructor): @@ -569,7 +577,6 @@ def __init__(self, subarray=None, models=None, **kwargs): # to verify settings self._new_models() - self._models = {} if models is None else models self.unit = None self.stereo_combiner = StereoCombiner.from_name( @@ -591,8 +598,13 @@ def __init__(self, subarray=None, models=None, **kwargs): self.subarray = subarray def _new_models(self): - norm_regressor = SUPPORTED_REGRESSORS[self.norm_cls](**self.norm_config) - sign_classifier = SUPPORTED_CLASSIFIERS[self.sign_cls](**self.sign_config) + norm_cfg = self.norm_config + sign_cfg = self.sign_config + if self.n_jobs: + norm_cfg["n_jobs"] = self.n_jobs + sign_cfg["n_jobs"] = self.n_jobs + norm_regressor = SUPPORTED_REGRESSORS[self.norm_cls](**norm_cfg) + sign_classifier = SUPPORTED_CLASSIFIERS[self.sign_cls](**sign_cfg) return norm_regressor, sign_classifier def _table_to_y(self, table, mask=None): @@ -810,13 +822,14 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table ReconstructionProperty.GEOMETRY: altaz_result, } - def set_n_jobs(self, n_jobs): + def _propagate_n_jobs(self, n_jobs): """ Update n_jobs of all associated models. """ - for (disp, sign) in self._models.values(): - setattr(disp, "n_jobs", n_jobs) - setattr(sign, "n_jobs", n_jobs) + if hasattr(self, "_models"): + for (disp, sign) in self._models.values(): + disp.n_jobs = n_jobs + sign.n_jobs = n_jobs class CrossValidator(Component): diff --git a/ctapipe/reco/tests/test_sklearn.py b/ctapipe/reco/tests/test_sklearn.py index a2c0e83e6ca..e893cf9480b 100644 --- a/ctapipe/reco/tests/test_sklearn.py +++ b/ctapipe/reco/tests/test_sklearn.py @@ -183,7 +183,7 @@ def test_set_n_jobs(example_subarray): regressor._models["telescope"] = regressor._new_model() assert regressor._models["telescope"].n_jobs == -1 - regressor.set_n_jobs(42) + regressor.n_jobs = 42 assert regressor._models["telescope"].n_jobs == 42 # DISP has two models per telescope, check that aswell @@ -205,7 +205,7 @@ def test_set_n_jobs(example_subarray): disp._models["telescope"] = disp._new_models() assert disp._models["telescope"][0].n_jobs == -1 assert disp._models["telescope"][1].n_jobs == -1 - disp.set_n_jobs(42) + disp.n_jobs = 42 assert disp._models["telescope"][0].n_jobs == 42 assert disp._models["telescope"][1].n_jobs == 42 From 01fa3ae5d2f4a6579c600f956f06cd8cb35a0cb9 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 12:49:27 +0100 Subject: [PATCH 260/264] Clarify help --- ctapipe/tools/train_disp_reconstructor.py | 2 +- ctapipe/tools/train_energy_regressor.py | 2 +- ctapipe/tools/train_particle_classifier.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 83635c1f946..13a9a8e578a 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -69,7 +69,7 @@ class TrainDispReconstructor(Tool): n_jobs = Int( default_value=None, allow_none=True, - help="Number of threads to use for the reconstruction. This overwrites the values in the config", + help="Number of threads to use for the reconstruction. This overwrites the values in the config of each reconstructor.", ).tag(config=True) project_disp = Bool( diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index c9eba337081..118f022f743 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -66,7 +66,7 @@ class TrainEnergyRegressor(Tool): n_jobs = Int( default_value=None, allow_none=True, - help="Number of threads to use for the reconstruction. This overwrites the values in the config", + help="Number of threads to use for the reconstruction. This overwrites the values in the config of each reconstructor.", ).tag(config=True) aliases = { diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index bf6fd212fb3..26b88f1526c 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -95,7 +95,7 @@ class TrainParticleClassifier(Tool): n_jobs = Int( default_value=None, allow_none=True, - help="Number of threads to use for the reconstruction. This overwrites the values in the config", + help="Number of threads to use for the reconstruction. This overwrites the values in the config of each reconstructor.", ).tag(config=True) aliases = { From a234c66d4c4fb6c6776a7fbf23228e0e3519f5d7 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 12:49:44 +0100 Subject: [PATCH 261/264] Set n_jobs to none after training --- ctapipe/tools/train_disp_reconstructor.py | 1 + ctapipe/tools/train_energy_regressor.py | 1 + ctapipe/tools/train_particle_classifier.py | 1 + 3 files changed, 3 insertions(+) diff --git a/ctapipe/tools/train_disp_reconstructor.py b/ctapipe/tools/train_disp_reconstructor.py index 13a9a8e578a..89ac2eeb8c3 100644 --- a/ctapipe/tools/train_disp_reconstructor.py +++ b/ctapipe/tools/train_disp_reconstructor.py @@ -190,6 +190,7 @@ def finish(self): Write-out trained models and cross-validation results. """ self.log.info("Writing output") + self.models.n_jobs = None self.models.write(self.output_path, overwrite=self.overwrite) if self.cross_validate.output_path: self.cross_validate.write(overwrite=self.overwrite) diff --git a/ctapipe/tools/train_energy_regressor.py b/ctapipe/tools/train_energy_regressor.py index 118f022f743..383dedc7416 100644 --- a/ctapipe/tools/train_energy_regressor.py +++ b/ctapipe/tools/train_energy_regressor.py @@ -145,6 +145,7 @@ def finish(self): Write-out trained models and cross-validation results. """ self.log.info("Writing output") + self.regressor.n_jobs = None self.regressor.write(self.output_path, overwrite=self.overwrite) if self.cross_validate.output_path: self.cross_validate.write(overwrite=self.overwrite) diff --git a/ctapipe/tools/train_particle_classifier.py b/ctapipe/tools/train_particle_classifier.py index 26b88f1526c..caf4a455764 100644 --- a/ctapipe/tools/train_particle_classifier.py +++ b/ctapipe/tools/train_particle_classifier.py @@ -214,6 +214,7 @@ def finish(self): Write-out trained models and cross-validation results. """ self.log.info("Writing output") + self.classifier.n_jobs = None self.classifier.write(self.output_path, overwrite=self.overwrite) self.signal_loader.close() self.background_loader.close() From 8f87a8cc0c2f4626e6a58dbf014c12445d2a0cfd Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 14:02:33 +0100 Subject: [PATCH 262/264] Fix n_jobs for the DispReconstructor - Implement the @observe method there as well, because it is not a subclass of sklearnreconstructor --- ctapipe/reco/sklearn.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ctapipe/reco/sklearn.py b/ctapipe/reco/sklearn.py index 20d38fdb29f..230f6af36d4 100644 --- a/ctapipe/reco/sklearn.py +++ b/ctapipe/reco/sklearn.py @@ -227,15 +227,12 @@ def fit(self, key, table): @observe("n_jobs") def _set_n_jobs(self, n_jobs): - self._propagate_n_jobs(n_jobs.new) - - def _propagate_n_jobs(self, n_jobs): """ Update n_jobs of all associated models. """ if hasattr(self, "_models"): for model in self._models.values(): - model.n_jobs = n_jobs + model.n_jobs = n_jobs.new class SKLearnRegressionReconstructor(SKLearnReconstructor): @@ -822,14 +819,15 @@ def predict_table(self, key, table: Table) -> Dict[ReconstructionProperty, Table ReconstructionProperty.GEOMETRY: altaz_result, } - def _propagate_n_jobs(self, n_jobs): + @observe("n_jobs") + def _set_n_jobs(self, n_jobs): """ Update n_jobs of all associated models. """ if hasattr(self, "_models"): for (disp, sign) in self._models.values(): - disp.n_jobs = n_jobs - sign.n_jobs = n_jobs + disp.n_jobs = n_jobs.new + sign.n_jobs = n_jobs.new class CrossValidator(Component): From ad4bd4d5360f7fb0bddf4f634d4609a9c5bb5df6 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 14:35:45 +0100 Subject: [PATCH 263/264] Fix docs syntax --- docs/changes/2430.feature.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/2430.feature.rst b/docs/changes/2430.feature.rst index 2794c7cd5e2..97917d6f1ce 100644 --- a/docs/changes/2430.feature.rst +++ b/docs/changes/2430.feature.rst @@ -1,3 +1,3 @@ Allow setting n_jobs on the command line for the -train_* and apply_models tools using a new `n_jobs` flag. +train_* and apply_models tools using a new ``n_jobs`` flag. This temporarily overwrites any settings in the (model) config(s). From 0372d11f8f39018955b4bc4e582dc18be394bed8 Mon Sep 17 00:00:00 2001 From: Lukas Nickel Date: Fri, 17 Nov 2023 14:59:28 +0100 Subject: [PATCH 264/264] Update ml configs - Move n_jobs from model config to reconstructor config --- ctapipe/resources/train_disp_reconstructor.yaml | 5 +++-- ctapipe/resources/train_energy_regressor.yaml | 2 +- ctapipe/resources/train_particle_classifier.yaml | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ctapipe/resources/train_disp_reconstructor.yaml b/ctapipe/resources/train_disp_reconstructor.yaml index 499c068491b..1a79878242e 100644 --- a/ctapipe/resources/train_disp_reconstructor.yaml +++ b/ctapipe/resources/train_disp_reconstructor.yaml @@ -19,13 +19,15 @@ TrainDispReconstructor: # prefix: # Add a prefix of the output here, if you want to apply multiple # DispReconstructors on the same file (e.g. for comparing different settings) + # How many cores to use. Overwrites model config + n_jobs: -1 + # All regression algorithms in scikit-learn are supported # (https://scikit-learn.org/stable/modules/classes.html) norm_cls: ExtraTreesRegressor norm_config: n_estimators: 10 max_depth: 10 - n_jobs: -1 log_target: True @@ -35,7 +37,6 @@ TrainDispReconstructor: sign_config: n_estimators: 10 max_depth: 10 - n_jobs: -1 QualityQuery: # Event Selection performed before training the models quality_criteria: diff --git a/ctapipe/resources/train_energy_regressor.yaml b/ctapipe/resources/train_energy_regressor.yaml index a2ecdcfa9c2..e33a37e57ec 100644 --- a/ctapipe/resources/train_energy_regressor.yaml +++ b/ctapipe/resources/train_energy_regressor.yaml @@ -20,6 +20,7 @@ TrainEnergyRegressor: # EnergyRegressors on the same file (e.g. for comparing different settings) log_target: True + n_jobs: -1 # All regression algorithms in scikit-learn are supported # (https://scikit-learn.org/stable/modules/classes.html) @@ -27,7 +28,6 @@ TrainEnergyRegressor: model_config: n_estimators: 10 max_depth: 10 - n_jobs: -1 QualityQuery: # Event Selection performed before training the models quality_criteria: diff --git a/ctapipe/resources/train_particle_classifier.yaml b/ctapipe/resources/train_particle_classifier.yaml index ae4a81272e0..8b999a8e261 100644 --- a/ctapipe/resources/train_particle_classifier.yaml +++ b/ctapipe/resources/train_particle_classifier.yaml @@ -22,13 +22,15 @@ TrainParticleClassifier: # prefix: # Add a prefix of the output here, if you want to apply multiple # ParticleClassifiers on the same file (e.g. for comparing different settings) + # How many cores to use. Overwrites model config + n_jobs: -1 + # All classification algorithms in scikit-learn are supported # (https://scikit-learn.org/stable/modules/classes.html) model_cls: ExtraTreesClassifier model_config: n_estimators: 10 max_depth: 10 - n_jobs: -1 QualityQuery: # Event Selection performed before training the models quality_criteria:

ar-L@3nYRobNx*V>AZ#y(uep=6$4$8Jv$P9*+sunFOwy$nbb=cPk` zL~LnXw}KCJXahS=`Y?nMh;HAA*p6TB(DQ23FE>C&+OO#=-*Bf0GdPodRc z;ZS~^w(?5R153W~Of(ECJ5Vhd7Bk+eC7$m!!GqIykaD>0;?M3a$lRuNDkQ)z_+-5A z8r0!`Gv8V(biK>`^6Yz@^ZOnz7US?+zi2!|66Etd8v3v+*CMK{*%dpdq7GaBQnA+U z<%|sXFl&6|ah+PwZerh4pH23Po^~BCwp$=Ecn;#{}aC>|IejDZI>vxKqO`Dm7b~P-U%sz-5sA@?B zVjpKNcM3g)f7IX!jHA`PAyDwEnQA&)_Hgcps6~{CKyOkwWKTC@0vq9qwt%M?$ZZh6 z{B~;UVlap)xkKCX@+ZWQ8UVs1RrxH&3!V z0T2_8%o}ayJXmC4aSYl#IfJ`h5_?kV(B4#EetuKub1fY8! z{R{MWK5~0!4jMg8@CO2|4(Zuw_6yeF)6;HLE? z5SFxSpgL%rH(lsk$p$*IPKma;rp}zDX>PWxsx131t0>f*AE-xM@cD2^J6h%ZdDfW7 z_S+bBK!u2|QQaE0-JW?UDKRHxIS|jn0%XC}pd9>u4JvS~9%1EBfUNpKSF{%{UV@cW zK8m6t%ZYpFhpiDpl;E!b4}&N9THeN$RG05#!~9B-&frcPiF7ws*d_ePof{>Sa_7Xr zS0%*cCihMRL)wCgzt`68dTd#8QO+%;7|7#!yUY+$S!?_tzN+A82*(NNa#01B2?4?Uoy{Niq3D z$1OX%0h*C%vfAq&smo7602poz`A?GQBKdZacM!?BquWEcMn~y~rr6yoC;X@zO`G?eC81^N@_eMi;9usz>2a1i z#<(~q^I+sJs&@lWeM`m%UCbxq_=X?V6dyMTR9fh~I)_2i&in&EqB%1gX;Uxlis41X zZssq-B0fO`fT#en!H~UBi^~~$Qo9oQq&d4fles&)L;mVGfd{=A-??)~&m0RfQEXoO zX06oUi0ZC`+P`r0O5SvM9?C^$lHvQ@lA5rt<)UQ6ck{CeUd5fK*w)4}eHEXAg!fTF zwgN!zB8JnS24bt?(wxs+kV;XY>DHSph>>vsnQ;DW|GC>g;6n|FqDi_a^HBY=vrmc= zeERf0z*k5ng~BlOrmCADbO&$br$U&Ptd6eeFcu;^(jT6ASsr$KvKp%XL8xgG@2uw1 zr~wD(!65ZU`@Coy(B{wcs9vAJHm~}VrBCXneyEwy#aP)D$uYN*|2e}sW427;L508P zxlc?C|8vR>9^R9fc>SQ^HV?H&2lt`{oQSa%Wu43Ki$!ShUpKPulplt3OcKS>sJ|+Q z9u4>WGMwIjtAYITs=VBLRa;q>@=h6t&0&DwUXMd_NOwTu8bJW%-xD}epVtx99weYl z)z`zpLU3`q7WV>2!N$djv`g(Q7%haR%zXeakGXvEr-%Nv2UJ1oUp~4Q$|HB3#6;+p z%TlI(@G2Bp8BRQIR-QB=ll}7B37`GG`uQ$t8AIfmtmPYLsJ(A=;E#V`{i?1q;qNDk zmI&&$GiTiYcUr^YJVb?@J^(m>G1SXZ!as51;pE$^>~?hgJmw*5L_z(r*S_NV(F+E zQ=6jP_pir)9987NwC{2Ap3F`VN*a?55AkMH!-+A z#5)kfv8!XbBBWWr4QWN&oIc_QB4PjcZ7vXdo)b7dp9hBPhm+@x=bM`=($(}Y&%MY3X$BpCb=MADpC~| z{s@5)A%6($x0Edha;73absoXM0cPnKZBfG*)+?ij0?hs#1zjXU5SInTIHOIfA( zp@IJHmXaqC21(}Ec8YBYFlNzC+zGOvm6v5_Q{{Y2O{`U-uy7?_I|$}L>F-#k%+s8n z&qwu2H%gDb)jp<|V$-T3bE6Pd25brfvibtt zl%U*C7$aSYJzi$s;IVba6?ncK_)T!i2%^qr9no>&&Ay#>wZ3c%Ca!#_)Nk_M<3*KS z<$I`0;?XmunQGgt00NuRnA)(X9n)m&-ex5yQemukeb!NrVC=$Qo)xyGs zJ>kKwhDTZBr5vKj6>ZCX%MM8HYEl%H{>%m?9dIc0k6=dU+=m+eDXhG{Rd?iS0tI>8 z1N&B*&Kk{_y$s5V3o_=@>bDomW@<>=Y+{m{bF`agVBt%rma=&-a540Ap?6>lQd7GG zR~)pt;t@D>x*~J`hzBr6USgs`DKh)v+cUt5)Mzn zLhH32LD>IzjgHjwGR5CNw_Xz&5W}uTZDjeKfso*H{lZ&GvwcQcOyzUhbDhjS3;VHP zda8XMdbqhGm)Sg{S0(`XOVC_SbLOZFJoYTZH)j0F+^ia{WuU=@J!pnTC##4iOj_Xb z%>-!Ky8D?pRiFX*h|O6rPtbQE1ev3bw3* z7cUrg1d6MMt5&&5=-Qmpl1O%)MQdexnfmHAhonfLp>0dOmPR9$x<6tGG=#yaSrZy7 zGz{OnSS@4~FrQ1H0K+Eq#~?a1Ww;DZo5E}Ka+Qh=_e-;6fu8?)vJoR44FQ9U>qOVs|)QK#ZPkh4gs zFAq-bjRec0o;dG?mImK_sSEoV$R=Mx$3?dnRE3&)^O>ygS)nb#ZB})afM>Zw($Pk{f2UvyoB+@<2}gr= z=#l0OMTZZsTTWVO;+=yq27K~<^gG0pu*-~P;d;&VP0&EolHo_UnSBJ@Yy` z4ph(y9KI~}L|pORQLvgU28@jQnxes)y|{T-yk#y5oZR|=Pri$nB{Wc_!{K)XIassd z-jDH_GKgKhvlsCG!F6_u&!FLLYy4MG7@W+=X;=P9dBZZ{&I7l)&3%3%WKX5!KeTL- z*PA<_SVsEyk2U+|XaHa4{6^;?;_y*ky%`cO?EhbAKV2|k$2>pW)tMZhZHw3KZ)Z;i zmm7fM%EuH&(=VKIg7kd#!bhtn-~yeNK?PrX)xljbum+~g*s06HA*yT)vly0NXUti_ z@agl|Etr%rT?d0EJIy9NqVd7+M6ek2K7ufKK;$E-)8|F;BNng^Tb-ye=8Z_Vcd_I) zb3pd!czl|EkLDq)_3%zg$^E5!Iuj4X zHN#_@vQoMw=>g4@>^V{-vJ4gGfu@XI$4rko)qAKJgk8vpQS^R|4LZI+VQv`(JW*!VhpE(|L3>|(t-GS#Gl?VnJNIw_$>bcCFd z-GLCN9q{1gRNxwTUf3noK%?XHZ%vpLb0mLF5)(36Fdw3RGvtkCPRwEpk-b7M7#kpC zq(5y!eUycQHXhHPVV7C_sRi5F*5grnqYJ?_g;kQj&*5h7FUS<{`m0ki} zOsfp*VqwO-`ok+!AxM>LE3~c@PD^Vl6F(xbRRg{Gyqb zF2i8VTt)Imck=V}PU*Zi1F(f)t~yG@M&h?JRUy#C8LV?g(0 z+Hj^@wPe(ph%5TE*YWU>EgHwiKmq0G=|43V?yo1geVL}+KeI!rQ8;f!RuZ)mP@T-V{xTg^P^`UMA$6%fz=OQ)4; z^)sg@JmmUAmtV;U$|;Z%WjsIGaQh|R3%4RQ=#sK|hPO6_`!q#>U%#3-ccaGb+=%J| zf54zMaYLPF9lYizJ#4J`KTeZYba<9+<9!6A=yi4??^8^4w{&bnFO~ zHpjCs769teCuh#fq4^YV<9t1BN9f}n;b*KEy>M5|A1BlA{p{Wl;T>z~2c>tK|UlApu*QK+GTzn?T24A50>zjwF>A8=z%6A~1d@--f5g{-;} zw*UnFiSRczH5$$nrgq_Dhs5v#IEcw` zED2(tA6!QxP4Cx@G18>2Bk^^0cxaxL0Iud+XTI6$Og9OBUyv$6;i4HxM}6a{5Wkh; z10s3LE(Mp6^_`ek%RgHk@ivC)1A?nWC;DgO5l|np9g)!f>+#nbWM21jIJ6{rnCO`N zv~CR#uplNSesHsW8*do5P@dg-4Pm<3)XKTlovVs3p5@5Qffm8Pzc2Q3fg@0 zFIw5rkx||?OD{SMmlj4_qN%{mJ&~{wv>c>D+!Q*V0|Rn8 zp*+(0qP@ekOKy``lTh-OZJL@x5pMrszT>S6jE*X%23*v=HunZ#C4P>5%*xQS`#0I> z&-Ua$Acg(-y}v@#B-d<9MJ=C0$>90Lg<0@s)Usn{b@W{!0Hf-%arDe`C;%fBUHW1mb2dFxfbtYSK4kGu zGqTfpU^09AZA%!mZ2dEV>zdk5Pe+=AxY?e=>=5!Ui_ah7fRu@HjIy$E1mJgKa5c^Q zidHQ=a&4Yq1@#ec(C^$atL^Z~ROr--n(r?X>UY7()xhbu)+SO=Le#p**J$+-zrbm= zE)B#3sP_&bI8d0&47(J%^sRnJfpS0bBDV5eo_{jEZd{7>j{RtpZu{kLa8vush?1E@mzUKaM^#BP9s5;;O z;6{6*@38Pz?0+~=-xO_OAb>mnm(EZs+k!N3dV@cXl=av?2red|Jkl2qB9j7Ksk|?H zV2sphHT}-ODp?FZV||{M4LB939qds{p_wVd4lvI3{brh*^Z^)NhrK`uoai?y)Se1A zvtZHTAt__DH^yD}{)DO!_Lp+RU|3y;j`a6Gay9xLCQ)MV(~BX=7;0JhBEgr9#F{B< zbyNE*kMFWv*=9F=iLx`pi>mzBCcAM?)774K?8Q8)P(!#0$zY=&xCRB=<~=(l$zYI1 z9%g-S?uipD=Y-(s&_>r0(){ahruvoah#S9jc0Tyd(ujAGL1K6$%Lv>Kz(jA8VO+}N zS{>GCg9&PJ4jC?NE@8?EtQ>qxof*rZ`K$a4h0fC!-N(uV2!%OmbO^xfe01Mn{O(!u zI=+6H2+8Z?kq7zLSxhQIrY*M$#uRBOrh?4z9MC@DV)~dLq}|3*ZM>Ej!Ir!yvqKD6 zavfgJMj!e;euSEV*&>_eWtAh{CGO#0v)?aDi!Dj(9Ti+t0tI|fygZYl#u}HdR-u^m z-C5V`{0)v8^Hj^Yj?D3Sf1-cLbkRt|0Tyrw<=zMM=NnNXL)$_y&oi5JzrG1L9LaqK zNVCg4xkr5Up{i#ME5#4qM7Hn&h{l4lq zh*{`ps{@wuaHGSLy~FkTHq@skq#v^CUb#Jl`0xInjGsNk_y{j~a-{udxH616Os64? zTei?6nBMAq5t=OFGRPnmU1`gFYR$*Hz2qTBG>XP)DsV)#?4+^Z7JY8BG8^7-*Lb5; z2qC)AbtZv2fsE)rM6c|L1;ED;0nYCA%>_5U??q}t@l+<&2F%c^Qb%zU8ccB_MBCuK zM?7EeCbUhX&`-#?sVyc`i`cQ03^V$~q$z#Q8~&`I1|(4edEiJEQ{{4fQ1XHd>QLcg zuT}R%736ug1cOH35`u%!Eb_4$nS^VwK>F9}A_B@3#_vn6MvFOH7R%9`2FnqASP>5a z2g3~6F;?C%4;oG9L4hdhtShkn)X*?uAk8S+^<#KqqCSLdf7W|IHf^~L>yQ&&@A%&&%v;MUhvNy75IET$0C{QZU=3b*LIK z*t%1#q>w{;D6Nf!ib+fFm@~{Lic`BVNO( zO2CVCtv|)fs#T-Z)w#b9LzWDbWkNMC4np}HEN>u_U{#%xwSx{svl*edk2GJteQNyn4D9-BfCoq0?iIdb7T#{Tf^GESF8Mn?O*F_L2*#ZsQO2}w!a}GCTc#I6fwJs4n*uiP0)_lKMgN^^B?a~#D7!X zIh+vsC8gXH&S5tLQ0TOJ-X?J9{W4PcG?~el1BJnG|5;TtqsR^qVfmE*_X!G|xZ|K0 zQu$(`+A!cGf6E)R|2Dzr3}DB*GEG-xgK{-5_@CXNB7U8F25I+9_q*RNjUBlJ#)hX; zRr;CL%N`SU-m?o#g7m8&RW7C((d5aeUID%BSUXA0s8kpkmGami^odp3R{esZVOHxA z&kN*4MTMjv^Wcg!eBf-?BZCQ`>2p`sj$Swmie;M8P|m$5TFU|H0A0SzTe>@$GH{G2 za>2f{uI&A72MFc+d&pR>M90e9yA(6W{F7r@N#9WO&{ke{$IMpBRb;MOQ%L+z8SIOc4YU>wR;w2~F*_PS;0_Y!jqFv@%?K`Zb=f@ij0R}O zDgr`Bi@^aBA<_!)-`H|fN>q_X)b|XJ#BBr&wkb2Ap{VZ~+8@y+kSfMtvv4yejbcM( z3KFMGJvxkt!E!|?k995*9?}r6tqgFT!IbC2izLG%1DFbX|Kxa03umLOPp2P8E&|>2 zP?#rq10~D^%N+M19bkS>CO(Z^=6NK)i)9F}Ne9OMuZd)lb^S_DS#>Vkuhs)u5te2LF1sm>8`qnSIP~({;&xN%c%?>=l zwY)=}-?qa#pQW#Rkr?}Uk39RT$PFBonen+sjtq>%z3RJ=JwtX;IYY^*KghgAf?UT^ z1Jthg5esDqq0(%1zsO}ZoCwJ^o_j+5Ktnw{KVb2njncmvQj&vRsHy2N=?b0G<*~J<+kZycHvL<>zZCl0>ovgaFIM?a5GcH=6=A)D^N6Y~ zY#V~}ClfwB=WO3hc?1^Yv`m~`4|1_;KrEyC-)yPDmS0vIElk}LJ5_OIoShvwsfk_E zAA&idUWiAWdSj=Fy z6bIS}gbb8G@kGOR4HWiBn6!LP7Saa21c!1GZ(RwiB?di?oBK}#_6|8%<+E0`OB>i) zlj1G%)%Yp6!Eq9ZPqBE6i1MtIAcK5iAVLUe)fC(S;^t26!O`lN`Iuo1u&i<#yj5XS z3+^_cHk-wsN>&4p0FyRZP(f-gxj}_a&=KqW<1xfrcs`5&k@DyX)^P4w?5Vl;$sQk8E6tX}70M`vK&12o zFBPC=QGLksQR1PNdrf}{N2a~`LWjeR-ZUbW=+kyquES!jA z8)x)bTks}e!~nAhng3ihdI{7l?xIGH?wF_uD}K`(d_pJJSNvlit$vXj8JyhjO@o~m zZE6P#c9@fO0i*V4V2s3Ml0h0I7MToO{Q!+ees;iUN#CnIfNKd2uw>hsWd9L%5j$X=NsY!zjF|s0LVqf(SKyLU!AwsHuj^^_LJ@lf*}Ju8luwEC7b?3 zN0FZIWVtKHJ0N#*t=piBZky}JS0m`l*&BH-o!%32jSM$L6lqAkPQ-x+yST3GwKA5V zYo2tWP=DB4?g_oRA^I_!)L_i}mrBr*i2A>2^>rjra7ZT*-HxW0Ttf@RrtCo~q8c1K zf(F7oU=#{7aol{v0o3#tU?vK{h^YI_Xp=s5{k0wPZ+=eDMmt{@YI}7)|GDx~iDYQw z#3`&b31S&!uQQRr7b*6)+ytl8t!BVb*J!kT&=YhC4czTJ?824)lqf+HpOj_#B~y${ zeAre`r)&zQ)d~7MwNy4maRpSerHr7t<;VH*)=3=<)T4wUrxIP2e*|$XfKkCj^ZB;{ ze5v8C8M}f33I#X-ShBdBN(s`!iN_Sm6VzO9vEwX46dARceLtQdG724#sWhqARE1=O zO{b~E0cy`cYs66}Rj+;&?p8T{4;`(pW#Z!*Wmh;(LmUiFOF$64V!%-ldGuFL-udH3 z&??3Kc^d4kWbst?eo~(4r_|+xvk&2gabQ3S(A^=9;&ul;Iug~7kQ4Vo6cb~Kppf>& zL%;5MlxON4?7!zHep25TcFWF(iKyYNo~$aU=kN2&@|WwJH=@jJ_+A|~4}}MHt3(07 zlb?cnSKydP{*F4~4gYoy*wqNdKbST#U4>Kh^4-iY5z>;@K?H|tgFdJ})fupy5rKe8 z#*M}?xYX7pzT4@-7AWKa?$!Xdoh3Rrg*dr$o3DNZ%1R*8qrrgrllq%0cosTceDw+e)xX#-?=QMa`kK>h7!zx={ki1xat9ud0324Ro`~YOda8WAi$~ zIj!lDnk&V#BFnL^SX`#M^590&YE&XX)>rQv*_mDFo*IIPPvoiKRAjxoP4^uW?^VX{ zmK$A%QXeWHAghiDt<8E*RNPuryv0oRB0sIhQLyuc8KC6DT#|&>aH9^s)67p5V z>RRs0JVxShrsji>12!NZRF?-@!0M&UERI>yyb?fX1EpK+-czCW>~dg@n+f()yD={~ zl{wLTY*s)?2k#~BDW#KdoEMt*oeRgt8|hv5%#Xs4{|q%Y{BHSQx}(z=d+GQ~;CKze zxJt~u@C*AaNLklP@C|PH-UQ@bHxxjD zdOA#uD#JMJDoxSb#~2~tvcOI}(+UGceu6daB&PJuLv&Lnn4vZ~A-CJ8SG-ilJ6h!i z5u{T2cAcXwaS53&uONX`kc(-^5Dl5}MLdVTjqOQShBX+WaVptV5vjVc!E{4Ixdp99 z(=u19nY)J|U9!7FDS$=(FBY6()bn2Y`Hj#09hdA&(9)BSu&PkW?RSqItr_MW!IG*d zzfx^61D{|K?z&5pob+M}wvO|)Qww-AX2!jcSf<6RZR2bZ9iV)H2<+4qIhy10zg^D2 z#bP^qc^@=<1lhQFXRW)i+w7g;H!6d7m1@%m6gJpRRFTRjSvCvWhcC@Csc-#FL|gN~o1m62s7n~7Nmi88t^T|k6i;F< zLuH6uJ$apV{S*v_3!e}7l4dW4J24&4(*Np4JZydrI^3^(J;H;JHJ)w&cV&Rp_!6oO z_@St3apAi~;+=mlfX@U>fH#l;wth-YMc=;rM=#|+wxBQv{|1;7&#(d{YXa;<;A{Sy zqi-ql9a zLbkKa8~|p}c)SK`q1vCc!9O>;29%tX^Fc%kj!RSJE_DG~!fW}H%PGBNxoG=LuPne1dEVku{T{|)7djCCQd;6*Ec2HEl&v2^&i`P%Qgc<1=H z{NKNgebU$K``v=Yy~l2kg@2hR;75%=Z};L&7|-~(Dr)i}^t4Kn@^kvT&EXbIw)jYB zGMH@x8;Vk(Zgos{Q5r9Sb?9Au8hPN%N~S?FD|MVjeg;YEw{8(-_Ef#%>&u3Go5o-p1Ro3#zq}NV7_ClDovH{Mub{P9WXH{J|6291 zB`5RiO^t;rP|BUF%?TCg!jYXTfe9opLI^yOU>}A9;~1c`HBKZj^L8x6TW(R-n-Wb4PFEp9z8ojviYuR(=|@rcL-_NcE}EnvqAO70-8|uet_fkxLFPQ`u--DCQ4SfHu6$hAbtE{Sl)F(-}ZTz2t~b|f^D2IFg=zR!t`;m*d-O34};@F$_~Ag}GL zz6hfBfB3h8mG%mBx=wiG((sbs46vRB5(ia5r>Asq9BWbc(Cn}qC@9kR!9 zaQNN6kKcdi&vT!1UH5gp-|yG!`Kr@#%j!KbFArLyhw!SA_1w3Sv0d&Sz)Y={B8BmL7bLPzJ!_xJ}r3} z$6c`e_3e#Akroif$d~yWuSXyukgSr{uxo?Q=Ck80N8U{X zkT(+Xr^j1;w2Y5tG42b20($9|Q%ZDRenH|eOR-ETpg0q*AjB1?c4I^{d`Z9xtu8@O z)Y`CKTew45R5mDkH9`jPI8c^o=$fR>I!{}G(k_4&2XDd8C^x>cRg@6s7EglU1@AgG?Q3R6?Xv+$#K@L8oxf^<+5h$zJ*eOPJ^ch+O~?5-T(v$frw_<|=lid; zONRltZFe}l+DRCar^=6hZZ>e6AQf@%EAIDu%G9LPFutgi^lRw|+e)$`3C%&KvGF}d zE+aF7$rA^_j(0J2#!+&80n}swB*{z9C&xsjG&o9m@;e9mg-d(j92eGjf=I z_5rI?Vb`spP#ib!>_Py}g?BGQ1l;t7@1)ilGK{3!B*j?wr656c#QWF?B^h}{sdCM> z2{6(bzPp%V;MeCb4W5d{tuAf%0o_c-l8(S}51N#mKP2`bAp0ga^XzK6?vtdNUUs>l z@k_?tmMdIGujD6O;}$zlFuns?b`TbSFUCw6f!_T1NUiQ+63E9#N^R9yHI>H>BN@m8y@; zT`55k$o)QrklLayX(rsmVvD|y+5z@$D`c}nNJgpAr3|rIGO|GN%Q289n=@s%FevwT zYuR$Szkip-(h!fr%0D^(bx@mic`>&8?%*+F+wjrMHeMW?$0Kg>4dHOG9nh!%nvrgC zgc1p3fw@j;))*Y0zBGkohx6TWnTR7qyZS7~z_Wa;w+6`lpe`VH{VpXcJtm6?)7>s@ z^;^8I@N+Y_Q&(X(L7;?|v}-X0Jlr8PP)~rz;tg6e;!ED0+?kK1bV^L`<{BbsHAqJSjN%(@m5o;KC=>Ywb z-p6lurZ@OCC5Nd_(9Tl+_$ck{u)oR!l4|FSu5HcxYIP5*=QjVkSerJOK|!8TncV-Z zYm?}jmv?kb6meI?%}(G4w~)YHxgD`Y#%;bgsJxU zH`a`5&=E4d)~>xhcX^vYpki$lVT1gL^2l7t$xUG1YDljXwe6yGmMUvP9Y%n;XJAA_ zG)VhuUTvkV|NI!}9qDC6ejNcHF4wN6a^`nufzdH37e=2@i{L4Yg-TNnY{~bIu<*Ia zeF2*Q64SR~R9atF5(|!}N*3xF#8ESd?XwB*-Qbfqhub%UU9Yl;vzyQGw}SEQGjj56 zo=(qAqZ&ZBjoyhS(A)l!tN=lj3ax<{fgEYNm|k-|zZ_9A?(gZPuUHo*O9zkhW(~(l ztt}J12mu03<|Kh9Z>)|#e*zWJNo$%iuEM+Er!+C4XAh#>OS`0h)Z<}bYSV{A?zqpW z!*Jgh=$22_-$OIrVwAT25qLtJguXyD%w;k9%f&i3YMH^QI$ctFK|RCRr1ON`2IvK1 zqN6`lY$0z#jQa?hklyhM7u7K%7Kqa7(wzE(qq_W+SYS!;_ulu`D0KNRTyQH$HEDaZ zlcDOfdA!4DagOtQ=wh0OS{u>n6lgF2AI+Q9iTg{OA{d=DiIm5Ecas}K-v!do1*+6* z+HHrZ+IV2G#s+!x7eqdd8i}=Sp9}5f*;7vHz z-Xxh!F6)SC8S*`)7v=>tGZ}ZYdRDne#AdZ-dIt)!=5myRG$~ye>Jz9y@AdK5XE!x* zA;ek+J!)XX!~&{PE14c|Nc(Pa8QK^iI`5hMVzA>^eFMIJ7k@g$xNsFl2=&8R9A3f~ zyUv9q!MoO{LjtM$aj%Eyra@Z{$p&0{w=_aL=n2^_HZgvvWvjbedJDs{UN;izkg zew;Q+$X;%G^BE_*5uOmlB>wR`kY1@)tWBhj7K(7pFAjY17tRe{R|;T^=ji;xlA!gj zcq?IU{6^F#x9ZEbhV$nJ+F#HjwoXWqk5xVDX&j3QgTtw54eUbdR5C)RXgUG^9 zdKWp<6|JQz15Rs}n`ga@Cw| z+c1KVL^r6Et1e+8%sFzW;Sbnvyx#}tbj4XLk`CZ4!v~@iyvi*9g=_D)864}each)+ zG?cMX)?)nJ2zi1$`e-MxRI{>tN)SaKB5)-vrh!9 zlgX~QuQeWBrE<(y<{umh0lGu|$r~Ap5sBJs%6(XfJOuZ_ zXP)J(;<)_m&w^`^??yj6UIWwSx9C*fV!U8^@YI$!0Q@~_3i%{nHygKj@*G6-cK$At z{J8es!OMODw;LR(=%+zlhvp{-I8_Qt{xwnn#GpkGhnR#~+H#bX%)oZ7?@6sI?X0!4 zhFte=>Qf(=adnYku~F>-yml3tHG;XxVIy|(FT%<}4k_3UN+|8{HziVMprrbOZuZX{ z^p^?JxP`=h`(-6nR3S`i9-8z#o1C?DGX=CXhD+>M?5;8(8S-)PtCiDUXZW$OTbs`% z=fCXKj<)8*@5Uk7tw(Y53vhOFb{MVovB&jI0>n>J_j7eEg+Hx{StPGn9D8Y+$b;5O z+RMvvoi&wK;ee&nRkM9?|2kJpfwmGkqrI9W8)VHC{d)LY8w~o(Sz9IT3~3zNe8Mnl z`ONGUS5alHar%yEteRV3j5G49Eu7~8J<-^GG&RUM1AqM8?w?(9_hOdpxLz5R>;@8e}<3sDn=UPW4W>Y$gXa2<5pZ8+Uvy{so&vy$m6vHcH+Q6QP(!CklI0l-Vr z2mWlqnP@aJjxNJF5}f!XM1x&TA{i##q4D0U{h#MVzZW-tzgpZ-o`W7HWY1jmx>v zM;6?!5}T_Ft`I{^+L}ErWC8lv-F?-ub3Znd4YSZ#Kt}@#?}SJjdzRHbklfNbTek#C znPP$}U0KNOT<052$`hX(P}+&4oG9^J4rt&jSSkEkoDfJ3M2oz%)D$_`KgnM za;VGs6J7RS+01>)^X!)=>5?UL#Y5}hY7utR&>kM9dUqauSxKnZ(oAGjB7&D>t%WfA8cJgp$@c$m;8j45>~Jz17O@(R0@;z zBB!NJRYdhVinUl)MAs@JaES!7NiT>2O`D_r;O$gI?<4<>Z@K?yE2B)6#}{PnY62gb zQ?UH=cIOowz$o`U8!eHmKD>+z_SwY?P(@tLT3!xz>FN?*v>uj^wJ-^;Vdk-zL1jqZ z*f#_81cY>H&+CrYe=k855g2HG9$`6i3@(9hiM~W3Ofo_;A_~ny}ny+g0}mV zy6LJ;ewRX5&_)_R&QqeuAM6M*Oo8Gauw`B;8USv%wW^=3MW9zAy@#=#mh>=Z$Z~-K zf=Q+VStK(5t8%1U^eJO%(;KyGQ((BnFkTBrhYal1*ti-aJM&fV*v0Hzd^|y5U9ij$ zfp^!jO^HTx&07HA67J^vPu1yg_G|I*Q}5XW-ubwp`I`BUTsJiNGX(_91$HFlbOFM2 z->jcO2}DIWrjX(<-HHdRaB*k7-GBk#fFJ@6yS!fK3MON=wB@4rllKOM~;4M&A zIhDMny0MyhjIwiaAk%wPmW+T+OpiOX0zt^Rgn68(yCg09M7(XjK@4k&p7GxuS6+pl zXAOC>WfPzN8xCr!dq&lU8j_#n@2e5ARp1dJ1irc1kF(2*#<~lXGy}j>%@7T-oE=u}u%nhc<1z7Da?gp9> zY86Y`$`r9y1-+1iXiFmbc^YlRk|MR*)i-r+g~V&dSwksKsGS%_PkzdDp+luDrUD$IpF zB;;^yjZ^K=Csmku^iYDai@{TNG11~>obz4p|2_ghjCR-1hqPC=aZF`AWJ8HCC7E~j z;<8Sez_U~hVOP8Ye_V{CuF~W+yEX-W>%{~1SX@um=968b6&ZLpD7_zc7ESRI%VItC z`_~aRnvEEoP`=#C!a{@9@$2zN&j!ms5nc@Mc+VSK#m>j}GvG~`G{T_E!91w?EXfI{ zBvnDOwO9FBjt+lbN1gopX@i$xb`t|JT$S#f@15@ka#Dg3BagHI@P!2@nB2eBF=h33 zr+;{wng#+Q6m(+{Rg>Xd%EYX1cy=Ma5ol2$31h1{m_iyNpkf$Byw0v8kQ6Tx9x9&j&EN0_3$H_>Cqd{_rP1uI)JQXAc_o6&J+;0!@rncI#skfw*t3vD zRg6#XSRTfBOSWt;LDC~`z+;piAg1ZJ31(DBo$rXUb*6h=z24rN^BE4p3Iz3Dn^5?_ zF@oc3s#%sYUOHIEh#?riCjhqenuDT^V;k6E<9NTn$!UjRc?cx@`f033kjB^bmkYTC zWgPX^uxjN0-}m4=%kG%e-2<~qfso*t!2FG`&%9>eZf&l99K1L?6MVrI^3m#3GDTqM zyEbZ}{~}R~etIuW;MX8v^3w2E{5M~KCPBf@(vDt}{Q2lAlQ$Sby&m3PchQ}RoGMXV z!Kys~m&X}YE#@S5zyL7aWC;ZxrWu0w=kOT2!{uI_L#X>z2WCj|Xz@JTZhC?FT>}m9 zXIH{X=-2aNnO&S;e)I5`9tTr3*whP2K7ub1;-H0K*`*TF$4bd!k_6tzDcU7ISJ zr|7vx7iDX+^J@WszI5`!_D59u0CCiv^-gDysRg>)0kC;ubTJY*Ehok7rZe8Ma6V$pxeO&VnUA$8c~|u@IAa>QJ@fb5Amr?EhV7*;LlQy@6i!9n23`CS zdd^h|-tnmAL1?3mbRDbD;nn_H6ffJ^)$3{eWt`7d0kk3sE#oxiSvb zZ9CelbltZs+GM=e@EiTV4jR6?98s{Up?{)@&|4c}qZm7Zd{DdR0aYdYZPdW@8@MNJ z3X{N+;yi<-UD~u?`*4^S2w#nL5u>h9-?P=&7aZpnn)e)vAAZ&!6xjL*TX$)qWbwx$Zc@6)<{|7+2((BhEiJgq83W_%zRn% z^wOMqD$Eb!pBUWEpmuC9<1=bX9Z|8+ivB-xU^dgA-a_tCoaEVi7q>`u~h hJzM+crcqljX&*k2uuO<%tV%zBz*>N$QtKxI{tvh3#jOAU literal 0 HcmV?d00001 diff --git a/docs/ctapipe_logo_dark.webp b/docs/ctapipe_logo_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c210e55e18f25a57ce8c269f4f9161bb4f88a1b GIT binary patch literal 99660 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 hOYm9l3 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 literal 0 HcmV?d00001 From b97b531387703735247b3334bc20d333d3bf43d6 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 16:53:37 +0200 Subject: [PATCH 014/264] Updated docs, added version switcher * Added PyData theme * Modified front page * Fixed warnings during build of the docs with the Sphinx 6.2.1 * Added version switcher --- docs/_static/switcher.json | 72 + docs/conf.py | 103 +- docs/ctapipe_api/calib/index.rst | 1 + docs/ctapipe_api/calib/index_camera.rst | 3 +- docs/examples/Tools.ipynb | 8434 ++++++++++++++++++++++- docs/getting_started/index.rst | 12 +- docs/index.rst | 155 +- docs/versions.json | 12 + 8 files changed, 8690 insertions(+), 102 deletions(-) create mode 100644 docs/_static/switcher.json create mode 100644 docs/versions.json diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json new file mode 100644 index 00000000000..59a6b3a5637 --- /dev/null +++ b/docs/_static/switcher.json @@ -0,0 +1,72 @@ +[ + { + "name": "dev", + "version": "latest", + "url": "https://ctapipe.readthedocs.io/en/latest/" + }, + { + "name": "v0.19.2 (stable)", + "version": "stable", + "url": "https://ctapipe.readthedocs.io/en/stable/" + }, + { + "name": "v0.19.3", + "version": "v0.19.3", + "url": "https://ctapipe.readthedocs.io/en/v0.19.3/" + }, + { + "name": "v0.19.2", + "version": "v0.19.2", + "url": "https://ctapipe.readthedocs.io/en/v0.19.2/" + }, + { + "name": "v0.19.1", + "version": "v0.19.1", + "url": "https://ctapipe.readthedocs.io/en/v0.19.1/" + }, + { + "name": "v0.19.0", + "version": "v0.19.0", + "url": "https://ctapipe.readthedocs.io/en/v0.19.0/" + }, + { + "name": "v0.18.1", + "version": "v0.18.1", + "url": "https://ctapipe.readthedocs.io/en/v0.18.1/" + }, + { + "name": "v0.18.0", + "version": "v0.18.0", + "url": "https://ctapipe.readthedocs.io/en/v0.18.0/" + }, + { + "name": "v0.17.0", + "version": "v0.17.0", + "url": "https://ctapipe.readthedocs.io/en/v0.17.0/" + }, + { + "name": "v0.16.0", + "version": "v0.16.0", + "url": "https://ctapipe.readthedocs.io/en/v0.16.0/" + }, + { + "name": "v0.15.0", + "version": "v0.15.0", + "url": "https://ctapipe.readthedocs.io/en/v0.15.0/" + }, + { + "name": "v0.14.0", + "version": "v0.14.0", + "url": "https://ctapipe.readthedocs.io/en/v0.14.0/" + }, + { + "name": "v0.12.0-rtd", + "version": "v0.12.0-rtd", + "url": "https://ctapipe.readthedocs.io/en/v0.12.0-rtd/" + }, + { + "name": "v0.11.0-rtd", + "version": "v0.11.0-rtd", + "url": "https://ctapipe.readthedocs.io/en/v0.11.0-rtd/" + } +] diff --git a/docs/conf.py b/docs/conf.py index f2cb9a72486..cc5843d1020 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,7 @@ # Get configuration information from setup.cfg from configparser import ConfigParser +import pydata_sphinx_theme import ctapipe setup_cfg = ConfigParser() @@ -36,6 +37,7 @@ setup_metadata = dict(setup_cfg.items("metadata")) setup_options = dict(setup_cfg.items("options")) + # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. @@ -52,10 +54,13 @@ "nbsphinx", "matplotlib.sphinxext.plot_directive", "numpydoc", + "sphinx_design", "IPython.sphinxext.ipython_console_highlighting", ] + numpydoc_show_class_members = False +# numpydoc_class_members_toctree = False nbsphinx_timeout = 200 # allow max 2 minutes to build each notebook @@ -67,6 +72,8 @@ def setup(app): # fix trait aliases generating doc warnings from ctapipe.core import traits + app.add_css_file("_static/ctapipe.css") + aliases = [ "flag", "observe", @@ -119,7 +126,8 @@ def setup(app): ("py:class", "astropy.coordinates.baseframe.BaseCoordinateFrame"), ("py:class", "astropy.table.table.Table"), ("py:class", "eventio.simtel.simtelfile.SimTelFile"), - ("py:class", "ctapipe.compat.StrEnum"), + ("py:obj", "ctapipe.calib.CameraCalibrator"), # temporary fix to ignore warning + ("py:obj", "ctapipe.calib.GainSelector"), # temporary fix to ignore warning ] # The suffix(es) of source filenames. @@ -182,32 +190,86 @@ def setup(app): # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True + +# -- Version switcher ----------------------------------------------------- + +# Define the json_url for our version switcher. +json_url = "https://ctapipe.readthedocs.io/en/latest/_static/switcher.json" + +# Define the version we use for matching in the version switcher. +version_match = os.environ.get("READTHEDOCS_VERSION") +# If READTHEDOCS_VERSION doesn't exist, we're not on RTD +# If it is an integer, we're in a PR build and the version isn't correct. +if not version_match or version_match.isdigit(): + # For local development, infer the version to match from the package. + release = ctapipe.__version__ + if "dev" in release or "rc" in release: + version_match = "latest" + # We want to keep the relative reference if we are in dev mode + # but we want the whole url if we are effectively in a released version + json_url = "_static/switcher.json" + else: + version_match = release + + # -- Options for HTML output ---------------------------------------------- -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "default" +# on_rtd is whether we are on readthedocs.org +on_rtd = os.environ.get("READTHEDOCS", None) == "True" + +html_theme = "pydata_sphinx_theme" +# html_theme_path = [pydata_sphinx_theme.__path__] + + +html_favicon = "_static/favicon.ico" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = {} +html_theme_options = { + "logo": { + "image_light": "ctapipe_logo.webp", + "image_dark": "ctapipe_logo_dark.webp", + "alt_text": "ctapipe", + }, + "github_url": "https://github.com/cta-observatory/ctapipe", + "header_links_before_dropdown": 6, + "navbar_start": ["navbar-logo", "version-switcher"], + "switcher": { + "version_match": version_match, + "json_url": json_url, + }, + "use_edit_page_button": True, + "icon_links": [ + { + "name": "CTA Observatory", + "url": "https://www.cta-observatory.org/", + "type": "url", + "icon": "https://www.cta-observatory.org/wp-content/themes/ctao/favicon.ico" + }, + ], +} + +html_sidebars = { + "**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"], +} + # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] html_static_path = ["_static"] - html_context = { - "css_files": ["_static/theme_overrides.css"] # override wide tables in RTD theme + "default_mode": "light", + "github_user": "cta-observatory", + "github_repo": "ctapipe", + "github_version": "main", + "doc_path": "docs", } - -html_favicon = "_static/favicon.ico" -# -- Options for HTMLHelp output ------------------------------------------ - +html_css_files = ["ctapipe.css"] +html_file_suffix = ".html" # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". @@ -216,6 +278,7 @@ def setup(app): # Output file base name for HTML help builder. htmlhelp_basename = project + "doc" + # -- Options for LaTeX output --------------------------------------------- latex_elements = { @@ -277,19 +340,3 @@ def setup(app): "iminuit": ("https://iminuit.readthedocs.io/en/latest/", None), "traitlets": ("https://traitlets.readthedocs.io/en/stable/", None), } - -# on_rtd is whether we are on readthedocs.org -on_rtd = os.environ.get("READTHEDOCS", None) == "True" - -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme - except ImportError: - raise ImportError( - "It looks like you don't have the sphinx_rtd_theme " - "package installed. This documentation " - "uses the Read The Docs theme, so you must install this " - "first. For example, pip install sphinx_rtd_theme" - ) - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] diff --git a/docs/ctapipe_api/calib/index.rst b/docs/ctapipe_api/calib/index.rst index c4decc21eef..28a105b5f61 100644 --- a/docs/ctapipe_api/calib/index.rst +++ b/docs/ctapipe_api/calib/index.rst @@ -46,3 +46,4 @@ Reference/API .. automodapi:: ctapipe.calib :no-inheritance-diagram: + :noindex: diff --git a/docs/ctapipe_api/calib/index_camera.rst b/docs/ctapipe_api/calib/index_camera.rst index d5cea730106..897acf55a82 100644 --- a/docs/ctapipe_api/calib/index_camera.rst +++ b/docs/ctapipe_api/calib/index_camera.rst @@ -19,7 +19,7 @@ CTA Cameras (MC, prototypes and final camera calibration algorithms). CameraCalibrator **************** -The primary class in this module is the `CameraCalibrator`. This class handles +The primary class in this module is the :class:`.CameraCalibrator`. This class handles two data level transition stages for the event: * R1 -> DL0 (:ref:`image_reducers`) @@ -38,6 +38,7 @@ Reference/API ************* .. automodapi:: ctapipe.calib.camera + :no-main-docstr: ------------------------------ diff --git a/docs/examples/Tools.ipynb b/docs/examples/Tools.ipynb index 6b541cc8495..7f9322406da 100644 --- a/docs/examples/Tools.ipynb +++ b/docs/examples/Tools.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -58,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -113,18 +113,95 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "

ar-L@3nYRobNx*V>AZ#y(uep=6$4$8Jv$P9*+sunFOwy$nbb=cPk` zL~LnXw}KCJXahS=`Y?nMh;HAA*p6TB(DQ23FE>C&+OO#=-*Bf0GdPodRc z;ZS~^w(?5R153W~Of(ECJ5Vhd7Bk+eC7$m!!GqIykaD>0;?M3a$lRuNDkQ)z_+-5A z8r0!`Gv8V(biK>`^6Yz@^ZOnz7US?+zi2!|66Etd8v3v+*CMK{*%dpdq7GaBQnA+U z<%|sXFl&6|ah+PwZerh4pH23Po^~BCwp$=Ecn;#{}aC>|IejDZI>vxKqO`Dm7b~P-U%sz-5sA@?B zVjpKNcM3g)f7IX!jHA`PAyDwEnQA&)_Hgcps6~{CKyOkwWKTC@0vq9qwt%M?$ZZh6 z{B~;UVlap)xkKCX@+ZWQ8UVs1RrxH&3!V z0T2_8%o}ayJXmC4aSYl#IfJ`h5_?kV(B4#EetuKub1fY8! z{R{MWK5~0!4jMg8@CO2|4(Zuw_6yeF)6;HLE? z5SFxSpgL%rH(lsk$p$*IPKma;rp}zDX>PWxsx131t0>f*AE-xM@cD2^J6h%ZdDfW7 z_S+bBK!u2|QQaE0-JW?UDKRHxIS|jn0%XC}pd9>u4JvS~9%1EBfUNpKSF{%{UV@cW zK8m6t%ZYpFhpiDpl;E!b4}&N9THeN$RG05#!~9B-&frcPiF7ws*d_ePof{>Sa_7Xr zS0%*cCihMRL)wCgzt`68dTd#8QO+%;7|7#!yUY+$S!?_tzN+A82*(NNa#01B2?4?Uoy{Niq3D z$1OX%0h*C%vfAq&smo7602poz`A?GQBKdZacM!?BquWEcMn~y~rr6yoC;X@zO`G?eC81^N@_eMi;9usz>2a1i z#<(~q^I+sJs&@lWeM`m%UCbxq_=X?V6dyMTR9fh~I)_2i&in&EqB%1gX;Uxlis41X zZssq-B0fO`fT#en!H~UBi^~~$Qo9oQq&d4fles&)L;mVGfd{=A-??)~&m0RfQEXoO zX06oUi0ZC`+P`r0O5SvM9?C^$lHvQ@lA5rt<)UQ6ck{CeUd5fK*w)4}eHEXAg!fTF zwgN!zB8JnS24bt?(wxs+kV;XY>DHSph>>vsnQ;DW|GC>g;6n|FqDi_a^HBY=vrmc= zeERf0z*k5ng~BlOrmCADbO&$br$U&Ptd6eeFcu;^(jT6ASsr$KvKp%XL8xgG@2uw1 zr~wD(!65ZU`@Coy(B{wcs9vAJHm~}VrBCXneyEwy#aP)D$uYN*|2e}sW427;L508P zxlc?C|8vR>9^R9fc>SQ^HV?H&2lt`{oQSa%Wu43Ki$!ShUpKPulplt3OcKS>sJ|+Q z9u4>WGMwIjtAYITs=VBLRa;q>@=h6t&0&DwUXMd_NOwTu8bJW%-xD}epVtx99weYl z)z`zpLU3`q7WV>2!N$djv`g(Q7%haR%zXeakGXvEr-%Nv2UJ1oUp~4Q$|HB3#6;+p z%TlI(@G2Bp8BRQIR-QB=ll}7B37`GG`uQ$t8AIfmtmPYLsJ(A=;E#V`{i?1q;qNDk zmI&&$GiTiYcUr^YJVb?@J^(m>G1SXZ!as51;pE$^>~?hgJmw*5L_z(r*S_NV(F+E zQ=6jP_pir)9987NwC{2Ap3F`VN*a?55AkMH!-+A z#5)kfv8!XbBBWWr4QWN&oIc_QB4PjcZ7vXdo)b7dp9hBPhm+@x=bM`=($(}Y&%MY3X$BpCb=MADpC~| z{s@5)A%6($x0Edha;73absoXM0cPnKZBfG*)+?ij0?hs#1zjXU5SInTIHOIfA( zp@IJHmXaqC21(}Ec8YBYFlNzC+zGOvm6v5_Q{{Y2O{`U-uy7?_I|$}L>F-#k%+s8n z&qwu2H%gDb)jp<|V$-T3bE6Pd25brfvibtt zl%U*C7$aSYJzi$s;IVba6?ncK_)T!i2%^qr9no>&&Ay#>wZ3c%Ca!#_)Nk_M<3*KS z<$I`0;?XmunQGgt00NuRnA)(X9n)m&-ex5yQemukeb!NrVC=$Qo)xyGs zJ>kKwhDTZBr5vKj6>ZCX%MM8HYEl%H{>%m?9dIc0k6=dU+=m+eDXhG{Rd?iS0tI>8 z1N&B*&Kk{_y$s5V3o_=@>bDomW@<>=Y+{m{bF`agVBt%rma=&-a540Ap?6>lQd7GG zR~)pt;t@D>x*~J`hzBr6USgs`DKh)v+cUt5)Mzn zLhH32LD>IzjgHjwGR5CNw_Xz&5W}uTZDjeKfso*H{lZ&GvwcQcOyzUhbDhjS3;VHP zda8XMdbqhGm)Sg{S0(`XOVC_SbLOZFJoYTZH)j0F+^ia{WuU=@J!pnTC##4iOj_Xb z%>-!Ky8D?pRiFX*h|O6rPtbQE1ev3bw3* z7cUrg1d6MMt5&&5=-Qmpl1O%)MQdexnfmHAhonfLp>0dOmPR9$x<6tGG=#yaSrZy7 zGz{OnSS@4~FrQ1H0K+Eq#~?a1Ww;DZo5E}Ka+Qh=_e-;6fu8?)vJoR44FQ9U>qOVs|)QK#ZPkh4gs zFAq-bjRec0o;dG?mImK_sSEoV$R=Mx$3?dnRE3&)^O>ygS)nb#ZB})afM>Zw($Pk{f2UvyoB+@<2}gr= z=#l0OMTZZsTTWVO;+=yq27K~<^gG0pu*-~P;d;&VP0&EolHo_UnSBJ@Yy` z4ph(y9KI~}L|pORQLvgU28@jQnxes)y|{T-yk#y5oZR|=Pri$nB{Wc_!{K)XIassd z-jDH_GKgKhvlsCG!F6_u&!FLLYy4MG7@W+=X;=P9dBZZ{&I7l)&3%3%WKX5!KeTL- z*PA<_SVsEyk2U+|XaHa4{6^;?;_y*ky%`cO?EhbAKV2|k$2>pW)tMZhZHw3KZ)Z;i zmm7fM%EuH&(=VKIg7kd#!bhtn-~yeNK?PrX)xljbum+~g*s06HA*yT)vly0NXUti_ z@agl|Etr%rT?d0EJIy9NqVd7+M6ek2K7ufKK;$E-)8|F;BNng^Tb-ye=8Z_Vcd_I) zb3pd!czl|EkLDq)_3%zg$^E5!Iuj4X zHN#_@vQoMw=>g4@>^V{-vJ4gGfu@XI$4rko)qAKJgk8vpQS^R|4LZI+VQv`(JW*!VhpE(|L3>|(t-GS#Gl?VnJNIw_$>bcCFd z-GLCN9q{1gRNxwTUf3noK%?XHZ%vpLb0mLF5)(36Fdw3RGvtkCPRwEpk-b7M7#kpC zq(5y!eUycQHXhHPVV7C_sRi5F*5grnqYJ?_g;kQj&*5h7FUS<{`m0ki} zOsfp*VqwO-`ok+!AxM>LE3~c@PD^Vl6F(xbRRg{Gyqb zF2i8VTt)Imck=V}PU*Zi1F(f)t~yG@M&h?JRUy#C8LV?g(0 z+Hj^@wPe(ph%5TE*YWU>EgHwiKmq0G=|43V?yo1geVL}+KeI!rQ8;f!RuZ)mP@T-V{xTg^P^`UMA$6%fz=OQ)4; z^)sg@JmmUAmtV;U$|;Z%WjsIGaQh|R3%4RQ=#sK|hPO6_`!q#>U%#3-ccaGb+=%J| zf54zMaYLPF9lYizJ#4J`KTeZYba<9+<9!6A=yi4??^8^4w{&bnFO~ zHpjCs769teCuh#fq4^YV<9t1BN9f}n;b*KEy>M5|A1BlA{p{Wl;T>z~2c>tK|UlApu*QK+GTzn?T24A50>zjwF>A8=z%6A~1d@--f5g{-;} zw*UnFiSRczH5$$nrgq_Dhs5v#IEcw` zED2(tA6!QxP4Cx@G18>2Bk^^0cxaxL0Iud+XTI6$Og9OBUyv$6;i4HxM}6a{5Wkh; z10s3LE(Mp6^_`ek%RgHk@ivC)1A?nWC;DgO5l|np9g)!f>+#nbWM21jIJ6{rnCO`N zv~CR#uplNSesHsW8*do5P@dg-4Pm<3)XKTlovVs3p5@5Qffm8Pzc2Q3fg@0 zFIw5rkx||?OD{SMmlj4_qN%{mJ&~{wv>c>D+!Q*V0|Rn8 zp*+(0qP@ekOKy``lTh-OZJL@x5pMrszT>S6jE*X%23*v=HunZ#C4P>5%*xQS`#0I> z&-Ua$Acg(-y}v@#B-d<9MJ=C0$>90Lg<0@s)Usn{b@W{!0Hf-%arDe`C;%fBUHW1mb2dFxfbtYSK4kGu zGqTfpU^09AZA%!mZ2dEV>zdk5Pe+=AxY?e=>=5!Ui_ah7fRu@HjIy$E1mJgKa5c^Q zidHQ=a&4Yq1@#ec(C^$atL^Z~ROr--n(r?X>UY7()xhbu)+SO=Le#p**J$+-zrbm= zE)B#3sP_&bI8d0&47(J%^sRnJfpS0bBDV5eo_{jEZd{7>j{RtpZu{kLa8vush?1E@mzUKaM^#BP9s5;;O z;6{6*@38Pz?0+~=-xO_OAb>mnm(EZs+k!N3dV@cXl=av?2red|Jkl2qB9j7Ksk|?H zV2sphHT}-ODp?FZV||{M4LB939qds{p_wVd4lvI3{brh*^Z^)NhrK`uoai?y)Se1A zvtZHTAt__DH^yD}{)DO!_Lp+RU|3y;j`a6Gay9xLCQ)MV(~BX=7;0JhBEgr9#F{B< zbyNE*kMFWv*=9F=iLx`pi>mzBCcAM?)774K?8Q8)P(!#0$zY=&xCRB=<~=(l$zYI1 z9%g-S?uipD=Y-(s&_>r0(){ahruvoah#S9jc0Tyd(ujAGL1K6$%Lv>Kz(jA8VO+}N zS{>GCg9&PJ4jC?NE@8?EtQ>qxof*rZ`K$a4h0fC!-N(uV2!%OmbO^xfe01Mn{O(!u zI=+6H2+8Z?kq7zLSxhQIrY*M$#uRBOrh?4z9MC@DV)~dLq}|3*ZM>Ej!Ir!yvqKD6 zavfgJMj!e;euSEV*&>_eWtAh{CGO#0v)?aDi!Dj(9Ti+t0tI|fygZYl#u}HdR-u^m z-C5V`{0)v8^Hj^Yj?D3Sf1-cLbkRt|0Tyrw<=zMM=NnNXL)$_y&oi5JzrG1L9LaqK zNVCg4xkr5Up{i#ME5#4qM7Hn&h{l4lq zh*{`ps{@wuaHGSLy~FkTHq@skq#v^CUb#Jl`0xInjGsNk_y{j~a-{udxH616Os64? zTei?6nBMAq5t=OFGRPnmU1`gFYR$*Hz2qTBG>XP)DsV)#?4+^Z7JY8BG8^7-*Lb5; z2qC)AbtZv2fsE)rM6c|L1;ED;0nYCA%>_5U??q}t@l+<&2F%c^Qb%zU8ccB_MBCuK zM?7EeCbUhX&`-#?sVyc`i`cQ03^V$~q$z#Q8~&`I1|(4edEiJEQ{{4fQ1XHd>QLcg zuT}R%736ug1cOH35`u%!Eb_4$nS^VwK>F9}A_B@3#_vn6MvFOH7R%9`2FnqASP>5a z2g3~6F;?C%4;oG9L4hdhtShkn)X*?uAk8S+^<#KqqCSLdf7W|IHf^~L>yQ&&@A%&&%v;MUhvNy75IET$0C{QZU=3b*LIK z*t%1#q>w{;D6Nf!ib+fFm@~{Lic`BVNO( zO2CVCtv|)fs#T-Z)w#b9LzWDbWkNMC4np}HEN>u_U{#%xwSx{svl*edk2GJteQNyn4D9-BfCoq0?iIdb7T#{Tf^GESF8Mn?O*F_L2*#ZsQO2}w!a}GCTc#I6fwJs4n*uiP0)_lKMgN^^B?a~#D7!X zIh+vsC8gXH&S5tLQ0TOJ-X?J9{W4PcG?~el1BJnG|5;TtqsR^qVfmE*_X!G|xZ|K0 zQu$(`+A!cGf6E)R|2Dzr3}DB*GEG-xgK{-5_@CXNB7U8F25I+9_q*RNjUBlJ#)hX; zRr;CL%N`SU-m?o#g7m8&RW7C((d5aeUID%BSUXA0s8kpkmGami^odp3R{esZVOHxA z&kN*4MTMjv^Wcg!eBf-?BZCQ`>2p`sj$Swmie;M8P|m$5TFU|H0A0SzTe>@$GH{G2 za>2f{uI&A72MFc+d&pR>M90e9yA(6W{F7r@N#9WO&{ke{$IMpBRb;MOQ%L+z8SIOc4YU>wR;w2~F*_PS;0_Y!jqFv@%?K`Zb=f@ij0R}O zDgr`Bi@^aBA<_!)-`H|fN>q_X)b|XJ#BBr&wkb2Ap{VZ~+8@y+kSfMtvv4yejbcM( z3KFMGJvxkt!E!|?k995*9?}r6tqgFT!IbC2izLG%1DFbX|Kxa03umLOPp2P8E&|>2 zP?#rq10~D^%N+M19bkS>CO(Z^=6NK)i)9F}Ne9OMuZd)lb^S_DS#>Vkuhs)u5te2LF1sm>8`qnSIP~({;&xN%c%?>=l zwY)=}-?qa#pQW#Rkr?}Uk39RT$PFBonen+sjtq>%z3RJ=JwtX;IYY^*KghgAf?UT^ z1Jthg5esDqq0(%1zsO}ZoCwJ^o_j+5Ktnw{KVb2njncmvQj&vRsHy2N=?b0G<*~J<+kZycHvL<>zZCl0>ovgaFIM?a5GcH=6=A)D^N6Y~ zY#V~}ClfwB=WO3hc?1^Yv`m~`4|1_;KrEyC-)yPDmS0vIElk}LJ5_OIoShvwsfk_E zAA&idUWiAWdSj=Fy z6bIS}gbb8G@kGOR4HWiBn6!LP7Saa21c!1GZ(RwiB?di?oBK}#_6|8%<+E0`OB>i) zlj1G%)%Yp6!Eq9ZPqBE6i1MtIAcK5iAVLUe)fC(S;^t26!O`lN`Iuo1u&i<#yj5XS z3+^_cHk-wsN>&4p0FyRZP(f-gxj}_a&=KqW<1xfrcs`5&k@DyX)^P4w?5Vl;$sQk8E6tX}70M`vK&12o zFBPC=QGLksQR1PNdrf}{N2a~`LWjeR-ZUbW=+kyquES!jA z8)x)bTks}e!~nAhng3ihdI{7l?xIGH?wF_uD}K`(d_pJJSNvlit$vXj8JyhjO@o~m zZE6P#c9@fO0i*V4V2s3Ml0h0I7MToO{Q!+ees;iUN#CnIfNKd2uw>hsWd9L%5j$X=NsY!zjF|s0LVqf(SKyLU!AwsHuj^^_LJ@lf*}Ju8luwEC7b?3 zN0FZIWVtKHJ0N#*t=piBZky}JS0m`l*&BH-o!%32jSM$L6lqAkPQ-x+yST3GwKA5V zYo2tWP=DB4?g_oRA^I_!)L_i}mrBr*i2A>2^>rjra7ZT*-HxW0Ttf@RrtCo~q8c1K zf(F7oU=#{7aol{v0o3#tU?vK{h^YI_Xp=s5{k0wPZ+=eDMmt{@YI}7)|GDx~iDYQw z#3`&b31S&!uQQRr7b*6)+ytl8t!BVb*J!kT&=YhC4czTJ?824)lqf+HpOj_#B~y${ zeAre`r)&zQ)d~7MwNy4maRpSerHr7t<;VH*)=3=<)T4wUrxIP2e*|$XfKkCj^ZB;{ ze5v8C8M}f33I#X-ShBdBN(s`!iN_Sm6VzO9vEwX46dARceLtQdG724#sWhqARE1=O zO{b~E0cy`cYs66}Rj+;&?p8T{4;`(pW#Z!*Wmh;(LmUiFOF$64V!%-ldGuFL-udH3 z&??3Kc^d4kWbst?eo~(4r_|+xvk&2gabQ3S(A^=9;&ul;Iug~7kQ4Vo6cb~Kppf>& zL%;5MlxON4?7!zHep25TcFWF(iKyYNo~$aU=kN2&@|WwJH=@jJ_+A|~4}}MHt3(07 zlb?cnSKydP{*F4~4gYoy*wqNdKbST#U4>Kh^4-iY5z>;@K?H|tgFdJ})fupy5rKe8 z#*M}?xYX7pzT4@-7AWKa?$!Xdoh3Rrg*dr$o3DNZ%1R*8qrrgrllq%0cosTceDw+e)xX#-?=QMa`kK>h7!zx={ki1xat9ud0324Ro`~YOda8WAi$~ zIj!lDnk&V#BFnL^SX`#M^590&YE&XX)>rQv*_mDFo*IIPPvoiKRAjxoP4^uW?^VX{ zmK$A%QXeWHAghiDt<8E*RNPuryv0oRB0sIhQLyuc8KC6DT#|&>aH9^s)67p5V z>RRs0JVxShrsji>12!NZRF?-@!0M&UERI>yyb?fX1EpK+-czCW>~dg@n+f()yD={~ zl{wLTY*s)?2k#~BDW#KdoEMt*oeRgt8|hv5%#Xs4{|q%Y{BHSQx}(z=d+GQ~;CKze zxJt~u@C*AaNLklP@C|PH-UQ@bHxxjD zdOA#uD#JMJDoxSb#~2~tvcOI}(+UGceu6daB&PJuLv&Lnn4vZ~A-CJ8SG-ilJ6h!i z5u{T2cAcXwaS53&uONX`kc(-^5Dl5}MLdVTjqOQShBX+WaVptV5vjVc!E{4Ixdp99 z(=u19nY)J|U9!7FDS$=(FBY6()bn2Y`Hj#09hdA&(9)BSu&PkW?RSqItr_MW!IG*d zzfx^61D{|K?z&5pob+M}wvO|)Qww-AX2!jcSf<6RZR2bZ9iV)H2<+4qIhy10zg^D2 z#bP^qc^@=<1lhQFXRW)i+w7g;H!6d7m1@%m6gJpRRFTRjSvCvWhcC@Csc-#FL|gN~o1m62s7n~7Nmi88t^T|k6i;F< zLuH6uJ$apV{S*v_3!e}7l4dW4J24&4(*Np4JZydrI^3^(J;H;JHJ)w&cV&Rp_!6oO z_@St3apAi~;+=mlfX@U>fH#l;wth-YMc=;rM=#|+wxBQv{|1;7&#(d{YXa;<;A{Sy zqi-ql9a zLbkKa8~|p}c)SK`q1vCc!9O>;29%tX^Fc%kj!RSJE_DG~!fW}H%PGBNxoG=LuPne1dEVku{T{|)7djCCQd;6*Ec2HEl&v2^&i`P%Qgc<1=H z{NKNgebU$K``v=Yy~l2kg@2hR;75%=Z};L&7|-~(Dr)i}^t4Kn@^kvT&EXbIw)jYB zGMH@x8;Vk(Zgos{Q5r9Sb?9Au8hPN%N~S?FD|MVjeg;YEw{8(-_Ef#%>&u3Go5o-p1Ro3#zq}NV7_ClDovH{Mub{P9WXH{J|6291 zB`5RiO^t;rP|BUF%?TCg!jYXTfe9opLI^yOU>}A9;~1c`HBKZj^L8x6TW(R-n-Wb4PFEp9z8ojviYuR(=|@rcL-_NcE}EnvqAO70-8|uet_fkxLFPQ`u--DCQ4SfHu6$hAbtE{Sl)F(-}ZTz2t~b|f^D2IFg=zR!t`;m*d-O34};@F$_~Ag}GL zz6hfBfB3h8mG%mBx=wiG((sbs46vRB5(ia5r>Asq9BWbc(Cn}qC@9kR!9 zaQNN6kKcdi&vT!1UH5gp-|yG!`Kr@#%j!KbFArLyhw!SA_1w3Sv0d&Sz)Y={B8BmL7bLPzJ!_xJ}r3} z$6c`e_3e#Akroif$d~yWuSXyukgSr{uxo?Q=Ck80N8U{X zkT(+Xr^j1;w2Y5tG42b20($9|Q%ZDRenH|eOR-ETpg0q*AjB1?c4I^{d`Z9xtu8@O z)Y`CKTew45R5mDkH9`jPI8c^o=$fR>I!{}G(k_4&2XDd8C^x>cRg@6s7EglU1@AgG?Q3R6?Xv+$#K@L8oxf^<+5h$zJ*eOPJ^ch+O~?5-T(v$frw_<|=lid; zONRltZFe}l+DRCar^=6hZZ>e6AQf@%EAIDu%G9LPFutgi^lRw|+e)$`3C%&KvGF}d zE+aF7$rA^_j(0J2#!+&80n}swB*{z9C&xsjG&o9m@;e9mg-d(j92eGjf=I z_5rI?Vb`spP#ib!>_Py}g?BGQ1l;t7@1)ilGK{3!B*j?wr656c#QWF?B^h}{sdCM> z2{6(bzPp%V;MeCb4W5d{tuAf%0o_c-l8(S}51N#mKP2`bAp0ga^XzK6?vtdNUUs>l z@k_?tmMdIGujD6O;}$zlFuns?b`TbSFUCw6f!_T1NUiQ+63E9#N^R9yHI>H>BN@m8y@; zT`55k$o)QrklLayX(rsmVvD|y+5z@$D`c}nNJgpAr3|rIGO|GN%Q289n=@s%FevwT zYuR$Szkip-(h!fr%0D^(bx@mic`>&8?%*+F+wjrMHeMW?$0Kg>4dHOG9nh!%nvrgC zgc1p3fw@j;))*Y0zBGkohx6TWnTR7qyZS7~z_Wa;w+6`lpe`VH{VpXcJtm6?)7>s@ z^;^8I@N+Y_Q&(X(L7;?|v}-X0Jlr8PP)~rz;tg6e;!ED0+?kK1bV^L`<{BbsHAqJSjN%(@m5o;KC=>Ywb z-p6lurZ@OCC5Nd_(9Tl+_$ck{u)oR!l4|FSu5HcxYIP5*=QjVkSerJOK|!8TncV-Z zYm?}jmv?kb6meI?%}(G4w~)YHxgD`Y#%;bgsJxU zH`a`5&=E4d)~>xhcX^vYpki$lVT1gL^2l7t$xUG1YDljXwe6yGmMUvP9Y%n;XJAA_ zG)VhuUTvkV|NI!}9qDC6ejNcHF4wN6a^`nufzdH37e=2@i{L4Yg-TNnY{~bIu<*Ia zeF2*Q64SR~R9atF5(|!}N*3xF#8ESd?XwB*-Qbfqhub%UU9Yl;vzyQGw}SEQGjj56 zo=(qAqZ&ZBjoyhS(A)l!tN=lj3ax<{fgEYNm|k-|zZ_9A?(gZPuUHo*O9zkhW(~(l ztt}J12mu03<|Kh9Z>)|#e*zWJNo$%iuEM+Er!+C4XAh#>OS`0h)Z<}bYSV{A?zqpW z!*Jgh=$22_-$OIrVwAT25qLtJguXyD%w;k9%f&i3YMH^QI$ctFK|RCRr1ON`2IvK1 zqN6`lY$0z#jQa?hklyhM7u7K%7Kqa7(wzE(qq_W+SYS!;_ulu`D0KNRTyQH$HEDaZ zlcDOfdA!4DagOtQ=wh0OS{u>n6lgF2AI+Q9iTg{OA{d=DiIm5Ecas}K-v!do1*+6* z+HHrZ+IV2G#s+!x7eqdd8i}=Sp9}5f*;7vHz z-Xxh!F6)SC8S*`)7v=>tGZ}ZYdRDne#AdZ-dIt)!=5myRG$~ye>Jz9y@AdK5XE!x* zA;ek+J!)XX!~&{PE14c|Nc(Pa8QK^iI`5hMVzA>^eFMIJ7k@g$xNsFl2=&8R9A3f~ zyUv9q!MoO{LjtM$aj%Eyra@Z{$p&0{w=_aL=n2^_HZgvvWvjbedJDs{UN;izkg zew;Q+$X;%G^BE_*5uOmlB>wR`kY1@)tWBhj7K(7pFAjY17tRe{R|;T^=ji;xlA!gj zcq?IU{6^F#x9ZEbhV$nJ+F#HjwoXWqk5xVDX&j3QgTtw54eUbdR5C)RXgUG^9 zdKWp<6|JQz15Rs}n`ga@Cw| z+c1KVL^r6Et1e+8%sFzW;Sbnvyx#}tbj4XLk`CZ4!v~@iyvi*9g=_D)864}each)+ zG?cMX)?)nJ2zi1$`e-MxRI{>tN)SaKB5)-vrh!9 zlgX~QuQeWBrE<(y<{umh0lGu|$r~Ap5sBJs%6(XfJOuZ_ zXP)J(;<)_m&w^`^??yj6UIWwSx9C*fV!U8^@YI$!0Q@~_3i%{nHygKj@*G6-cK$At z{J8es!OMODw;LR(=%+zlhvp{-I8_Qt{xwnn#GpkGhnR#~+H#bX%)oZ7?@6sI?X0!4 zhFte=>Qf(=adnYku~F>-yml3tHG;XxVIy|(FT%<}4k_3UN+|8{HziVMprrbOZuZX{ z^p^?JxP`=h`(-6nR3S`i9-8z#o1C?DGX=CXhD+>M?5;8(8S-)PtCiDUXZW$OTbs`% z=fCXKj<)8*@5Uk7tw(Y53vhOFb{MVovB&jI0>n>J_j7eEg+Hx{StPGn9D8Y+$b;5O z+RMvvoi&wK;ee&nRkM9?|2kJpfwmGkqrI9W8)VHC{d)LY8w~o(Sz9IT3~3zNe8Mnl z`ONGUS5alHar%yEteRV3j5G49Eu7~8J<-^GG&RUM1AqM8?w?(9_hOdpxLz5R>;@8e}<3sDn=UPW4W>Y$gXa2<5pZ8+Uvy{so&vy$m6vHcH+Q6QP(!CklI0l-Vr z2mWlqnP@aJjxNJF5}f!XM1x&TA{i##q4D0U{h#MVzZW-tzgpZ-o`W7HWY1jmx>v zM;6?!5}T_Ft`I{^+L}ErWC8lv-F?-ub3Znd4YSZ#Kt}@#?}SJjdzRHbklfNbTek#C znPP$}U0KNOT<052$`hX(P}+&4oG9^J4rt&jSSkEkoDfJ3M2oz%)D$_`KgnM za;VGs6J7RS+01>)^X!)=>5?UL#Y5}hY7utR&>kM9dUqauSxKnZ(oAGjB7&D>t%WfA8cJgp$@c$m;8j45>~Jz17O@(R0@;z zBB!NJRYdhVinUl)MAs@JaES!7NiT>2O`D_r;O$gI?<4<>Z@K?yE2B)6#}{PnY62gb zQ?UH=cIOowz$o`U8!eHmKD>+z_SwY?P(@tLT3!xz>FN?*v>uj^wJ-^;Vdk-zL1jqZ z*f#_81cY>H&+CrYe=k855g2HG9$`6i3@(9hiM~W3Ofo_;A_~ny}ny+g0}mV zy6LJ;ewRX5&_)_R&QqeuAM6M*Oo8Gauw`B;8USv%wW^=3MW9zAy@#=#mh>=Z$Z~-K zf=Q+VStK(5t8%1U^eJO%(;KyGQ((BnFkTBrhYal1*ti-aJM&fV*v0Hzd^|y5U9ij$ zfp^!jO^HTx&07HA67J^vPu1yg_G|I*Q}5XW-ubwp`I`BUTsJiNGX(_91$HFlbOFM2 z->jcO2}DIWrjX(<-HHdRaB*k7-GBk#fFJ@6yS!fK3MON=wB@4rllKOM~;4M&A zIhDMny0MyhjIwiaAk%wPmW+T+OpiOX0zt^Rgn68(yCg09M7(XjK@4k&p7GxuS6+pl zXAOC>WfPzN8xCr!dq&lU8j_#n@2e5ARp1dJ1irc1kF(2*#<~lXGy}j>%@7T-oE=u}u%nhc<1z7Da?gp9> zY86Y`$`r9y1-+1iXiFmbc^YlRk|MR*)i-r+g~V&dSwksKsGS%_PkzdDp+luDrUD$IpF zB;;^yjZ^K=Csmku^iYDai@{TNG11~>obz4p|2_ghjCR-1hqPC=aZF`AWJ8HCC7E~j z;<8Sez_U~hVOP8Ye_V{CuF~W+yEX-W>%{~1SX@um=968b6&ZLpD7_zc7ESRI%VItC z`_~aRnvEEoP`=#C!a{@9@$2zN&j!ms5nc@Mc+VSK#m>j}GvG~`G{T_E!91w?EXfI{ zBvnDOwO9FBjt+lbN1gopX@i$xb`t|JT$S#f@15@ka#Dg3BagHI@P!2@nB2eBF=h33 zr+;{wng#+Q6m(+{Rg>Xd%EYX1cy=Ma5ol2$31h1{m_iyNpkf$Byw0v8kQ6Tx9x9&j&EN0_3$H_>Cqd{_rP1uI)JQXAc_o6&J+;0!@rncI#skfw*t3vD zRg6#XSRTfBOSWt;LDC~`z+;piAg1ZJ31(DBo$rXUb*6h=z24rN^BE4p3Iz3Dn^5?_ zF@oc3s#%sYUOHIEh#?riCjhqenuDT^V;k6E<9NTn$!UjRc?cx@`f033kjB^bmkYTC zWgPX^uxjN0-}m4=%kG%e-2<~qfso*t!2FG`&%9>eZf&l99K1L?6MVrI^3m#3GDTqM zyEbZ}{~}R~etIuW;MX8v^3w2E{5M~KCPBf@(vDt}{Q2lAlQ$Sby&m3PchQ}RoGMXV z!Kys~m&X}YE#@S5zyL7aWC;ZxrWu0w=kOT2!{uI_L#X>z2WCj|Xz@JTZhC?FT>}m9 zXIH{X=-2aNnO&S;e)I5`9tTr3*whP2K7ub1;-H0K*`*TF$4bd!k_6tzDcU7ISJ zr|7vx7iDX+^J@WszI5`!_D59u0CCiv^-gDysRg>)0kC;ubTJY*Ehok7rZe8Ma6V$pxeO&VnUA$8c~|u@IAa>QJ@fb5Amr?EhV7*;LlQy@6i!9n23`CS zdd^h|-tnmAL1?3mbRDbD;nn_H6ffJ^)$3{eWt`7d0kk3sE#oxiSvb zZ9CelbltZs+GM=e@EiTV4jR6?98s{Up?{)@&|4c}qZm7Zd{DdR0aYdYZPdW@8@MNJ z3X{N+;yi<-UD~u?`*4^S2w#nL5u>h9-?P=&7aZpnn)e)vAAZ&!6xjL*TX$)qWbwx$Zc@6)<{|7+2((BhEiJgq83W_%zRn% z^wOMqD$Eb!pBUWEpmuC9<1=bX9Z|8+ivB-xU^dgA-a_tCoaEVi7q>`u~h hJzM+crcqljX&*k2uuO<%tV%zBz*>N$QtKxI{tvh3#jOAU literal 0 HcmV?d00001 diff --git a/docs/ctapipe_logo_dark.webp b/docs/ctapipe_logo_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c210e55e18f25a57ce8c269f4f9161bb4f88a1b GIT binary patch literal 99660 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 hOYm9l3 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 literal 0 HcmV?d00001 From 11275ede2f5cd6479965cf761e974a64a50b5280 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Tue, 4 Jul 2023 15:34:59 +0200 Subject: [PATCH 008/264] Updated docs, added version switcher * Added PyData theme * Modified front page * Fixed warnings during build of the docs with the Sphinx 6.2.1 * Added version switcher --- docs/_static/switcher.json | 72 + docs/conf.py | 102 +- docs/ctapipe_api/calib/index.rst | 1 + docs/ctapipe_api/calib/index_camera.rst | 3 +- docs/examples/Tools.ipynb | 8434 ++++++++++++++++++++++- docs/getting_started/index.rst | 12 +- docs/index.rst | 155 +- docs/versions.json | 12 + 8 files changed, 8690 insertions(+), 101 deletions(-) create mode 100644 docs/_static/switcher.json create mode 100644 docs/versions.json diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json new file mode 100644 index 00000000000..59a6b3a5637 --- /dev/null +++ b/docs/_static/switcher.json @@ -0,0 +1,72 @@ +[ + { + "name": "dev", + "version": "latest", + "url": "https://ctapipe.readthedocs.io/en/latest/" + }, + { + "name": "v0.19.2 (stable)", + "version": "stable", + "url": "https://ctapipe.readthedocs.io/en/stable/" + }, + { + "name": "v0.19.3", + "version": "v0.19.3", + "url": "https://ctapipe.readthedocs.io/en/v0.19.3/" + }, + { + "name": "v0.19.2", + "version": "v0.19.2", + "url": "https://ctapipe.readthedocs.io/en/v0.19.2/" + }, + { + "name": "v0.19.1", + "version": "v0.19.1", + "url": "https://ctapipe.readthedocs.io/en/v0.19.1/" + }, + { + "name": "v0.19.0", + "version": "v0.19.0", + "url": "https://ctapipe.readthedocs.io/en/v0.19.0/" + }, + { + "name": "v0.18.1", + "version": "v0.18.1", + "url": "https://ctapipe.readthedocs.io/en/v0.18.1/" + }, + { + "name": "v0.18.0", + "version": "v0.18.0", + "url": "https://ctapipe.readthedocs.io/en/v0.18.0/" + }, + { + "name": "v0.17.0", + "version": "v0.17.0", + "url": "https://ctapipe.readthedocs.io/en/v0.17.0/" + }, + { + "name": "v0.16.0", + "version": "v0.16.0", + "url": "https://ctapipe.readthedocs.io/en/v0.16.0/" + }, + { + "name": "v0.15.0", + "version": "v0.15.0", + "url": "https://ctapipe.readthedocs.io/en/v0.15.0/" + }, + { + "name": "v0.14.0", + "version": "v0.14.0", + "url": "https://ctapipe.readthedocs.io/en/v0.14.0/" + }, + { + "name": "v0.12.0-rtd", + "version": "v0.12.0-rtd", + "url": "https://ctapipe.readthedocs.io/en/v0.12.0-rtd/" + }, + { + "name": "v0.11.0-rtd", + "version": "v0.11.0-rtd", + "url": "https://ctapipe.readthedocs.io/en/v0.11.0-rtd/" + } +] diff --git a/docs/conf.py b/docs/conf.py index b848261c4d8..cc5843d1020 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,7 @@ # Get configuration information from setup.cfg from configparser import ConfigParser +import pydata_sphinx_theme import ctapipe setup_cfg = ConfigParser() @@ -36,6 +37,7 @@ setup_metadata = dict(setup_cfg.items("metadata")) setup_options = dict(setup_cfg.items("options")) + # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. @@ -52,10 +54,13 @@ "nbsphinx", "matplotlib.sphinxext.plot_directive", "numpydoc", + "sphinx_design", "IPython.sphinxext.ipython_console_highlighting", ] + numpydoc_show_class_members = False +# numpydoc_class_members_toctree = False nbsphinx_timeout = 200 # allow max 2 minutes to build each notebook @@ -67,6 +72,8 @@ def setup(app): # fix trait aliases generating doc warnings from ctapipe.core import traits + app.add_css_file("_static/ctapipe.css") + aliases = [ "flag", "observe", @@ -119,6 +126,8 @@ def setup(app): ("py:class", "astropy.coordinates.baseframe.BaseCoordinateFrame"), ("py:class", "astropy.table.table.Table"), ("py:class", "eventio.simtel.simtelfile.SimTelFile"), + ("py:obj", "ctapipe.calib.CameraCalibrator"), # temporary fix to ignore warning + ("py:obj", "ctapipe.calib.GainSelector"), # temporary fix to ignore warning ] # The suffix(es) of source filenames. @@ -181,32 +190,86 @@ def setup(app): # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True + +# -- Version switcher ----------------------------------------------------- + +# Define the json_url for our version switcher. +json_url = "https://ctapipe.readthedocs.io/en/latest/_static/switcher.json" + +# Define the version we use for matching in the version switcher. +version_match = os.environ.get("READTHEDOCS_VERSION") +# If READTHEDOCS_VERSION doesn't exist, we're not on RTD +# If it is an integer, we're in a PR build and the version isn't correct. +if not version_match or version_match.isdigit(): + # For local development, infer the version to match from the package. + release = ctapipe.__version__ + if "dev" in release or "rc" in release: + version_match = "latest" + # We want to keep the relative reference if we are in dev mode + # but we want the whole url if we are effectively in a released version + json_url = "_static/switcher.json" + else: + version_match = release + + # -- Options for HTML output ---------------------------------------------- -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "default" +# on_rtd is whether we are on readthedocs.org +on_rtd = os.environ.get("READTHEDOCS", None) == "True" + +html_theme = "pydata_sphinx_theme" +# html_theme_path = [pydata_sphinx_theme.__path__] + + +html_favicon = "_static/favicon.ico" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = {} +html_theme_options = { + "logo": { + "image_light": "ctapipe_logo.webp", + "image_dark": "ctapipe_logo_dark.webp", + "alt_text": "ctapipe", + }, + "github_url": "https://github.com/cta-observatory/ctapipe", + "header_links_before_dropdown": 6, + "navbar_start": ["navbar-logo", "version-switcher"], + "switcher": { + "version_match": version_match, + "json_url": json_url, + }, + "use_edit_page_button": True, + "icon_links": [ + { + "name": "CTA Observatory", + "url": "https://www.cta-observatory.org/", + "type": "url", + "icon": "https://www.cta-observatory.org/wp-content/themes/ctao/favicon.ico" + }, + ], +} + +html_sidebars = { + "**": ["sidebar-nav-bs.html", "sidebar-ethical-ads.html"], +} + # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] html_static_path = ["_static"] - html_context = { - "css_files": ["_static/theme_overrides.css"] # override wide tables in RTD theme + "default_mode": "light", + "github_user": "cta-observatory", + "github_repo": "ctapipe", + "github_version": "main", + "doc_path": "docs", } - -html_favicon = "_static/favicon.ico" -# -- Options for HTMLHelp output ------------------------------------------ - +html_css_files = ["ctapipe.css"] +html_file_suffix = ".html" # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". @@ -215,6 +278,7 @@ def setup(app): # Output file base name for HTML help builder. htmlhelp_basename = project + "doc" + # -- Options for LaTeX output --------------------------------------------- latex_elements = { @@ -276,19 +340,3 @@ def setup(app): "iminuit": ("https://iminuit.readthedocs.io/en/latest/", None), "traitlets": ("https://traitlets.readthedocs.io/en/stable/", None), } - -# on_rtd is whether we are on readthedocs.org -on_rtd = os.environ.get("READTHEDOCS", None) == "True" - -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme - except ImportError: - raise ImportError( - "It looks like you don't have the sphinx_rtd_theme " - "package installed. This documentation " - "uses the Read The Docs theme, so you must install this " - "first. For example, pip install sphinx_rtd_theme" - ) - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] diff --git a/docs/ctapipe_api/calib/index.rst b/docs/ctapipe_api/calib/index.rst index c4decc21eef..28a105b5f61 100644 --- a/docs/ctapipe_api/calib/index.rst +++ b/docs/ctapipe_api/calib/index.rst @@ -46,3 +46,4 @@ Reference/API .. automodapi:: ctapipe.calib :no-inheritance-diagram: + :noindex: diff --git a/docs/ctapipe_api/calib/index_camera.rst b/docs/ctapipe_api/calib/index_camera.rst index d5cea730106..897acf55a82 100644 --- a/docs/ctapipe_api/calib/index_camera.rst +++ b/docs/ctapipe_api/calib/index_camera.rst @@ -19,7 +19,7 @@ CTA Cameras (MC, prototypes and final camera calibration algorithms). CameraCalibrator **************** -The primary class in this module is the `CameraCalibrator`. This class handles +The primary class in this module is the :class:`.CameraCalibrator`. This class handles two data level transition stages for the event: * R1 -> DL0 (:ref:`image_reducers`) @@ -38,6 +38,7 @@ Reference/API ************* .. automodapi:: ctapipe.calib.camera + :no-main-docstr: ------------------------------ diff --git a/docs/examples/Tools.ipynb b/docs/examples/Tools.ipynb index 6b541cc8495..7f9322406da 100644 --- a/docs/examples/Tools.ipynb +++ b/docs/examples/Tools.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -58,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -113,18 +113,95 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "