arbok-inspector 1.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. arbok_inspector/__init__.py +1 -0
  2. arbok_inspector/analysis/analysis_base.py +29 -0
  3. arbok_inspector/analysis/prepare_data.py +118 -0
  4. arbok_inspector/classes/base_run.py +275 -0
  5. arbok_inspector/classes/dim.py +26 -0
  6. arbok_inspector/classes/native_run.py +172 -0
  7. arbok_inspector/classes/qcodes_run.py +65 -0
  8. arbok_inspector/cli.py +4 -0
  9. arbok_inspector/configurations/1d_plot.json +49 -0
  10. arbok_inspector/configurations/2d_plot.json +60 -0
  11. arbok_inspector/dev.py +19 -0
  12. arbok_inspector/helpers/string_formaters.py +37 -0
  13. arbok_inspector/helpers/unit_formater.py +29 -0
  14. arbok_inspector/main.py +15 -0
  15. arbok_inspector/pages/__init__.py +2 -0
  16. arbok_inspector/pages/database_browser.py +139 -0
  17. arbok_inspector/pages/greeter.py +93 -0
  18. arbok_inspector/pages/run_view.py +259 -0
  19. arbok_inspector/state.py +101 -0
  20. arbok_inspector/test.db +0 -0
  21. arbok_inspector/test_main.py +65 -0
  22. arbok_inspector/widgets/build_run_selecter.py +163 -0
  23. arbok_inspector/widgets/build_run_view_actions.py +104 -0
  24. arbok_inspector/widgets/build_xarray_grid.py +145 -0
  25. arbok_inspector/widgets/build_xarray_html.py +57 -0
  26. arbok_inspector/widgets/json_plot_settings_dialog.py +77 -0
  27. arbok_inspector/widgets/update_day_selecter.py +64 -0
  28. arbok_inspector-1.3.0.dist-info/METADATA +90 -0
  29. arbok_inspector-1.3.0.dist-info/RECORD +33 -0
  30. arbok_inspector-1.3.0.dist-info/WHEEL +5 -0
  31. arbok_inspector-1.3.0.dist-info/entry_points.txt +2 -0
  32. arbok_inspector-1.3.0.dist-info/licenses/LICENSE +21 -0
  33. arbok_inspector-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,104 @@
1
+ """Module containing function to build run-view options"""
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING
4
+ import os
5
+ from nicegui import ui, app
6
+
7
+ from arbok_inspector.widgets.json_plot_settings_dialog import JsonPlotSettingsDialog
8
+ from arbok_inspector.widgets.build_xarray_grid import build_xarray_grid
9
+
10
+ if TYPE_CHECKING:
11
+ from arbok_inspector.classes.dim import Dim
12
+ from arbok_inspector.arbok_inspector.classes.base_run import BaseRun
13
+
14
+ def build_run_view_actions() -> None:
15
+ with ui.column().classes():
16
+ with ui.row():
17
+ ui.button(
18
+ text='Update ',
19
+ icon='refresh',
20
+ color='green',
21
+ on_click=lambda: build_xarray_grid(),
22
+ ).props('dense')
23
+
24
+ ui.button(
25
+ text='Debug',
26
+ icon='info',
27
+ color='red',
28
+ on_click=lambda: print_debug(),
29
+ ).classes('h-8 px-2').props('dense')
30
+ with ui.row():
31
+ dialog_1d = JsonPlotSettingsDialog('plot_dict_1D')
32
+ dialog_2d = JsonPlotSettingsDialog('plot_dict_2D')
33
+
34
+ ui.button(
35
+ text='1D settings',
36
+ color='pink',
37
+ on_click=dialog_1d.open,
38
+ ).props('dense')
39
+
40
+ ui.button(
41
+ text='2D settings',
42
+ color='orange',
43
+ on_click=dialog_2d.open,
44
+ ).props('dense')
45
+
46
+ ui.number(
47
+ label='# per col',
48
+ value=2,
49
+ format='%.0f',
50
+ on_change=lambda e: set_plots_per_column(e.value),
51
+ ).props('dense outlined').classes('w-20 h-8 text-xs mb-2')
52
+ with ui.row():
53
+ ui.button(
54
+ icon = 'file_download',
55
+ text = 'full',
56
+ color = 'blue',
57
+ on_click=download_full_dataset,
58
+ ).props('dense')
59
+ ui.button(
60
+ icon = 'file_download',
61
+ text = 'selection',
62
+ color='darkblue',
63
+ on_click=download_data_selection,
64
+ ).props('dense')
65
+
66
+ def set_plots_per_column(value: int):
67
+ """
68
+ Set the number of plots to display per column.
69
+
70
+ Args:
71
+ value (int): The number of plots per column
72
+ """
73
+ run = app.storage.tab["run"]
74
+ ui.notify(f'Setting plots per column to {value}', position='top-right')
75
+ run.plots_per_column = int(value)
76
+ build_xarray_grid()
77
+
78
+ def download_full_dataset():
79
+ """Download the full dataset as a NetCDF file."""
80
+ run = app.storage.tab["run"]
81
+ local_path = f'./run_{run.run_id}.nc'
82
+ run.full_data_set.to_netcdf(local_path)
83
+ ui.download.file(local_path)
84
+ os.remove(local_path)
85
+
86
+ def download_data_selection():
87
+ """Download the current data selection as a NetCDF file."""
88
+ run = app.storage.tab["run"]
89
+ local_path = f'./run_{run.run_id}_selection.nc'
90
+ run.last_subset.to_netcdf(local_path)
91
+ ui.download.file(local_path)
92
+ os.remove(local_path)
93
+
94
+ def print_debug(run: BaseRun):
95
+ print("\nDebugging BaseRun:")
96
+ run = app.storage.tab["run"]
97
+ for key, val in run.dim_axis_option.items():
98
+ if isinstance(val, list):
99
+ val_str = str([d.name for d in val])
100
+ elif isinstance(val, Dim):
101
+ val_str = val.name
102
+ else:
103
+ val_str = str(val)
104
+ print(f"{key}: \t {val_str}")
@@ -0,0 +1,145 @@
1
+ """Module to build a grid of xarray plots for a given run."""
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING
4
+
5
+ import math
6
+ import copy
7
+ import plotly.graph_objects as go
8
+ from nicegui import ui, app
9
+
10
+ from arbok_inspector.helpers.unit_formater import unit_formatter
11
+ from arbok_inspector.helpers.string_formaters import (
12
+ title_formater, axis_label_formater
13
+ )
14
+
15
+ if TYPE_CHECKING:
16
+ from arbok_inspector.classes.dim import Dim
17
+ from arbok_inspector.arbok_inspector.classes.base_run import BaseRun
18
+ from plotly.graph_objs import Figure
19
+
20
+
21
+ def build_xarray_grid() -> None:
22
+ """
23
+ Build a grid of xarray plots for the given run.
24
+
25
+ Args:
26
+ run (Run): The Run object containing the data to plot.
27
+
28
+ Returns:
29
+ Figure: The Plotly Figure object containing the grid of plots.
30
+ """
31
+ #client = await ui.context.client.connected()
32
+ run = app.storage.tab["run"]
33
+ container = app.storage.tab["placeholders"]['plots']
34
+ container.clear()
35
+ if run.dim_axis_option['x-axis'] is None:
36
+ ui.notify(
37
+ 'Please select at least one dimension for the x-axis to display plots.<br>',
38
+ color = 'red')
39
+ return
40
+ ds = run.generate_subset()
41
+ print(f"Found {len(ds.dims)} dimensions to plot in subset:")
42
+ fig_dict = {}
43
+ if len(ds.dims) == 1:
44
+ create_1d_plot(run, ds, container)
45
+ elif len(ds.dims) == 2:
46
+ create_2d_grid(run, ds, container)
47
+ else:
48
+ ui.notify(
49
+ 'The selected dimensions result in more than 2D data.<br>'
50
+ 'Please select only 1 or 2 dimensions to plot)',
51
+ color = 'red')
52
+ return None
53
+
54
+ def create_1d_plot(run: Run, ds: xr.Dataset, container: ui.Row) -> None:
55
+ """
56
+ Create a 1D plot for the given run and dataset.
57
+
58
+ Args:
59
+ run: The Run object containing the data to plot.
60
+ ds: The xarray Dataset containing the data.
61
+ container: The NiceGUI container to hold the plot.
62
+ """
63
+ print("Creating 1D plot")
64
+ x_dim = run.dim_axis_option['x-axis'].name
65
+ traces = []
66
+ plot_dict = copy.deepcopy(app.storage.tab["plot_dict_1D"])
67
+ for key in run.plot_selection:
68
+ da = ds[key]
69
+ traces.append({
70
+ "type": "scatter",
71
+ "mode": "lines+markers",
72
+ "name": key.replace("__", "."),
73
+ "x": da.coords[x_dim].values.tolist(),
74
+ "y": da.values.tolist(),
75
+ })
76
+
77
+ plot_dict["data"] = traces
78
+ plot_dict["layout"]["xaxis"]["title"]["text"] = axis_label_formater(ds, x_dim)
79
+ plot_dict["layout"]["title"]["text"] = title_formater(run)
80
+
81
+ with container:
82
+ fig = go.Figure(plot_dict)
83
+ ui.plotly(fig).classes('flex-1 h-full w-full').style('height:100%; min-height:700px;')
84
+ app.storage.tab["plot_dict_1D"] = plot_dict
85
+
86
+ def create_2d_grid(run, ds, container) -> dict:
87
+ """
88
+ Create a grid of 2D plots for the given run and dataset.
89
+
90
+ Args:
91
+ run: The Run object containing the data to plot.
92
+ ds: The xarray Dataset containing the data.
93
+ container: The NiceGUI container to hold the plots.
94
+ """
95
+ print("Creating 2D grid of plots")
96
+ if not all([run.dim_axis_option[axis]is not None for axis in ['x-axis', 'y-axis']]):
97
+ ui.notify(
98
+ 'Please select both x-axis and y-axis dimensions to display 2D plots.<br>'
99
+ f'x: {run.dim_axis_option["x-axis"]}<br>'
100
+ f'y: {run.dim_axis_option["y-axis"]}',
101
+ color = 'red')
102
+ return
103
+ keys = run.plot_selection
104
+ num_plots = len(keys)
105
+ num_columns = int(min([run.plots_per_column, len(keys)]))
106
+ num_rows = math.ceil(num_plots / num_columns)
107
+ pretty_keys = [key.replace("__", ".") for key in keys]
108
+
109
+ x_dim = run.dim_axis_option['x-axis'].name
110
+ y_dim = run.dim_axis_option['y-axis'].name
111
+ plot_dict = copy.deepcopy(app.storage.tab["plot_dict_2D"])
112
+ plot_dict["layout"]["xaxis"]["title"]["text"] = axis_label_formater(ds, x_dim)
113
+ plot_dict["layout"]["yaxis"]["title"]["text"] = axis_label_formater(ds, y_dim)
114
+ plot_idx = 0
115
+ def create_2d_plot(plot_idx):
116
+ key = keys[plot_idx]
117
+ da = ds[key]
118
+ if da[x_dim].dims[0] != da.dims[1]:
119
+ # TODO: CHECK THIS!
120
+ da = da.transpose() #y_dim, x_dim)
121
+ plot_dict["data"][0]["z"] = da.values.tolist()
122
+ plot_dict["data"][0]["x"] = da.coords[x_dim].values.tolist()
123
+ plot_dict["data"][0]["y"] = da.coords[y_dim].values.tolist()
124
+ plot_dict["layout"]["title"]["text"] = (
125
+ f"<b>{pretty_keys[plot_idx]}</b><br>{title_formater(run)}")
126
+ return go.Figure(plot_dict)
127
+
128
+ with container:
129
+ with ui.column().classes('w-full h-full'):
130
+ for row in range(num_rows):
131
+ with ui.row().classes('w-full justify-start flex-wrap'):
132
+ for col in range(num_columns):
133
+ if plot_idx >= num_plots:
134
+ break
135
+ fig = create_2d_plot(plot_idx)
136
+ width_percent = 100 / num_columns - 2
137
+ height_percent = 100 / num_rows - 2
138
+ with ui.column().style(
139
+ f"width: {width_percent}%; box-sizing: border-box;"
140
+ f"height: {height_percent}%; box-sizing: border-box;"
141
+ ):
142
+ ui.plotly(fig).classes('w-full h-full')\
143
+ .style(f'min-height: {int(800/num_rows)}px;')
144
+ plot_idx += 1
145
+ app.storage.tab["plot_dict_2D"] = plot_dict
@@ -0,0 +1,57 @@
1
+ """
2
+ Build and display xarray dataset HTML with dark theme.
3
+ """
4
+ from __future__ import annotations
5
+ from typing import TYPE_CHECKING
6
+
7
+ from nicegui import ui, app
8
+
9
+ if TYPE_CHECKING:
10
+ from arbok_inspector.arbok_inspector.classes.base_run import BaseRun
11
+ from xarray import Dataset
12
+
13
+ def build_xarray_html():
14
+ """Display the xarray dataset in a dark-themed style."""
15
+ run: BaseRun = app.storage.tab["run"]
16
+ ds: Dataset = run.full_data_set
17
+ with ui.column().classes('w-full'):
18
+ ui.html('''
19
+ <style>
20
+ /* Wrap styles to only apply inside this container */
21
+ .xarray-dark-wrapper {
22
+ background-color: #343535; /* Tailwind gray-800 */
23
+ color: #ffffff;
24
+ padding: 1rem;
25
+ border-radius: 0.5rem;
26
+ overflow-x: auto;
27
+ }
28
+
29
+ .xarray-dark-wrapper th,
30
+ .xarray-dark-wrapper td {
31
+ color: #d1d5db; /* Tailwind gray-300 */
32
+ background-color: transparent;
33
+ }
34
+
35
+ .xarray-dark-wrapper .xr-var-name {
36
+ color: #93c5fd !important; /* Tailwind blue-300 */
37
+ }
38
+
39
+ .xarray-dark-wrapper .xr-var-dims,
40
+ .xarray-dark-wrapper .xr-var-data {
41
+ color: #d1d5db !important; /* Light gray */
42
+ }
43
+
44
+ /* Optional: override any inline black text */
45
+ .xarray-dark-wrapper * {
46
+ color: inherit !important;
47
+ background-color: transparent !important;
48
+ }
49
+ </style>
50
+ ''')
51
+
52
+ # Wrap the dataset HTML in a div with that class
53
+ ui.html(f'''
54
+ <div class="xarray-dark-wrapper">
55
+ {ds._repr_html_()}
56
+ </div>
57
+ ''')
@@ -0,0 +1,77 @@
1
+ """
2
+ Dialog for editing JSON plot settings.
3
+ """
4
+ import copy
5
+ import json
6
+ import importlib.resources as resources
7
+
8
+ from nicegui import app, ui
9
+
10
+ from arbok_inspector.widgets.build_xarray_grid import build_xarray_grid
11
+
12
+ class JsonPlotSettingsDialog:
13
+ """
14
+ Dialog for editing JSON plot settings.
15
+ """
16
+ def __init__(self, dimension: str):
17
+ self.dimension = dimension
18
+ self.json_editor = None
19
+ self.dialog = self.build_plot_settings_dialog()
20
+
21
+ def build_plot_settings_dialog(self):
22
+ """
23
+ Build the dialog for plot settings.
24
+ """
25
+ plot_dict = app.storage.tab[self.dimension]
26
+
27
+ with ui.dialog() as dialog, ui.card():
28
+ with ui.column().classes('w_full h-screen'):
29
+ ui.label('Plot Settings')
30
+ self.json_editor = ui.json_editor(
31
+ properties = {"content": {"json": plot_dict}},
32
+ ).classes("jse-theme-dark")
33
+ with ui.row().classes('w-full justify-end'):
34
+ ui.button(
35
+ text = 'Apply',
36
+ on_click=lambda: self.set_editor_data(),
37
+ color='green'
38
+ )
39
+ ui.button(
40
+ text = 'Reset',
41
+ on_click=lambda: self.reset_plot_settings(),
42
+ color='blue'
43
+ )
44
+ ui.button(
45
+ text = 'Close',
46
+ color = 'red',
47
+ on_click=dialog.close
48
+ )
49
+ return dialog
50
+
51
+ def open(self):
52
+ """Open the dialog."""
53
+ print("Opening dialog and setting json data")
54
+ self.dialog.open()
55
+ self.json_editor.properties['content']['json'] = copy.deepcopy(
56
+ app.storage.tab[self.dimension])
57
+ self.json_editor.update()
58
+
59
+ async def set_editor_data(self):
60
+ """Sets json data from the JSON editor to the app storage and rebuilds plots."""
61
+ json_data = await self.json_editor.run_editor_method('get')
62
+ json_data = json_data["json"]
63
+ app.storage.tab[self.dimension] = json_data
64
+ build_xarray_grid()
65
+
66
+ def reset_plot_settings(self):
67
+ """Reset plot settings to defaults."""
68
+ if self.dimension == 'plot_dict_1D':
69
+ with resources.files("arbok_inspector.configurations").joinpath("1d_plot.json").open("r") as f:
70
+ app.storage.tab["plot_dict_1D"] = json.load(f)
71
+
72
+ elif self.dimension == 'plot_dict_2D':
73
+ with resources.files("arbok_inspector.configurations").joinpath("2d_plot.json").open("r") as f:
74
+ app.storage.tab["plot_dict_2D"] = json.load(f)
75
+
76
+ ui.notify('Reset to default settings', type='positive', position='top-right')
77
+ build_xarray_grid()
@@ -0,0 +1,64 @@
1
+ from datetime import datetime
2
+ from nicegui import ui, app
3
+ from sqlalchemy import text
4
+
5
+ from arbok_inspector.state import inspector
6
+
7
+ def update_day_selecter(day_grid):
8
+ offset_hours = app.storage.general["timezone"]
9
+ if inspector.database_type == 'qcodes':
10
+ rows = get_qcodes_days(inspector.cursor, offset_hours)
11
+ elif inspector.database_type == 'native_arbok':
12
+ rows = get_native_arbok_days(inspector.database_engine,offset_hours)
13
+ else:
14
+ raise ValueError(f"Invalid database type: {inspector.database_type}")
15
+
16
+ day_grid.clear()
17
+ row_data = []
18
+ for day, ts in rows[::-1]:
19
+ row_data.append({'day': day})
20
+
21
+ day_grid.options['rowData'] = row_data
22
+ day_grid.update()
23
+ ui.notify(
24
+ 'Day selector updated: \n'
25
+ f'found {len(row_data)} days',
26
+ type='positive',
27
+ multi_line=True,
28
+ classes='multi-line-notification',
29
+ position = 'top-right'
30
+ )
31
+
32
+ def get_qcodes_days(cursor, offset_hours: float) -> list[tuple[str, datetime]]:
33
+ cursor.execute(f"""
34
+ SELECT
35
+ day,
36
+ MIN(run_timestamp) AS earliest_ts
37
+ FROM (
38
+ SELECT
39
+ run_timestamp,
40
+ DATE(datetime(run_timestamp, 'unixepoch', '{offset_hours} hours')) AS day
41
+ FROM runs
42
+ )
43
+ GROUP BY day
44
+ ORDER BY day;
45
+ """)
46
+ return cursor.fetchall()
47
+
48
+ def get_native_arbok_days(engine, offset_hours: float) -> list[tuple[str, datetime]]:
49
+ query = text("""
50
+ SELECT
51
+ day,
52
+ MIN(start_time) AS earliest_ts
53
+ FROM (
54
+ SELECT
55
+ start_time,
56
+ (to_timestamp(start_time) + (:offset_hours || ' hours')::interval)::date AS day
57
+ FROM runs
58
+ ) AS sub
59
+ GROUP BY day
60
+ ORDER BY day;
61
+ """)
62
+ with engine.connect() as conn:
63
+ result = conn.execute(query, {"offset_hours": offset_hours})
64
+ return result.fetchall()
@@ -0,0 +1,90 @@
1
+ Metadata-Version: 2.4
2
+ Name: arbok-inspector
3
+ Version: 1.3.0
4
+ Summary: Browser based QCoDeS database inspector
5
+ License: MIT
6
+ Classifier: Programming Language :: Python :: 3.12
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: minio~=7.2
11
+ Requires-Dist: nicegui>=2.24.2
12
+ Requires-Dist: nodejs>=0.1.1
13
+ Requires-Dist: plotly>=6.3.0
14
+ Requires-Dist: psycopg2-binary~=2.9
15
+ Requires-Dist: s3fs~=2025.9
16
+ Requires-Dist: SQLAlchemy~=2.0
17
+ Requires-Dist: qcodes>=0.53.0
18
+ Requires-Dist: xarray>=2025.9.0
19
+ Requires-Dist: zarr~=2.18
20
+ Dynamic: license-file
21
+
22
+ # arbok_inspector 🐍
23
+ arbok_inspector is an browser based inspection and visualization utility for QCoDeS measurement
24
+ databases.
25
+ It provides a lightweight GUI and CLI to browse runs and visualize data.
26
+
27
+ ## Features 🔎
28
+ The most commonly used used tool to visualize QCoDeS databases is
29
+ [plottr](https://github.com/toolsforexperiments/plottr).
30
+ Plottr is a great tool to get started, but struggles with increasing abounts of data.
31
+
32
+ This is how arbok_inspector streamlines your data inspection:
33
+ - Fast browsing of measurement runs and their metadata
34
+ - Written with [nicegui](https://nicegui.io/) acting as a [tailwind](https://tailwindcss.com/) wrapper
35
+ - Browser based approach ensures cross system compatibily
36
+ - Selected runs are opened in a new tab and run on a separate thread
37
+ - this avoids blocking the entire application when loading big datasets
38
+ - plotting backend is plotly which natively returns html
39
+ - plotly plot customization is declarative and can therefore be tweaked in a simple json editor without implementing each customization by hand
40
+ - runs are only loaded on demand
41
+ - startup time in plottr can be several minutes for large databases
42
+ - SQL queries load only the given days upon database selection, only loads respective runs once day is selected
43
+
44
+ ## Installation 📲
45
+
46
+ From pypi install using pip in your environment:
47
+ ```bash
48
+ pip install arbok-inspector
49
+ ```
50
+ Even better if you are using uv, a uv.lock file is included!
51
+ Launch from CLI:
52
+ ```bash
53
+ arbok-inspector
54
+ ```
55
+
56
+ ## Project layout
57
+
58
+ - `main.py` — app entrypoint and startup logic
59
+ - `state.py` — application state & database handling
60
+ - `pages/` — NiceGUI pages (database browser, run view, greeter, ...)
61
+ - `widgets/` — reusable UI widgets (grid builders, selectors, dialogs)
62
+ - `analysis/` — analysis and data-prep utilities
63
+ - `classes/` — small domain objects used across the app
64
+ - `helpers/` — formatting and utility helpers
65
+
66
+ Development & testing 🛠️
67
+
68
+ Clone this git repository and navigate into it.
69
+ Use an editable install for local development to pick up changes immediately
70
+ ```bash
71
+ pip install -e .
72
+ ```
73
+
74
+ To launch the app in editable mode launch from dev.py file:
75
+ ```bash
76
+ python -m arbok_inspector/dev.py
77
+ ```
78
+ Contributing & help 🙌
79
+
80
+ Contributions, bug reports, and small feature requests are welcome. If you want to add a visualization or a new page, use `pages/` and `widgets/` for examples of how UI components are composed. When opening a PR, please keep changes focused and include a short description of how to exercise the change locally.
81
+
82
+ License
83
+
84
+ See the `LICENSE` file in the project root for license details.
85
+
86
+ Notes & tips
87
+
88
+ - For exact runtime dependencies check `pyproject.toml` — prefer using that manifest (and a virtual environment) for reproducible installs.
89
+ - If you want me to add a short walkthrough for common tasks (open a run, plot data, export CSV), tell me which task you'd like first and I can add a step-by-step example here. 📘
90
+
@@ -0,0 +1,33 @@
1
+ arbok_inspector/__init__.py,sha256=KEDfR87-199tMUCeufnGkPswwjGivDOIwF5w1_cZ6ZM,53
2
+ arbok_inspector/cli.py,sha256=G0gIa4ByfQTMmeXCyLjnsmke5EEXs6DYuR5eVbhszXo,96
3
+ arbok_inspector/dev.py,sha256=F19xar7hlR-fG1QTxGyXSwT5r80x52vZIlZDaimPc4E,413
4
+ arbok_inspector/main.py,sha256=oQEypBKdD5jLARiXmz2u1_Op5OIos0BTqkM--oLU3lo,300
5
+ arbok_inspector/state.py,sha256=X92xcYx6j04C4wdm78pfQanDe-JHR-_0lXl9oZD_mfA,3709
6
+ arbok_inspector/test.db,sha256=ux4N1KNG0wwovG7W8ThRDwwdcLa42Rb3M1evDsocFnU,10342400
7
+ arbok_inspector/test_main.py,sha256=brV3O2ZVyuUrqnUmZr3U-tH6VY7PQxthNiElgIax_x0,1955
8
+ arbok_inspector/analysis/analysis_base.py,sha256=7uChxCyoiHazQBId9DHgXZtk166fZshr-E-eF-SNw5Q,933
9
+ arbok_inspector/analysis/prepare_data.py,sha256=DedVxlbTNDppMlNBwt8kN4cWk0_Nnyx9J442GqG1Asw,4393
10
+ arbok_inspector/classes/base_run.py,sha256=KlYBZzCglE86gWvUEAljlRNRWxWciK0rmaPAezU_P40,10743
11
+ arbok_inspector/classes/dim.py,sha256=bPxVNn23ohZ9CVePmiqLUFABbh6iKiuN_dMAxIcqIG0,750
12
+ arbok_inspector/classes/native_run.py,sha256=I9x5pUgvyTFGft6U-Ajo1hvjSSHNzpZ8V8i0_HOhXl4,6085
13
+ arbok_inspector/classes/qcodes_run.py,sha256=nB1-pckSP6VNg59n9BCcldjQFJz51UPm9DH4g7iDRzE,2181
14
+ arbok_inspector/configurations/1d_plot.json,sha256=Uy3quv9PG7_mTgInevfbRepHJbaii7K_rzdT8f7QO-s,895
15
+ arbok_inspector/configurations/2d_plot.json,sha256=DKiwJJQnrcoEgCq9Cff_Oq9uVVnXETXEK7vMTvMBlnY,1054
16
+ arbok_inspector/helpers/string_formaters.py,sha256=QJ5xXVHlM87BWTAZPExWV0YjuNTAgyOaq0uEsA4dWmY,1082
17
+ arbok_inspector/helpers/unit_formater.py,sha256=cAsFmmTrLXAsz4A9ibmRfEjGZnitW2x1afzuXL7gIMI,1173
18
+ arbok_inspector/pages/__init__.py,sha256=3ZbSQftX4VYoWU6DsAEZvXl89PLjwn89Xtxqwwxy8vc,88
19
+ arbok_inspector/pages/database_browser.py,sha256=EgLakl_5dG22W8Fube5CKsWtw8IGH-d-3LkJmnj8KW4,6191
20
+ arbok_inspector/pages/greeter.py,sha256=L6WQOaDvIOejSGzbxrFiDWF9GO1StbZGtv6n3xktZJE,3607
21
+ arbok_inspector/pages/run_view.py,sha256=UuWvR9e5jEnhSURq-enheM06U86GoIOjHeqzORfkSok,10587
22
+ arbok_inspector/widgets/build_run_selecter.py,sha256=X765PE6PgCxos09uwxgOz_rqmZ7_gGrQmrK3ypvHMLo,6104
23
+ arbok_inspector/widgets/build_run_view_actions.py,sha256=ktZhQcEeGAK-1byczws5hkq4pf0NKnogBWF2uAWC6Qk,3368
24
+ arbok_inspector/widgets/build_xarray_grid.py,sha256=bsuGzBCFOaW6fsXtAAWi1gw7qIXkRSmV-5zN1fqoMXA,5718
25
+ arbok_inspector/widgets/build_xarray_html.py,sha256=gsINc6pCt576oJYRZztlmT6c6NwRv0MJtgsnwU-lbYM,1708
26
+ arbok_inspector/widgets/json_plot_settings_dialog.py,sha256=tUjx9TqDHhKsT9IGZfw61zuzjY1BqJH00s_gtR5kzio,2913
27
+ arbok_inspector/widgets/update_day_selecter.py,sha256=ciesmY4VEv9dydBhNh5ToMLw98sHjsbkw_-pfkGQfGU,2025
28
+ arbok_inspector-1.3.0.dist-info/licenses/LICENSE,sha256=ZEqWKVZ2qROesXQcWpU2JTdY2yk6OkWR70H5771iIGc,1070
29
+ arbok_inspector-1.3.0.dist-info/METADATA,sha256=ZToEFjrvW6YnEawZYmt56sOcPLCazuIAxlOkt2IsPV0,3540
30
+ arbok_inspector-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
31
+ arbok_inspector-1.3.0.dist-info/entry_points.txt,sha256=i1gVPzcOgNNzSly4zUqJ_z38eiUrMEOCNgtH1dr55zE,64
32
+ arbok_inspector-1.3.0.dist-info/top_level.txt,sha256=-jLIWMq05sffOZ-lCiP8dZgVga7Upp95QsBgoE718oE,16
33
+ arbok_inspector-1.3.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ arbok-inspector = arbok_inspector.main:ui.run
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Andreas Nickl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ arbok_inspector