diff --git a/.gitignore b/.gitignore index 0af3336..4950614 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ Thumbs.db # GCP gha-creds-*.json + +# local testing +test-output/* diff --git a/CLOUD_SETUP.md b/CLOUD_SETUP.md new file mode 100644 index 0000000..9abfcc2 --- /dev/null +++ b/CLOUD_SETUP.md @@ -0,0 +1,119 @@ +# Cloud Setup for ISMIP6 Indexing + +This document describes the cloud infrastructure setup required for running the ISMIP6 virtualization pipeline using Lithops on Google Cloud Platform. + +## Prerequisites + +- Google Cloud SDK (`gcloud`) installed and configured + - Determine which email is authorized to see the project + - Make sure you are logged into gcloud with that email + - Check the active account with `gcloud auth list` + - If the account shows up but is not active do `gcloud config set account ` + - If not log in with `gcloud auth login` +- Access to a GCP project with billing enabled +- Permissions to create service accounts and IAM policies + +## GCP Service Account Setup + +Lithops requires a service account with proper permissions to deploy Cloud Functions and access Cloud Storage. + +### 1. Set Your Project ID + +```bash +export PROJECT_ID=$(gcloud config get-value project) +``` + +For this project, the project ID is: `ds-englacial` + +### 2. Create Service Account + +```bash +gcloud iam service-accounts create lithops-executor \ + --display-name="Lithops Executor Service Account" \ + --project=$PROJECT_ID +``` + +### 3. Grant Required Permissions + +See [Lithops GCP Functions Documentation](https://lithops-cloud.github.io/docs/source/compute_config/gcp_functions.html) for a list of required permissions - THOSE BELOW NEED TO BE UPDATED. + +Grant Cloud Functions Developer role (to deploy and manage serverless functions): + +```bash +gcloud projects add-iam-policy-binding $PROJECT_ID \ + --member="serviceAccount:lithops-executor@${PROJECT_ID}.iam.gserviceaccount.com" \ + --role="roles/cloudfunctions.developer" +``` + +Grant Storage Object Admin role (to read/write GCS buckets): + +```bash +gcloud projects add-iam-policy-binding $PROJECT_ID \ + --member="serviceAccount:lithops-executor@${PROJECT_ID}.iam.gserviceaccount.com" \ + --role="roles/storage.objectAdmin" +``` + +### 4. Download Service Account Key + +```bash +gcloud iam service-accounts keys create ~/lithops-sa-key.json \ + --iam-account=lithops-executor@${PROJECT_ID}.iam.gserviceaccount.com +``` + +This creates a JSON key file at `~/lithops-sa-key.json`. + +## Enable services + +See [Lithops GCP Functions Documentation](https://lithops-cloud.github.io/docs/source/compute_config/gcp_functions.html) for a list of Google Cloud services which need to be enabled. + +## Lithops Configuration + +The `lithops.yaml` configuration file should reference the service account key: + +```yaml +lithops: + backend: gcp_functions + storage: gcp_storage + +gcp: + region: us-west1 + credentials_path: ~/lithops-sa-key.json + +gcp_functions: + region: us-west1 + runtime: ismip6-icechunk + +gcp_storage: + storage_bucket: ismip6-icechunk + region: us-west1 +``` + +### Important Notes + +- **Do NOT use Application Default Credentials**: Lithops requires a service account key file with `client_email` and `token_uri` fields, which ADC doesn't provide +- **Keep the key file secure**: The service account key provides full access to the granted permissions +- **Storage bucket**: The `storage_bucket` parameter specifies where Lithops stores intermediate results and metadata + +## GCS Buckets Used + +- `gs://ismip6`: Source data bucket (public, read-only) +- `gs://ismip6-icechunk`: Target bucket for Icechunk repositories and failure logs + +## Service Account Created + +- **Name**: `lithops-executor` +- **Email**: `lithops-executor@ds-englacial.iam.gserviceaccount.com` +- **Roles**: + - `roles/cloudfunctions.developer` + - `roles/storage.objectAdmin` + - OTHERS/ADD ME +- **Key Location**: `~/lithops-sa-key.json` + +## Build the runtime + +```bash +# lithops runtime delete ismip6-icechunk -c lithops.yaml +lithops runtime build -f requirements.txt ismip6-icechunk -c lithops.yaml +lithops runtime deploy ismip6-icechunk -c lithops.yaml +``` + diff --git a/ICECHUNK_STORE.md b/ICECHUNK_STORE.md new file mode 100644 index 0000000..a1a4668 --- /dev/null +++ b/ICECHUNK_STORE.md @@ -0,0 +1,104 @@ +# Icechunk Store Documentation + +## Overview + +This document describes the Icechunk store created by the `virtualize_with_lithops.py` script for the ISMIP6 dataset. The store contains virtualized references to NetCDF files in Google Cloud Storage, allowing efficient access to the dataset without duplicating the underlying data. + +## Store Location + +- **Bucket**: `gs://ismip6-icechunk` +- **Source Data**: `gs://ismip6/` + +## What is Icechunk and how is it being used + +Icechunk is a transactional storage system for chunked array data. Here we are using it to store metadata that references chunks in remote object storage. In this case, the Google Cloud Storage bucket gs://ismip6, enabling efficient access to large scientific datasets without copying the data. + +## Store Structure + +The Icechunk store is organized hierarchically using the same structure as the `gs://ismip6` source bucket, i.e.: + +``` +{institution}_{model_name}/{experiment}/{variable} +``` + +For example: +- `AWI_ISSM/ctrl/lithk` +- `JPL_ISSM/expAE01/ivol` + +Each path contains a virtual Zarr dataset with metadata pointing to chunks in the original NetCDF files. + +## How virtualize_with_lithops Creates the Store + +### Processing Strategy + +The script uses a three-step approach to build the Icechunk store: + +1. **Build File Index**: Scans the `gs://ismip6/` bucket to identify all available NetCDF files +2. **Group Files**: Groups files by model name and experiment to create logical batches +3. **Process Batches**: For each batch: + - Virtualizes files in parallel using Lithops serverless functions + - Writes successful virtualizations to Icechunk in a single commit + +### Virtualization Process + +#### Step 1: File Virtualization + +For each NetCDF file, the `virtualize_file()` function: + +1. Opens the file using `virtualizarr.open_virtual_dataset()` +2. Loads coordinate variables (`time`, `x`, `y`, `lat`, `lon`, etc.) into memory +3. References data variables virtually (no data is copied) +4. Applies ISMIP6-specific fixes: + - `fix_time_encoding()`: Corrects time coordinate encoding + - `correct_grid_coordinates()`: Fixes grid coordinate metadata +5. Returns the virtual dataset with its hierarchical path + +#### Step 2: Batch Writing + +The `write_batch_to_icechunk()` function: + +1. Opens or creates the Icechunk repository +2. Creates a writable session on the `main` branch +3. Writes all virtual datasets in the batch using `virtual_dataset_to_icechunk()` +4. Commits all changes in a single transaction + +This approach minimizes the number of commits and reduces the risk of conflicts. + +#### Step 3: Parallel Processing (lines 104-217) + +The `process_all_files()`: + +1. Groups files by model and experiment to create batches +2. Uses Lithops to parallelize virtualization within each batch +3. Processes batches sequentially to avoid Icechunk write conflicts +4. Logs any failures to `gs://ismip6-icechunk/failures/` + +## Accessing the Store + +See [notebooks/open_icechunk.ipynb](./notebooks/open_icechunk.ipynb) + +## Commit History + +Each batch write creates a commit with a message like: +``` +Added 5 datasets: AWI_ISSM/ctrl/lithk, AWI_ISSM/ctrl/ivol, AWI_ISSM/ctrl/base, ... +``` + +The commit ID is logged during processing for traceability. + +## Failure Handling + +If virtualization or writing fails for any files, failures are logged to: +``` +gs://ismip6-icechunk/failures/virtualization_failures_YYYYMMDD_HHMMSS.json +``` + +Each failure record includes: +- URL of the failed file +- Error message +- Model name and experiment +- Timestamp + +## Improvements + +* Virtualization is still a bit slow for the entire archive (~6 hours) grouping by model and experiment. Could this be sped up, perhaps virtualizing all files first and / or grouping only by model? diff --git a/lithops.yaml b/lithops.yaml new file mode 100644 index 0000000..f96c060 --- /dev/null +++ b/lithops.yaml @@ -0,0 +1,18 @@ +lithops: + backend: gcp_functions + storage: gcp_storage + data_limit: False + +gcp: + region: us-west1 + credentials_path: /Users/aimeebarciauskas/lithops-sa-key.json + +gcp_functions: + region: us-west1 + runtime: ismip6-icechunk + runtime_memory: 8192 + runtime_timeout: 540 + project_id: ds-englacial + +gcp_storage: + storage_bucket: ismip6-icechunk # Lithops uses storage_bucket, not bucket diff --git a/lithops_local.yaml b/lithops_local.yaml new file mode 100644 index 0000000..fe3319c --- /dev/null +++ b/lithops_local.yaml @@ -0,0 +1,8 @@ +lithops: + backend: localhost + storage: localhost + execution_timeout: 21600 + +localhost: + runtime: "/Users/juliusbusecke/Code/ismip-indexing/.venv/bin/python" + worker_processes': 10 # set dependent on your cores. \ No newline at end of file diff --git a/notebooks/open_icechunk.ipynb b/notebooks/open_icechunk.ipynb new file mode 100644 index 0000000..8c92d73 --- /dev/null +++ b/notebooks/open_icechunk.ipynb @@ -0,0 +1,2424 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7f3d3038-948d-4846-b2e2-8be2dde9f661", + "metadata": {}, + "source": [ + "# Test opening and reading from the Icechunk Store\n", + "\n", + "## Step 0: Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e4ecb459-e6ec-45f6-b291-61f6da476fe4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n const py_version = '3.8.0'.replace('rc', '-rc.').replace('.dev', '-dev.');\n const reloading = false;\n const Bokeh = root.Bokeh;\n\n // Set a timeout for this load but only if we are not already initializing\n if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n // Don't load bokeh if it is still initializing\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n // There is nothing to load\n run_callbacks();\n return null;\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error(e) {\n const src_el = e.srcElement\n console.error(\"failed to load \" + (src_el.href || src_el.src));\n }\n\n const skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n const existing_stylesheets = []\n const links = document.getElementsByTagName('link')\n for (let i = 0; i < links.length; i++) {\n const link = links[i]\n if (link.href != null) {\n existing_stylesheets.push(link.href)\n }\n }\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const escaped = encodeURI(url)\n if (existing_stylesheets.indexOf(escaped) !== -1) {\n on_load()\n continue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n const scripts = document.getElementsByTagName('script')\n for (let i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n existing_scripts.push(script.src)\n }\n }\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (let i = 0; i < js_modules.length; i++) {\n const url = js_modules[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n const url = js_exports[name];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.holoviz.org/panel/1.8.2/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.8.0.min.js\", \"https://cdn.holoviz.org/panel/1.8.2/dist/panel.min.js\"];\n const js_modules = [];\n const js_exports = {};\n const css_urls = [];\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (let i = 0; i < inline_js.length; i++) {\n try {\n inline_js[i].call(root, root.Bokeh);\n } catch(e) {\n if (!reloading) {\n throw e;\n }\n }\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n var NewBokeh = root.Bokeh;\n if (Bokeh.versions === undefined) {\n Bokeh.versions = new Map();\n }\n if (NewBokeh.version !== Bokeh.version) {\n Bokeh.versions.set(NewBokeh.version, NewBokeh)\n }\n root.Bokeh = Bokeh;\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n // If the timeout and bokeh was not successfully loaded we reset\n // everything and try loading again\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n root._bokeh_is_loading = 0\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n if (root.Bokeh) {\n root.Bokeh = undefined;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", + "application/vnd.holoviews_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n let retries = 0;\n const open = () => {\n if (comm.active) {\n comm.open();\n } else if (retries > 3) {\n console.warn('Comm target never activated')\n } else {\n retries += 1\n setTimeout(open, 500)\n }\n }\n if (comm.active) {\n comm.open();\n } else {\n setTimeout(open, 500)\n }\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n })\n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", + "application/vnd.holoviews_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ] + }, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "8b5b9c35-5767-4e62-8441-6123363c6963" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import icechunk\n", + "import xarray as xr\n", + "import hvplot.xarray\n", + "import zarr\n", + "\n", + "zarr.config.set({\n", + " 'async.concurrency': 100,\n", + " 'threading.max_workers': None\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "13b66768-8874-4970-b33a-b560272b9cc8", + "metadata": {}, + "source": [ + "## Step 1: Setup Icechunk Store" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "98a8fe8a-e6c8-40b7-9124-1e53db69ba89", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# When opening the repo, use None for anonymous/public access\n", + "credentials = icechunk.containers_credentials({\n", + " \"gs://ismip6/\": None\n", + "})\n", + "config = icechunk.RepositoryConfig.default()\n", + "\n", + "icechunk_storage = icechunk.gcs_storage(\n", + " bucket=\"ismip6-icechunk\",\n", + " prefix=\"12-07-2025\",\n", + " anonymous=True\n", + ")\n", + "repo = icechunk.Repository.open(icechunk_storage, config, authorize_virtual_chunk_access=credentials)\n", + "session = repo.readonly_session(branch=\"main\")" + ] + }, + { + "cell_type": "markdown", + "id": "3cc576c9-a551-4bce-8e51-b5266bc78af1", + "metadata": {}, + "source": [ + "## Step 3 Test Opening with Zarr" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "08fcb4d9-820d-4d55-bcf9-834dcb8042c5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# opening using Zarr\n", + "root = zarr.open(session.store, mode='r')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b4efec55-7fa2-4713-a858-03715883bbff", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
/\n",
+       "├── AWI_PISM1\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   ├── exp04\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp11\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   ├── expA1\n",
+       "│   ├── expA2\n",
+       "│   ├── expA3\n",
+       "│   ├── expA4\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   ├── expB1\n",
+       "│   ├── expB10\n",
+       "│   ├── expB2\n",
+       "│   ├── expB3\n",
+       "│   ├── expB4\n",
+       "│   ├── expB5\n",
+       "│   ├── expB6\n",
+       "│   ├── expB7\n",
+       "│   ├── expB8\n",
+       "│   ├── expB9\n",
+       "│   └── hist_std\n",
+       "├── CPOM_BISICLES\n",
+       "│   ├── expT71_08\n",
+       "│   ├── expT73_08\n",
+       "│   └── expTD58_08\n",
+       "├── DOE_MALI\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp12\n",
+       "│   └── exp13\n",
+       "├── IMAU_IMAUICE1\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   └── hist_std\n",
+       "├── IMAU_IMAUICE2\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   └── hist_std\n",
+       "├── JPL1_ISSM\n",
+       "│   ├── abmb\n",
+       "│   ├── asmb\n",
+       "│   ├── ctrl\n",
+       "│   ├── ctrl_proj\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp07_HighPIGL_08\n",
+       "│   ├── exp07_LowPIGL_08\n",
+       "│   ├── exp07_PIGL_08\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp12\n",
+       "│   ├── exp12HighOcean_08\n",
+       "│   ├── exp12HighPIGL_08\n",
+       "│   ├── exp12PIGL_08\n",
+       "│   ├── exp13\n",
+       "│   ├── expA1\n",
+       "│   ├── expA2\n",
+       "│   ├── expA3\n",
+       "│   ├── expA4\n",
+       "│   ├── expB1\n",
+       "│   ├── expB2\n",
+       "│   ├── expB3\n",
+       "│   ├── expB4\n",
+       "│   ├── expB5\n",
+       "│   ├── expC12\n",
+       "│   ├── expC3\n",
+       "│   ├── expC6\n",
+       "│   ├── expC9\n",
+       "│   ├── expD1\n",
+       "│   ├── expD10\n",
+       "│   ├── expD11\n",
+       "│   ├── expD12\n",
+       "│   ├── expD13\n",
+       "│   ├── expD14\n",
+       "│   ├── expD15\n",
+       "│   ├── expD16\n",
+       "│   ├── expD17\n",
+       "│   ├── expD18\n",
+       "│   ├── expD2\n",
+       "│   ├── expD3\n",
+       "│   ├── expD4\n",
+       "│   ├── expD5\n",
+       "│   ├── expD51\n",
+       "│   ├── expD52\n",
+       "│   ├── expD53\n",
+       "│   ├── expD54\n",
+       "│   ├── expD55\n",
+       "│   ├── expD56\n",
+       "│   ├── expD57\n",
+       "│   ├── expD58\n",
+       "│   ├── expD6\n",
+       "│   ├── expD7\n",
+       "│   ├── expD8\n",
+       "│   ├── expD9\n",
+       "│   └── hist\n",
+       "├── LSCE_GRISLI2\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   ├── expB10\n",
+       "│   ├── expB6\n",
+       "│   ├── expB7\n",
+       "│   ├── expB8\n",
+       "│   ├── expB9\n",
+       "│   ├── expC1\n",
+       "│   ├── expC10\n",
+       "│   ├── expC12\n",
+       "│   ├── expC3\n",
+       "│   ├── expC4\n",
+       "│   ├── expC6\n",
+       "│   ├── expC7\n",
+       "│   ├── expC9\n",
+       "│   ├── expD1\n",
+       "│   ├── expD10\n",
+       "│   ├── expD11\n",
+       "│   ├── expD12\n",
+       "│   ├── expD13\n",
+       "│   ├── expD14\n",
+       "│   ├── expD15\n",
+       "│   ├── expD16\n",
+       "│   ├── expD17\n",
+       "│   ├── expD18\n",
+       "│   ├── expD2\n",
+       "│   ├── expD3\n",
+       "│   ├── expD4\n",
+       "│   ├── expD5\n",
+       "│   ├── expD51\n",
+       "│   ├── expD52\n",
+       "│   ├── expD53\n",
+       "│   ├── expD54\n",
+       "│   ├── expD55\n",
+       "│   ├── expD56\n",
+       "│   ├── expD57\n",
+       "│   ├── expD58\n",
+       "│   ├── expD6\n",
+       "│   ├── expD7\n",
+       "│   ├── expD8\n",
+       "│   ├── expD9\n",
+       "│   ├── expE10\n",
+       "│   ├── expE6\n",
+       "│   ├── expE7\n",
+       "│   ├── expE8\n",
+       "│   ├── expE9\n",
+       "│   └── hist_std\n",
+       "├── NCAR_CISM\n",
+       "│   ├── ctrl_proj_open\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   ├── exp04\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp13\n",
+       "│   ├── expA1\n",
+       "│   ├── expA2\n",
+       "│   ├── expA3\n",
+       "│   ├── expA4\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   ├── expB1\n",
+       "│   ├── expB10\n",
+       "│   ├── expB2\n",
+       "│   ├── expB3\n",
+       "│   ├── expB4\n",
+       "│   ├── expB5\n",
+       "│   ├── expB6\n",
+       "│   ├── expB7\n",
+       "│   ├── expB8\n",
+       "│   ├── expB9\n",
+       "│   ├── expC1\n",
+       "│   ├── expC10\n",
+       "│   ├── expC10_open\n",
+       "│   ├── expC11\n",
+       "│   ├── expC12\n",
+       "│   ├── expD1\n",
+       "│   ├── expD10\n",
+       "│   ├── expD11\n",
+       "│   ├── expD12\n",
+       "│   ├── expD13\n",
+       "│   ├── expD14\n",
+       "│   ├── expD15\n",
+       "│   ├── expD16\n",
+       "│   ├── expD17\n",
+       "│   ├── expD18\n",
+       "│   ├── expD2\n",
+       "│   ├── expD3\n",
+       "│   ├── expD4\n",
+       "│   ├── expD5\n",
+       "│   ├── expD51\n",
+       "│   ├── expD52\n",
+       "│   ├── expD53\n",
+       "│   ├── expD54\n",
+       "│   ├── expD55\n",
+       "│   ├── expD56\n",
+       "│   ├── expD57\n",
+       "│   ├── expD58\n",
+       "│   ├── hist_open\n",
+       "│   └── hist_std\n",
+       "├── PIK_PISM1\n",
+       "│   ├── ctrl_proj_open\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   ├── exp04\n",
+       "│   └── hist_open\n",
+       "├── PIK_PISM2\n",
+       "│   ├── ctrl_proj_open\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   └── exp04\n",
+       "├── UCIJPL_ISSM\n",
+       "│   ├── ctrl_proj_open\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   ├── exp04\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp11\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   ├── expB10\n",
+       "│   ├── expB6\n",
+       "│   ├── expB7\n",
+       "│   ├── expB8\n",
+       "│   ├── expB9\n",
+       "│   ├── expC11\n",
+       "│   ├── expC12\n",
+       "│   ├── expC2\n",
+       "│   ├── expC3\n",
+       "│   ├── expC5\n",
+       "│   ├── expC6\n",
+       "│   ├── expD1\n",
+       "│   ├── expD10\n",
+       "│   ├── expD11\n",
+       "│   ├── expD12\n",
+       "│   ├── expD13\n",
+       "│   ├── expD14\n",
+       "│   ├── expD15\n",
+       "│   ├── expD16\n",
+       "│   ├── expD17\n",
+       "│   ├── expD18\n",
+       "│   ├── expD2\n",
+       "│   ├── expD3\n",
+       "│   ├── expD4\n",
+       "│   ├── expD5\n",
+       "│   ├── expD6\n",
+       "│   ├── expD7\n",
+       "│   ├── expD8\n",
+       "│   ├── expD9\n",
+       "│   ├── hist_open\n",
+       "│   └── hist_std\n",
+       "├── ULB_fETISh_16km\n",
+       "│   ├── ctrl_proj_open\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   ├── exp04\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp11\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   ├── expA1\n",
+       "│   ├── expA2\n",
+       "│   ├── expA3\n",
+       "│   ├── expA4\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   ├── hist_open\n",
+       "│   └── hist_std\n",
+       "├── ULB_fETISh_32km\n",
+       "│   ├── ctrl_proj_open\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp01\n",
+       "│   ├── exp02\n",
+       "│   ├── exp03\n",
+       "│   ├── exp04\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── exp11\n",
+       "│   ├── exp12\n",
+       "│   ├── exp13\n",
+       "│   ├── expA1\n",
+       "│   ├── expA2\n",
+       "│   ├── expA3\n",
+       "│   ├── expA4\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expA8\n",
+       "│   ├── hist_open\n",
+       "│   └── hist_std\n",
+       "├── UTAS_ElmerIce\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   └── exp13\n",
+       "├── VUB_AISMPALEO\n",
+       "│   ├── ctrl_proj_std\n",
+       "│   ├── exp05\n",
+       "│   ├── exp06\n",
+       "│   ├── exp07\n",
+       "│   ├── exp08\n",
+       "│   ├── exp09\n",
+       "│   ├── exp10\n",
+       "│   ├── expA5\n",
+       "│   ├── expA6\n",
+       "│   ├── expA7\n",
+       "│   ├── expB6\n",
+       "│   ├── expB7\n",
+       "│   ├── expB8\n",
+       "│   └── hist_std\n",
+       "└── VUW_PISM\n",
+       "    ├── ctrl_proj_open\n",
+       "    ├── exp01\n",
+       "    ├── exp02\n",
+       "    ├── exp03\n",
+       "    ├── exp04\n",
+       "    └── hist_open\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m/\u001b[0m\n", + "├── \u001b[1mAWI_PISM1\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ ├── \u001b[1mexp04\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp11\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA1\u001b[0m\n", + "│ ├── \u001b[1mexpA2\u001b[0m\n", + "│ ├── \u001b[1mexpA3\u001b[0m\n", + "│ ├── \u001b[1mexpA4\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ ├── \u001b[1mexpB1\u001b[0m\n", + "│ ├── \u001b[1mexpB10\u001b[0m\n", + "│ ├── \u001b[1mexpB2\u001b[0m\n", + "│ ├── \u001b[1mexpB3\u001b[0m\n", + "│ ├── \u001b[1mexpB4\u001b[0m\n", + "│ ├── \u001b[1mexpB5\u001b[0m\n", + "│ ├── \u001b[1mexpB6\u001b[0m\n", + "│ ├── \u001b[1mexpB7\u001b[0m\n", + "│ ├── \u001b[1mexpB8\u001b[0m\n", + "│ ├── \u001b[1mexpB9\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mCPOM_BISICLES\u001b[0m\n", + "│ ├── \u001b[1mexpT71_08\u001b[0m\n", + "│ ├── \u001b[1mexpT73_08\u001b[0m\n", + "│ └── \u001b[1mexpTD58_08\u001b[0m\n", + "├── \u001b[1mDOE_MALI\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ └── \u001b[1mexp13\u001b[0m\n", + "├── \u001b[1mIMAU_IMAUICE1\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mIMAU_IMAUICE2\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mJPL1_ISSM\u001b[0m\n", + "│ ├── \u001b[1mabmb\u001b[0m\n", + "│ ├── \u001b[1masmb\u001b[0m\n", + "│ ├── \u001b[1mctrl\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp07_HighPIGL_08\u001b[0m\n", + "│ ├── \u001b[1mexp07_LowPIGL_08\u001b[0m\n", + "│ ├── \u001b[1mexp07_PIGL_08\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp12HighOcean_08\u001b[0m\n", + "│ ├── \u001b[1mexp12HighPIGL_08\u001b[0m\n", + "│ ├── \u001b[1mexp12PIGL_08\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA1\u001b[0m\n", + "│ ├── \u001b[1mexpA2\u001b[0m\n", + "│ ├── \u001b[1mexpA3\u001b[0m\n", + "│ ├── \u001b[1mexpA4\u001b[0m\n", + "│ ├── \u001b[1mexpB1\u001b[0m\n", + "│ ├── \u001b[1mexpB2\u001b[0m\n", + "│ ├── \u001b[1mexpB3\u001b[0m\n", + "│ ├── \u001b[1mexpB4\u001b[0m\n", + "│ ├── \u001b[1mexpB5\u001b[0m\n", + "│ ├── \u001b[1mexpC12\u001b[0m\n", + "│ ├── \u001b[1mexpC3\u001b[0m\n", + "│ ├── \u001b[1mexpC6\u001b[0m\n", + "│ ├── \u001b[1mexpC9\u001b[0m\n", + "│ ├── \u001b[1mexpD1\u001b[0m\n", + "│ ├── \u001b[1mexpD10\u001b[0m\n", + "│ ├── \u001b[1mexpD11\u001b[0m\n", + "│ ├── \u001b[1mexpD12\u001b[0m\n", + "│ ├── \u001b[1mexpD13\u001b[0m\n", + "│ ├── \u001b[1mexpD14\u001b[0m\n", + "│ ├── \u001b[1mexpD15\u001b[0m\n", + "│ ├── \u001b[1mexpD16\u001b[0m\n", + "│ ├── \u001b[1mexpD17\u001b[0m\n", + "│ ├── \u001b[1mexpD18\u001b[0m\n", + "│ ├── \u001b[1mexpD2\u001b[0m\n", + "│ ├── \u001b[1mexpD3\u001b[0m\n", + "│ ├── \u001b[1mexpD4\u001b[0m\n", + "│ ├── \u001b[1mexpD5\u001b[0m\n", + "│ ├── \u001b[1mexpD51\u001b[0m\n", + "│ ├── \u001b[1mexpD52\u001b[0m\n", + "│ ├── \u001b[1mexpD53\u001b[0m\n", + "│ ├── \u001b[1mexpD54\u001b[0m\n", + "│ ├── \u001b[1mexpD55\u001b[0m\n", + "│ ├── \u001b[1mexpD56\u001b[0m\n", + "│ ├── \u001b[1mexpD57\u001b[0m\n", + "│ ├── \u001b[1mexpD58\u001b[0m\n", + "│ ├── \u001b[1mexpD6\u001b[0m\n", + "│ ├── \u001b[1mexpD7\u001b[0m\n", + "│ ├── \u001b[1mexpD8\u001b[0m\n", + "│ ├── \u001b[1mexpD9\u001b[0m\n", + "│ └── \u001b[1mhist\u001b[0m\n", + "├── \u001b[1mLSCE_GRISLI2\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ ├── \u001b[1mexpB10\u001b[0m\n", + "│ ├── \u001b[1mexpB6\u001b[0m\n", + "│ ├── \u001b[1mexpB7\u001b[0m\n", + "│ ├── \u001b[1mexpB8\u001b[0m\n", + "│ ├── \u001b[1mexpB9\u001b[0m\n", + "│ ├── \u001b[1mexpC1\u001b[0m\n", + "│ ├── \u001b[1mexpC10\u001b[0m\n", + "│ ├── \u001b[1mexpC12\u001b[0m\n", + "│ ├── \u001b[1mexpC3\u001b[0m\n", + "│ ├── \u001b[1mexpC4\u001b[0m\n", + "│ ├── \u001b[1mexpC6\u001b[0m\n", + "│ ├── \u001b[1mexpC7\u001b[0m\n", + "│ ├── \u001b[1mexpC9\u001b[0m\n", + "│ ├── \u001b[1mexpD1\u001b[0m\n", + "│ ├── \u001b[1mexpD10\u001b[0m\n", + "│ ├── \u001b[1mexpD11\u001b[0m\n", + "│ ├── \u001b[1mexpD12\u001b[0m\n", + "│ ├── \u001b[1mexpD13\u001b[0m\n", + "│ ├── \u001b[1mexpD14\u001b[0m\n", + "│ ├── \u001b[1mexpD15\u001b[0m\n", + "│ ├── \u001b[1mexpD16\u001b[0m\n", + "│ ├── \u001b[1mexpD17\u001b[0m\n", + "│ ├── \u001b[1mexpD18\u001b[0m\n", + "│ ├── \u001b[1mexpD2\u001b[0m\n", + "│ ├── \u001b[1mexpD3\u001b[0m\n", + "│ ├── \u001b[1mexpD4\u001b[0m\n", + "│ ├── \u001b[1mexpD5\u001b[0m\n", + "│ ├── \u001b[1mexpD51\u001b[0m\n", + "│ ├── \u001b[1mexpD52\u001b[0m\n", + "│ ├── \u001b[1mexpD53\u001b[0m\n", + "│ ├── \u001b[1mexpD54\u001b[0m\n", + "│ ├── \u001b[1mexpD55\u001b[0m\n", + "│ ├── \u001b[1mexpD56\u001b[0m\n", + "│ ├── \u001b[1mexpD57\u001b[0m\n", + "│ ├── \u001b[1mexpD58\u001b[0m\n", + "│ ├── \u001b[1mexpD6\u001b[0m\n", + "│ ├── \u001b[1mexpD7\u001b[0m\n", + "│ ├── \u001b[1mexpD8\u001b[0m\n", + "│ ├── \u001b[1mexpD9\u001b[0m\n", + "│ ├── \u001b[1mexpE10\u001b[0m\n", + "│ ├── \u001b[1mexpE6\u001b[0m\n", + "│ ├── \u001b[1mexpE7\u001b[0m\n", + "│ ├── \u001b[1mexpE8\u001b[0m\n", + "│ ├── \u001b[1mexpE9\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mNCAR_CISM\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_open\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ ├── \u001b[1mexp04\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA1\u001b[0m\n", + "│ ├── \u001b[1mexpA2\u001b[0m\n", + "│ ├── \u001b[1mexpA3\u001b[0m\n", + "│ ├── \u001b[1mexpA4\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ ├── \u001b[1mexpB1\u001b[0m\n", + "│ ├── \u001b[1mexpB10\u001b[0m\n", + "│ ├── \u001b[1mexpB2\u001b[0m\n", + "│ ├── \u001b[1mexpB3\u001b[0m\n", + "│ ├── \u001b[1mexpB4\u001b[0m\n", + "│ ├── \u001b[1mexpB5\u001b[0m\n", + "│ ├── \u001b[1mexpB6\u001b[0m\n", + "│ ├── \u001b[1mexpB7\u001b[0m\n", + "│ ├── \u001b[1mexpB8\u001b[0m\n", + "│ ├── \u001b[1mexpB9\u001b[0m\n", + "│ ├── \u001b[1mexpC1\u001b[0m\n", + "│ ├── \u001b[1mexpC10\u001b[0m\n", + "│ ├── \u001b[1mexpC10_open\u001b[0m\n", + "│ ├── \u001b[1mexpC11\u001b[0m\n", + "│ ├── \u001b[1mexpC12\u001b[0m\n", + "│ ├── \u001b[1mexpD1\u001b[0m\n", + "│ ├── \u001b[1mexpD10\u001b[0m\n", + "│ ├── \u001b[1mexpD11\u001b[0m\n", + "│ ├── \u001b[1mexpD12\u001b[0m\n", + "│ ├── \u001b[1mexpD13\u001b[0m\n", + "│ ├── \u001b[1mexpD14\u001b[0m\n", + "│ ├── \u001b[1mexpD15\u001b[0m\n", + "│ ├── \u001b[1mexpD16\u001b[0m\n", + "│ ├── \u001b[1mexpD17\u001b[0m\n", + "│ ├── \u001b[1mexpD18\u001b[0m\n", + "│ ├── \u001b[1mexpD2\u001b[0m\n", + "│ ├── \u001b[1mexpD3\u001b[0m\n", + "│ ├── \u001b[1mexpD4\u001b[0m\n", + "│ ├── \u001b[1mexpD5\u001b[0m\n", + "│ ├── \u001b[1mexpD51\u001b[0m\n", + "│ ├── \u001b[1mexpD52\u001b[0m\n", + "│ ├── \u001b[1mexpD53\u001b[0m\n", + "│ ├── \u001b[1mexpD54\u001b[0m\n", + "│ ├── \u001b[1mexpD55\u001b[0m\n", + "│ ├── \u001b[1mexpD56\u001b[0m\n", + "│ ├── \u001b[1mexpD57\u001b[0m\n", + "│ ├── \u001b[1mexpD58\u001b[0m\n", + "│ ├── \u001b[1mhist_open\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mPIK_PISM1\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_open\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ ├── \u001b[1mexp04\u001b[0m\n", + "│ └── \u001b[1mhist_open\u001b[0m\n", + "├── \u001b[1mPIK_PISM2\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_open\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ └── \u001b[1mexp04\u001b[0m\n", + "├── \u001b[1mUCIJPL_ISSM\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_open\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ ├── \u001b[1mexp04\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp11\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ ├── \u001b[1mexpB10\u001b[0m\n", + "│ ├── \u001b[1mexpB6\u001b[0m\n", + "│ ├── \u001b[1mexpB7\u001b[0m\n", + "│ ├── \u001b[1mexpB8\u001b[0m\n", + "│ ├── \u001b[1mexpB9\u001b[0m\n", + "│ ├── \u001b[1mexpC11\u001b[0m\n", + "│ ├── \u001b[1mexpC12\u001b[0m\n", + "│ ├── \u001b[1mexpC2\u001b[0m\n", + "│ ├── \u001b[1mexpC3\u001b[0m\n", + "│ ├── \u001b[1mexpC5\u001b[0m\n", + "│ ├── \u001b[1mexpC6\u001b[0m\n", + "│ ├── \u001b[1mexpD1\u001b[0m\n", + "│ ├── \u001b[1mexpD10\u001b[0m\n", + "│ ├── \u001b[1mexpD11\u001b[0m\n", + "│ ├── \u001b[1mexpD12\u001b[0m\n", + "│ ├── \u001b[1mexpD13\u001b[0m\n", + "│ ├── \u001b[1mexpD14\u001b[0m\n", + "│ ├── \u001b[1mexpD15\u001b[0m\n", + "│ ├── \u001b[1mexpD16\u001b[0m\n", + "│ ├── \u001b[1mexpD17\u001b[0m\n", + "│ ├── \u001b[1mexpD18\u001b[0m\n", + "│ ├── \u001b[1mexpD2\u001b[0m\n", + "│ ├── \u001b[1mexpD3\u001b[0m\n", + "│ ├── \u001b[1mexpD4\u001b[0m\n", + "│ ├── \u001b[1mexpD5\u001b[0m\n", + "│ ├── \u001b[1mexpD6\u001b[0m\n", + "│ ├── \u001b[1mexpD7\u001b[0m\n", + "│ ├── \u001b[1mexpD8\u001b[0m\n", + "│ ├── \u001b[1mexpD9\u001b[0m\n", + "│ ├── \u001b[1mhist_open\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mULB_fETISh_16km\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_open\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ ├── \u001b[1mexp04\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp11\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA1\u001b[0m\n", + "│ ├── \u001b[1mexpA2\u001b[0m\n", + "│ ├── \u001b[1mexpA3\u001b[0m\n", + "│ ├── \u001b[1mexpA4\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ ├── \u001b[1mhist_open\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mULB_fETISh_32km\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_open\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp01\u001b[0m\n", + "│ ├── \u001b[1mexp02\u001b[0m\n", + "│ ├── \u001b[1mexp03\u001b[0m\n", + "│ ├── \u001b[1mexp04\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexp11\u001b[0m\n", + "│ ├── \u001b[1mexp12\u001b[0m\n", + "│ ├── \u001b[1mexp13\u001b[0m\n", + "│ ├── \u001b[1mexpA1\u001b[0m\n", + "│ ├── \u001b[1mexpA2\u001b[0m\n", + "│ ├── \u001b[1mexpA3\u001b[0m\n", + "│ ├── \u001b[1mexpA4\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpA8\u001b[0m\n", + "│ ├── \u001b[1mhist_open\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "├── \u001b[1mUTAS_ElmerIce\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ └── \u001b[1mexp13\u001b[0m\n", + "├── \u001b[1mVUB_AISMPALEO\u001b[0m\n", + "│ ├── \u001b[1mctrl_proj_std\u001b[0m\n", + "│ ├── \u001b[1mexp05\u001b[0m\n", + "│ ├── \u001b[1mexp06\u001b[0m\n", + "│ ├── \u001b[1mexp07\u001b[0m\n", + "│ ├── \u001b[1mexp08\u001b[0m\n", + "│ ├── \u001b[1mexp09\u001b[0m\n", + "│ ├── \u001b[1mexp10\u001b[0m\n", + "│ ├── \u001b[1mexpA5\u001b[0m\n", + "│ ├── \u001b[1mexpA6\u001b[0m\n", + "│ ├── \u001b[1mexpA7\u001b[0m\n", + "│ ├── \u001b[1mexpB6\u001b[0m\n", + "│ ├── \u001b[1mexpB7\u001b[0m\n", + "│ ├── \u001b[1mexpB8\u001b[0m\n", + "│ └── \u001b[1mhist_std\u001b[0m\n", + "└── \u001b[1mVUW_PISM\u001b[0m\n", + " ├── \u001b[1mctrl_proj_open\u001b[0m\n", + " ├── \u001b[1mexp01\u001b[0m\n", + " ├── \u001b[1mexp02\u001b[0m\n", + " ├── \u001b[1mexp03\u001b[0m\n", + " ├── \u001b[1mexp04\u001b[0m\n", + " └── \u001b[1mhist_open\u001b[0m\n" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "root.tree(level=1)" + ] + }, + { + "cell_type": "markdown", + "id": "ce35d385-ae76-41b9-aa35-ed6daa6dcea5", + "metadata": { + "tags": [] + }, + "source": [ + "### Step 3a: Test reading data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1a80f13b-2294-4ed8-8d2c-c6a7bc54f91e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/aimeebarciauskas/github/ismip-indexing/.venv/lib/python3.13/site-packages/zarr/codecs/numcodecs/_codecs.py:141: ZarrUserWarning: Numcodecs codecs are not in the Zarr version 3 specification and may not be supported by other zarr implementations.\n", + " super().__init__(**codec_config)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5478.6328125 5843.875 6209.1171875 6574.359375 6939.6015625\n", + " 7304.84423611 7670.08642361 8035.32861111 8400.5703125 8765.8125 ]\n", + "[-3040000. -3032000. -3024000. -3016000. -3008000. -3000000. -2992000.\n", + " -2984000. -2976000. -2968000.]\n", + "[-3040000. -3032000. -3024000. -3016000. -3008000. -3000000. -2992000.\n", + " -2984000. -2976000. -2968000.]\n", + "[-9.e+33 -9.e+33 -9.e+33 -9.e+33 -9.e+33 -9.e+33 -9.e+33 -9.e+33 -9.e+33\n", + " -9.e+33]\n" + ] + } + ], + "source": [ + "# Get the array\n", + "prefix = '/VUB_AISMPALEO/ctrl_proj_std/base'\n", + "time_arr, x_arr, y_arr = root[f'{prefix}/time'], root[f'{prefix}/x'], root[f'{prefix}/y']\n", + "\n", + "# Check the array's attributes\n", + "print(time_arr[0:10])\n", + "print(x_arr[0:10])\n", + "print(y_arr[0:10])\n", + "\n", + "# Get the array\n", + "base_arr = root['/VUB_AISMPALEO/ctrl_proj_std/base/base']\n", + "\n", + "# Check the array's attributes\n", + "print(base_arr[0,0:10,0])" + ] + }, + { + "cell_type": "markdown", + "id": "a4a0c7ee-f748-4a80-aec1-eb9463f3916f", + "metadata": {}, + "source": [ + "## Step 4: Test Open + Plot with `xarray.open_datatree`\n", + "\n", + "Note: It is not recommended to do this with the entire datatree." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "16a6a18e-9f8a-420f-a0b9-31d630280cda", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dt = xr.open_datatree(\n", + " session.store,\n", + " engine=\"zarr\",\n", + " consolidated=False,\n", + " group='CPOM_BISICLES/expT71_08'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d5edc9c7-637c-4c21-af9e-a5e62748dd85", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataTree>\n",
+       "Group: /\n",
+       "├── Group: /yvelmean\n",
+       "│       Dimensions:   (time: 90, x: 761, y: 761)\n",
+       "│       Coordinates:\n",
+       "│         * time      (time) float64 720B 365.2 730.5 1.096e+03 ... 3.251e+04 3.287e+04\n",
+       "│         * x         (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│         * y         (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│           lat       (x, y) float64 5MB ...\n",
+       "│           lon       (x, y) float64 5MB ...\n",
+       "│       Data variables:\n",
+       "│           yvelmean  (time, x, y) float64 417MB ...\n",
+       "│       Attributes:\n",
+       "│           info:      Model CPOM BISICLES\n",
+       "│           history:   bisiclesISMIPVarExtractorV2.py\n",
+       "│           meshName:  6080x6080km_8km_Antarctic_stereo\n",
+       "├── Group: /dlithkdt\n",
+       "│       Dimensions:   (time: 91, x: 761, y: 761)\n",
+       "│       Coordinates:\n",
+       "│         * time      (time) float64 728B 365.2 730.5 1.096e+03 ... 3.287e+04 3.324e+04\n",
+       "│         * x         (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│         * y         (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│           lon       (x, y) float64 5MB ...\n",
+       "│           lat       (x, y) float64 5MB ...\n",
+       "│       Data variables:\n",
+       "│           dlithkdt  (time, x, y) float64 422MB ...\n",
+       "│       Attributes:\n",
+       "│           info:      Model CPOM BISICLES\n",
+       "│           history:   bisiclesISMIPVarExtractorV2.py\n",
+       "│           meshName:  6080x6080km_8km_Antarctic_stereo\n",
+       "├── Group: /libmassbfgr\n",
+       "│       Dimensions:      (time: 91, x: 761, y: 761)\n",
+       "│       Coordinates:\n",
+       "│         * time         (time) float64 728B 365.2 730.5 ... 3.287e+04 3.324e+04\n",
+       "│         * x            (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│         * y            (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│           lat          (x, y) float64 5MB ...\n",
+       "│           lon          (x, y) float64 5MB ...\n",
+       "│       Data variables:\n",
+       "│           libmassbfgr  (time, x, y) float64 422MB ...\n",
+       "│       Attributes:\n",
+       "│           info:      Model CPOM BISICLES\n",
+       "│           history:   bisiclesISMIPVarExtractorV2.py\n",
+       "│           meshName:  6080x6080km_8km_Antarctic_stereo\n",
+       "...\n",
+       "├── Group: /libmassbffl\n",
+       "│       Dimensions:      (time: 91, x: 761, y: 761)\n",
+       "│       Coordinates:\n",
+       "│         * time         (time) float64 728B 365.2 730.5 ... 3.287e+04 3.324e+04\n",
+       "│         * x            (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│         * y            (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│           lat          (x, y) float64 5MB ...\n",
+       "│           lon          (x, y) float64 5MB ...\n",
+       "│       Data variables:\n",
+       "│           libmassbffl  (time, x, y) float64 422MB ...\n",
+       "│       Attributes:\n",
+       "│           info:      Model CPOM BISICLES\n",
+       "│           history:   bisiclesISMIPVarExtractorV2.py\n",
+       "│           meshName:  6080x6080km_8km_Antarctic_stereo\n",
+       "├── Group: /tendlifmassbf\n",
+       "│       Dimensions:        (time: 91)\n",
+       "│       Coordinates:\n",
+       "│         * time           (time) float64 728B 2.318e-310 2.318e-310 ... 2.592e-165\n",
+       "│       Data variables:\n",
+       "│           tendlifmassbf  (time) float64 728B ...\n",
+       "│       Attributes:\n",
+       "│           info:     Model CPOM BISICLES\n",
+       "└── Group: /sftgif\n",
+       "        Dimensions:  (time: 90, x: 761, y: 761)\n",
+       "        Coordinates:\n",
+       "          * time     (time) float64 720B 365.2 730.5 1.096e+03 ... 3.251e+04 3.287e+04\n",
+       "          * x        (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "          * y        (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "            lon      (x, y) float64 5MB ...\n",
+       "            lat      (x, y) float64 5MB ...\n",
+       "        Data variables:\n",
+       "            sftgif   (time, x, y) float64 417MB ...\n",
+       "        Attributes:\n",
+       "            info:      Model CPOM BISICLES\n",
+       "            history:   bisiclesISMIPVarExtractorV2.py\n",
+       "            meshName:  6080x6080km_8km_Antarctic_stereo
" + ], + "text/plain": [ + "\n", + "Group: /\n", + "├── Group: /yvelmean\n", + "│ Dimensions: (time: 90, x: 761, y: 761)\n", + "│ Coordinates:\n", + "│ * time (time) float64 720B 365.2 730.5 1.096e+03 ... 3.251e+04 3.287e+04\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ lat (x, y) float64 5MB ...\n", + "│ lon (x, y) float64 5MB ...\n", + "│ Data variables:\n", + "│ yvelmean (time, x, y) float64 417MB ...\n", + "│ Attributes:\n", + "│ info: Model CPOM BISICLES\n", + "│ history: bisiclesISMIPVarExtractorV2.py\n", + "│ meshName: 6080x6080km_8km_Antarctic_stereo\n", + "├── Group: /dlithkdt\n", + "│ Dimensions: (time: 91, x: 761, y: 761)\n", + "│ Coordinates:\n", + "│ * time (time) float64 728B 365.2 730.5 1.096e+03 ... 3.287e+04 3.324e+04\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ lon (x, y) float64 5MB ...\n", + "│ lat (x, y) float64 5MB ...\n", + "│ Data variables:\n", + "│ dlithkdt (time, x, y) float64 422MB ...\n", + "│ Attributes:\n", + "│ info: Model CPOM BISICLES\n", + "│ history: bisiclesISMIPVarExtractorV2.py\n", + "│ meshName: 6080x6080km_8km_Antarctic_stereo\n", + "├── Group: /libmassbfgr\n", + "│ Dimensions: (time: 91, x: 761, y: 761)\n", + "│ Coordinates:\n", + "│ * time (time) float64 728B 365.2 730.5 ... 3.287e+04 3.324e+04\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ lat (x, y) float64 5MB ...\n", + "│ lon (x, y) float64 5MB ...\n", + "│ Data variables:\n", + "│ libmassbfgr (time, x, y) float64 422MB ...\n", + "│ Attributes:\n", + "│ info: Model CPOM BISICLES\n", + "│ history: bisiclesISMIPVarExtractorV2.py\n", + "│ meshName: 6080x6080km_8km_Antarctic_stereo\n", + "...\n", + "├── Group: /libmassbffl\n", + "│ Dimensions: (time: 91, x: 761, y: 761)\n", + "│ Coordinates:\n", + "│ * time (time) float64 728B 365.2 730.5 ... 3.287e+04 3.324e+04\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ lat (x, y) float64 5MB ...\n", + "│ lon (x, y) float64 5MB ...\n", + "│ Data variables:\n", + "│ libmassbffl (time, x, y) float64 422MB ...\n", + "│ Attributes:\n", + "│ info: Model CPOM BISICLES\n", + "│ history: bisiclesISMIPVarExtractorV2.py\n", + "│ meshName: 6080x6080km_8km_Antarctic_stereo\n", + "├── Group: /tendlifmassbf\n", + "│ Dimensions: (time: 91)\n", + "│ Coordinates:\n", + "│ * time (time) float64 728B 2.318e-310 2.318e-310 ... 2.592e-165\n", + "│ Data variables:\n", + "│ tendlifmassbf (time) float64 728B ...\n", + "│ Attributes:\n", + "│ info: Model CPOM BISICLES\n", + "└── Group: /sftgif\n", + " Dimensions: (time: 90, x: 761, y: 761)\n", + " Coordinates:\n", + " * time (time) float64 720B 365.2 730.5 1.096e+03 ... 3.251e+04 3.287e+04\n", + " * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + " * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + " lon (x, y) float64 5MB ...\n", + " lat (x, y) float64 5MB ...\n", + " Data variables:\n", + " sftgif (time, x, y) float64 417MB ...\n", + " Attributes:\n", + " info: Model CPOM BISICLES\n", + " history: bisiclesISMIPVarExtractorV2.py\n", + " meshName: 6080x6080km_8km_Antarctic_stereo" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b9fc8ce3-f2ce-4ed7-94fd-2c111b827772", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'base' (time: 90, x: 761, y: 761)> Size: 417MB\n",
+       "[52120890 values with dtype=float64]\n",
+       "Coordinates:\n",
+       "  * time     (time) float64 720B 365.2 730.5 1.096e+03 ... 3.251e+04 3.287e+04\n",
+       "  * x        (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "  * y        (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "    lat      (x, y) float64 5MB ...\n",
+       "    lon      (x, y) float64 5MB ...\n",
+       "Attributes:\n",
+       "    units:          m\n",
+       "    standard_name:  base_altitude
" + ], + "text/plain": [ + " Size: 417MB\n", + "[52120890 values with dtype=float64]\n", + "Coordinates:\n", + " * time (time) float64 720B 365.2 730.5 1.096e+03 ... 3.251e+04 3.287e+04\n", + " * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + " * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + " lat (x, y) float64 5MB ...\n", + " lon (x, y) float64 5MB ...\n", + "Attributes:\n", + " units: m\n", + " standard_name: base_altitude" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "base_array = dt['base'].base\n", + "base_array" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b3f5c2a4-7e02-4643-be8c-422ac341fde5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(np.float64(-1125.118165164284), np.float64(1415.013436026001))" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vmin, vmax = base_array.quantile([0.01, 0.99]).values\n", + "vmin, vmax" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "4a19f32f-d068-4d11-9077-c4825413e7ee", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5834b6150ec444de96800280fc1750bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BokehModel(combine_events=True, render_bundle={'docs_json': {'fe7255a7-a760-40c3-b756-9a2bf0b8e621': {'version…" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "base_array.hvplot.image(\n", + " x='x', \n", + " y='y', \n", + " clim=(vmin, vmax), \n", + " cmap='RdBu',\n", + " groupby='time',\n", + " widget_location='bottom',\n", + " aspect='equal',\n", + " title=(\" \").join(base_array.attrs['standard_name'].split(\"_\"))\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a49cf51d-5c40-4574-93e4-904202024c14", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "kernel": "conda-env-python313-py", + "name": "workbench-notebooks.m136", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m136" + }, + "kernelspec": { + "display_name": ".venv", + "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.13.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/open_icechunk_local.ipynb b/notebooks/open_icechunk_local.ipynb new file mode 100644 index 0000000..a395a75 --- /dev/null +++ b/notebooks/open_icechunk_local.ipynb @@ -0,0 +1,2722 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7f3d3038-948d-4846-b2e2-8be2dde9f661", + "metadata": {}, + "source": [ + "# Test opening and reading from the Icechunk Store\n", + "\n", + "## Step 0: Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e4ecb459-e6ec-45f6-b291-61f6da476fe4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n const py_version = '3.8.0'.replace('rc', '-rc.').replace('.dev', '-dev.');\n const reloading = false;\n const Bokeh = root.Bokeh;\n\n // Set a timeout for this load but only if we are not already initializing\n if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n // Don't load bokeh if it is still initializing\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n // There is nothing to load\n run_callbacks();\n return null;\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error(e) {\n const src_el = e.srcElement\n console.error(\"failed to load \" + (src_el.href || src_el.src));\n }\n\n const skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n const existing_stylesheets = []\n const links = document.getElementsByTagName('link')\n for (let i = 0; i < links.length; i++) {\n const link = links[i]\n if (link.href != null) {\n existing_stylesheets.push(link.href)\n }\n }\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const escaped = encodeURI(url)\n if (existing_stylesheets.indexOf(escaped) !== -1) {\n on_load()\n continue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n const scripts = document.getElementsByTagName('script')\n for (let i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n existing_scripts.push(script.src)\n }\n }\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (let i = 0; i < js_modules.length; i++) {\n const url = js_modules[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n const url = js_exports[name];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.holoviz.org/panel/1.8.2/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.8.0.min.js\", \"https://cdn.holoviz.org/panel/1.8.2/dist/panel.min.js\"];\n const js_modules = [];\n const js_exports = {};\n const css_urls = [];\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (let i = 0; i < inline_js.length; i++) {\n try {\n inline_js[i].call(root, root.Bokeh);\n } catch(e) {\n if (!reloading) {\n throw e;\n }\n }\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n var NewBokeh = root.Bokeh;\n if (Bokeh.versions === undefined) {\n Bokeh.versions = new Map();\n }\n if (NewBokeh.version !== Bokeh.version) {\n Bokeh.versions.set(NewBokeh.version, NewBokeh)\n }\n root.Bokeh = Bokeh;\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n // If the timeout and bokeh was not successfully loaded we reset\n // everything and try loading again\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n root._bokeh_is_loading = 0\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n if (root.Bokeh) {\n root.Bokeh = undefined;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", + "application/vnd.holoviews_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n let retries = 0;\n const open = () => {\n if (comm.active) {\n comm.open();\n } else if (retries > 3) {\n console.warn('Comm target never activated')\n } else {\n retries += 1\n setTimeout(open, 500)\n }\n }\n if (comm.active) {\n comm.open();\n } else {\n setTimeout(open, 500)\n }\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n })\n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", + "application/vnd.holoviews_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ] + }, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "7e3ba38f-58bb-4b92-ae1a-25952ed3d2b3" + } + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import icechunk\n", + "import xarray as xr\n", + "import hvplot.xarray\n", + "import zarr\n", + "\n", + "zarr.config.set({\n", + " 'async.concurrency': 100,\n", + " 'threading.max_workers': None\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "13b66768-8874-4970-b33a-b560272b9cc8", + "metadata": {}, + "source": [ + "## Step 1: Setup Icechunk Store" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "98a8fe8a-e6c8-40b7-9124-1e53db69ba89", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \u001b[2m2025-12-18T21:40:13.990082Z\u001b[0m \u001b[33m WARN\u001b[0m \u001b[1;33micechunk::storage::object_store\u001b[0m\u001b[33m: \u001b[33mThe LocalFileSystem storage is not safe for concurrent commits. If more than one thread/process will attempt to commit at the same time, prefer using object stores.\u001b[0m\n", + " \u001b[2;3mat\u001b[0m icechunk/src/storage/object_store.rs:80\n", + "\n" + ] + } + ], + "source": [ + "# When opening the repo, use None for anonymous/public access\n", + "credentials = icechunk.containers_credentials({\n", + " \"gs://ismip6/\": None\n", + "})\n", + "config = icechunk.RepositoryConfig.default()\n", + "\n", + "icechunk_storage = icechunk.local_filesystem_storage(\"../test-output/test_icechunk\")\n", + "repo = icechunk.Repository.open(icechunk_storage, config, authorize_virtual_chunk_access=credentials)\n", + "session = repo.readonly_session(branch=\"main\")" + ] + }, + { + "cell_type": "markdown", + "id": "e679ea06", + "metadata": {}, + "source": [ + "## Step 3 Opening with datatree" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c461c15b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/juliusbusecke/Code/ismip-indexing/.venv/lib/python3.13/site-packages/zarr/codecs/numcodecs/_codecs.py:141: ZarrUserWarning: Numcodecs codecs are not in the Zarr version 3 specification and may not be supported by other zarr implementations.\n", + " super().__init__(**codec_config)\n" + ] + } + ], + "source": [ + "dt = xr.open_datatree(\n", + " session.store,\n", + " engine=\"zarr\",\n", + " consolidated=False,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0b1d8417", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataTree>\n",
+       "Group: /\n",
+       "├── Group: /CPOM_BISICLES\n",
+       "│   └── Group: /CPOM_BISICLES/expTD58_08\n",
+       "│           Dimensions:          (time: 90, x: 761, y: 761)\n",
+       "│           Coordinates:\n",
+       "│             * time             (time) float64 720B 365.2 730.5 ... 3.251e+04 3.287e+04\n",
+       "│             * x                (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│             * y                (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│               lat              (x, y) float64 5MB ...\n",
+       "│               lon              (x, y) float64 5MB ...\n",
+       "│           Data variables: (12/31)\n",
+       "│               acabf            (time, x, y) float64 417MB ...\n",
+       "│               yvelmean         (time, x, y) float64 417MB ...\n",
+       "│               dlithkdt         (time, x, y) float64 417MB ...\n",
+       "│               iareagr          (time) float64 720B ...\n",
+       "│               libmassbfgr      (time, x, y) float64 417MB ...\n",
+       "│               ligroundf        (time, x, y) float64 417MB ...\n",
+       "│               ...               ...\n",
+       "│               lim              (time) float64 720B ...\n",
+       "│               sftgif           (time, x, y) float64 417MB ...\n",
+       "│               xvelbase         (time, x, y) float64 417MB ...\n",
+       "│               litemptop        (time, x, y) float64 417MB ...\n",
+       "│               iareafl          (time) float64 720B ...\n",
+       "│               tendlibmassbf    (time) float64 720B ...\n",
+       "│           Attributes:\n",
+       "│               info:      Model CPOM BISICLES\n",
+       "│               history:   bisiclesISMIPVarExtractorV2.py\n",
+       "│               meshName:  6080x6080km_8km_Antarctic_stereo\n",
+       "├── Group: /AWI_PISM1\n",
+       "│   ├── Group: /AWI_PISM1/expA8\n",
+       "│   │       Dimensions:        (time: 86, bnds: 2, y: 761, x: 761)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time           (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n",
+       "│   │         * bnds           (bnds) float32 8B 0.0 0.0\n",
+       "│   │         * y              (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x              (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           time_bnds      (time, bnds) object 1kB ...\n",
+       "│   │           sftflf         (time, y, x) float32 199MB ...\n",
+       "│   │           tendligroundf  (time) float32 344B ...\n",
+       "│   │           dlithkdt       (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr    (time, y, x) float32 199MB ...\n",
+       "│   │           lifmassbf      (time, y, x) float32 199MB ...\n",
+       "│   │           ...             ...\n",
+       "│   │           sftgrf         (time, y, x) float32 199MB ...\n",
+       "│   │           zvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr    (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean       (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl    (time, y, x) float32 199MB ...\n",
+       "│   │           lithk          (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           title:        ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:  Alfred Wegener Institute for Polar and Marine Research, DE,...\n",
+       "│   │           source:       PISM\n",
+       "│   │           references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           contact:      Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n",
+       "│   │           comment:      AWI, PISM1\n",
+       "│   ├── Group: /AWI_PISM1/expB4\n",
+       "│   │       Dimensions:        (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time           (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n",
+       "│   │         * y              (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x              (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * bnds           (bnds) float32 8B 0.0 0.0\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           acabf          (time, y, x) float32 199MB ...\n",
+       "│   │           base           (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl    (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr    (time, y, x) float32 199MB ...\n",
+       "│   │           zvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │           lifmassbf      (time, y, x) float32 199MB ...\n",
+       "│   │           ...             ...\n",
+       "│   │           zvelbase       (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf         (time, y, x) float32 199MB ...\n",
+       "│   │           strbasemag     (time, y, x) float32 199MB ...\n",
+       "│   │           xvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │           ligroundf      (time, y, x) float32 199MB ...\n",
+       "│   │           time_bnds      (time, bnds) object 1kB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           title:        ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:  Alfred Wegener Institute for Polar and Marine Research, DE,...\n",
+       "│   │           source:       PISM\n",
+       "│   │           references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           contact:      Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n",
+       "│   │           comment:      AWI, PISM1\n",
+       "│   ├── Group: /AWI_PISM1/expB9\n",
+       "│   │       Dimensions:        (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time           (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n",
+       "│   │         * y              (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x              (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * bnds           (bnds) float32 8B 0.0 0.0\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           orog           (time, y, x) float32 199MB ...\n",
+       "│   │           base           (time, y, x) float32 199MB ...\n",
+       "│   │           sftflf         (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt       (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf         (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean       (time, y, x) float32 199MB ...\n",
+       "│   │           ...             ...\n",
+       "│   │           strbasemag     (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr    (time, y, x) float32 199MB ...\n",
+       "│   │           licalvf        (time, y, x) float32 199MB ...\n",
+       "│   │           topg           (time, y, x) float32 199MB ...\n",
+       "│   │           acabf          (time, y, x) float32 199MB ...\n",
+       "│   │           xvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           title:        ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:  Alfred Wegener Institute for Polar and Marine Research, DE,...\n",
+       "│   │           source:       PISM\n",
+       "│   │           references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           contact:      Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n",
+       "│   │           comment:      AWI, PISM1\n",
+       "│   ...\n",
+       "│   ├── Group: /AWI_PISM1/exp01\n",
+       "│   │       Dimensions:        (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time           (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n",
+       "│   │         * y              (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x              (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * bnds           (bnds) float32 8B 0.0 0.0\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           yvelmean       (time, y, x) float32 199MB ...\n",
+       "│   │           zvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │           base           (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr    (time, y, x) float32 199MB ...\n",
+       "│   │           lithk          (time, y, x) float32 199MB ...\n",
+       "│   │           sftflf         (time, y, x) float32 199MB ...\n",
+       "│   │           ...             ...\n",
+       "│   │           licalvf        (time, y, x) float32 199MB ...\n",
+       "│   │           ligroundf      (time, y, x) float32 199MB ...\n",
+       "│   │           yvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed      (time, y, x) float32 199MB ...\n",
+       "│   │           litemptop      (time, y, x) float32 199MB ...\n",
+       "│   │           xvelbase       (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           title:        ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:  Alfred Wegener Institute for Polar and Marine Research, DE,...\n",
+       "│   │           source:       PISM\n",
+       "│   │           references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           contact:      Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n",
+       "│   │           comment:      AWI, PISM1\n",
+       "│   ├── Group: /AWI_PISM1/exp02\n",
+       "│   │       Dimensions:        (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time           (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n",
+       "│   │         * y              (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x              (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * bnds           (bnds) float32 8B 0.0 0.0\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           acabf          (time, y, x) float32 199MB ...\n",
+       "│   │           zvelsurf       (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt       (time, y, x) float32 199MB ...\n",
+       "│   │           lifmassbf      (time, y, x) float32 199MB ...\n",
+       "│   │           lithk          (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf         (time, y, x) float32 199MB ...\n",
+       "│   │           ...             ...\n",
+       "│   │           sftgif         (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean       (time, y, x) float32 199MB ...\n",
+       "│   │           sftflf         (time, y, x) float32 199MB ...\n",
+       "│   │           base           (time, y, x) float32 199MB ...\n",
+       "│   │           time_bnds      (time, bnds) object 1kB ...\n",
+       "│   │           ligroundf      (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           title:        ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:  Alfred Wegener Institute for Polar and Marine Research, DE,...\n",
+       "│   │           source:       PISM\n",
+       "│   │           references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           contact:      Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n",
+       "│   │           comment:      AWI, PISM1\n",
+       "│   └── Group: /AWI_PISM1/exp12\n",
+       "│           Dimensions:        (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│           Coordinates:\n",
+       "│             * time           (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n",
+       "│             * y              (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│             * x              (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│             * bnds           (bnds) float32 8B 0.0 0.0\n",
+       "│           Data variables: (12/29)\n",
+       "│               zvelbase       (time, y, x) float32 199MB ...\n",
+       "│               base           (time, y, x) float32 199MB ...\n",
+       "│               zvelsurf       (time, y, x) float32 199MB ...\n",
+       "│               dlithkdt       (time, y, x) float32 199MB ...\n",
+       "│               hfgeoubed      (time, y, x) float32 199MB ...\n",
+       "│               libmassbfgr    (time, y, x) float32 199MB ...\n",
+       "│               ...             ...\n",
+       "│               xvelmean       (time, y, x) float32 199MB ...\n",
+       "│               libmassbffl    (time, y, x) float32 199MB ...\n",
+       "│               time_bnds      (time, bnds) object 1kB ...\n",
+       "│               orog           (time, y, x) float32 199MB ...\n",
+       "│               xvelbase       (time, y, x) float32 199MB ...\n",
+       "│               litempbotfl    (time, y, x) float32 199MB ...\n",
+       "│           Attributes:\n",
+       "│               Conventions:  CF-1.6\n",
+       "│               title:        ISMIP6 Projections Greenland model output\n",
+       "│               institution:  Alfred Wegener Institute for Polar and Marine Research, DE,...\n",
+       "│               source:       PISM\n",
+       "│               references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│               contact:      Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n",
+       "│               comment:      AWI, PISM1\n",
+       "├── Group: /ILTS_PIK_SICOPOLIS1\n",
+       "│   ├── Group: /ILTS_PIK_SICOPOLIS1/expD12\n",
+       "│   │       Dimensions:      (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time         (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n",
+       "│   │         * y            (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x            (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │       Dimensions without coordinates: bnds\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           xvelsurf     (time, y, x) float32 199MB ...\n",
+       "│   │           base         (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl  (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr  (time, y, x) float32 199MB ...\n",
+       "│   │           lifmassbf    (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr  (time, y, x) float32 199MB ...\n",
+       "│   │           ...           ...\n",
+       "│   │           acabf        (time, y, x) float32 199MB ...\n",
+       "│   │           xvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotfl  (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean     (time, y, x) float32 199MB ...\n",
+       "│   │           zvelsurf     (time, y, x) float32 199MB ...\n",
+       "│   │           mapping      int8 1B ...\n",
+       "│   │       Attributes:\n",
+       "│   │           title:        ISMIP6 output of simulation ant08_b2_future25-06_expD12\n",
+       "│   │           institution:  Institute of Low Temperature Science, Hokkaido University, ...\n",
+       "│   │           source:       SICOPOLIS Version 5.1\n",
+       "│   │           history:      Tue Feb  4 12:21:20 2020: ncks -O -F -v time,time_bnds,year...\n",
+       "│   │           references:   http://www.sicopolis.net/\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           NCO:          netCDF Operators version 4.8.1 (Homepage = http://nco.sf.ne...\n",
+       "│   │           url:          gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD12/acabf...\n",
+       "│   ├── Group: /ILTS_PIK_SICOPOLIS1/expD11\n",
+       "│   │       Dimensions:      (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time         (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n",
+       "│   │         * y            (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x            (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │       Dimensions without coordinates: bnds\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           acabf        (time, y, x) float32 199MB ...\n",
+       "│   │           year         (time) float32 344B ...\n",
+       "│   │           base         (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt     (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed    (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl  (time, y, x) float32 199MB ...\n",
+       "│   │           ...           ...\n",
+       "│   │           yvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr  (time, y, x) float32 199MB ...\n",
+       "│   │           lithk        (time, y, x) float32 199MB ...\n",
+       "│   │           topg         (time, y, x) float32 199MB ...\n",
+       "│   │           sftgif       (time, y, x) float32 199MB ...\n",
+       "│   │           xvelsurf     (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           title:        ISMIP6 output of simulation ant08_b2_future25-06_expD11\n",
+       "│   │           institution:  Institute of Low Temperature Science, Hokkaido University, ...\n",
+       "│   │           source:       SICOPOLIS Version 5.1\n",
+       "│   │           history:      Tue Feb  4 12:20:29 2020: ncks -O -F -v time,time_bnds,year...\n",
+       "│   │           references:   http://www.sicopolis.net/\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           NCO:          netCDF Operators version 4.8.1 (Homepage = http://nco.sf.ne...\n",
+       "│   │           url:          gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD11/acabf...\n",
+       "│   ├── Group: /ILTS_PIK_SICOPOLIS1/exp06\n",
+       "│   │       Dimensions:      (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time         (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n",
+       "│   │         * y            (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x            (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │           lat          (y, x) float32 2MB ...\n",
+       "│   │           lon          (y, x) float32 2MB ...\n",
+       "│   │       Dimensions without coordinates: bnds\n",
+       "│   │       Data variables: (12/28)\n",
+       "│   │           acabf        (time, y, x) float32 199MB ...\n",
+       "│   │           xvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf       (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed    (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl  (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr  (time, y, x) float32 199MB ...\n",
+       "│   │           ...           ...\n",
+       "│   │           sftgif       (time, y, x) float32 199MB ...\n",
+       "│   │           base         (time, y, x) float32 199MB ...\n",
+       "│   │           yvelmean     (time, y, x) float32 199MB ...\n",
+       "│   │           topg         (time, y, x) float32 199MB ...\n",
+       "│   │           litemptop    (time, y, x) float32 199MB ...\n",
+       "│   │           zvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           title:        ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:  Institute of Low Temperature Science, Hokkaido University, ...\n",
+       "│   │           source:       SICOPOLIS\n",
+       "│   │           references:   https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           contact:      Name = Ralf Greve, Reinhard Calov, Email = greve@lowtem.hok...\n",
+       "│   │           comment:      ILTS_PIK, SICOPOLIS1\n",
+       "│   │           url:          gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/exp06/acabf_...\n",
+       "│   ...\n",
+       "│   ├── Group: /ILTS_PIK_SICOPOLIS1/expD51\n",
+       "│   │       Dimensions:      (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time         (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n",
+       "│   │         * y            (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x            (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │           lon          (y, x) float32 2MB ...\n",
+       "│   │           lat          (y, x) float32 2MB ...\n",
+       "│   │       Dimensions without coordinates: bnds\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           acabf        (time, y, x) float32 199MB ...\n",
+       "│   │           yvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │           zvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed    (time, y, x) float32 199MB ...\n",
+       "│   │           lifmassbf    (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr  (time, y, x) float32 199MB ...\n",
+       "│   │           ...           ...\n",
+       "│   │           xvelmean     (time, y, x) float32 199MB ...\n",
+       "│   │           crs          int8 1B ...\n",
+       "│   │           litemptop    (time, y, x) float32 199MB ...\n",
+       "│   │           zvelsurf     (time, y, x) float32 199MB ...\n",
+       "│   │           licalvf      (time, y, x) float32 199MB ...\n",
+       "│   │           sftflf       (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           title:        ISMIP6 output of simulation ant08_b2_future25-06_expD51\n",
+       "│   │           institution:  Institute of Low Temperature Science, Hokkaido University, ...\n",
+       "│   │           source:       SICOPOLIS Version 5-dev\n",
+       "│   │           history:      Sun Oct  6 18:07:06 2019: ncks -O -F -v time,time_bnds,year...\n",
+       "│   │           references:   http://www.sicopolis.net/\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           NCO:          netCDF Operators version 4.7.8 (Homepage = http://nco.sf.ne...\n",
+       "│   │           url:          gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD51/acabf...\n",
+       "│   ├── Group: /ILTS_PIK_SICOPOLIS1/expD53\n",
+       "│   │       Dimensions:      (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time         (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n",
+       "│   │         * y            (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │         * x            (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│   │           lat          (y, x) float32 2MB ...\n",
+       "│   │           lon          (y, x) float32 2MB ...\n",
+       "│   │       Dimensions without coordinates: bnds\n",
+       "│   │       Data variables: (12/29)\n",
+       "│   │           yvelmean     (time, y, x) float32 199MB ...\n",
+       "│   │           base         (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed    (time, y, x) float32 199MB ...\n",
+       "│   │           yvelsurf     (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl  (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotfl  (time, y, x) float32 199MB ...\n",
+       "│   │           ...           ...\n",
+       "│   │           yvelbase     (time, y, x) float32 199MB ...\n",
+       "│   │           orog         (time, y, x) float32 199MB ...\n",
+       "│   │           time_bnds    (time, bnds) object 1kB ...\n",
+       "│   │           licalvf      (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr  (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean     (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           title:        ISMIP6 output of simulation ant08_b2_future25-06_expD53\n",
+       "│   │           institution:  Institute of Low Temperature Science, Hokkaido University, ...\n",
+       "│   │           source:       SICOPOLIS Version 5-dev\n",
+       "│   │           history:      Sun Oct  6 18:07:23 2019: ncks -O -F -v time,time_bnds,year...\n",
+       "│   │           references:   http://www.sicopolis.net/\n",
+       "│   │           Conventions:  CF-1.6\n",
+       "│   │           NCO:          netCDF Operators version 4.7.8 (Homepage = http://nco.sf.ne...\n",
+       "│   │           url:          gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD53/acabf...\n",
+       "│   └── Group: /ILTS_PIK_SICOPOLIS1/expA7\n",
+       "│           Dimensions:      (time: 86, y: 761, x: 761, bnds: 2)\n",
+       "│           Coordinates:\n",
+       "│             * time         (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n",
+       "│             * y            (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│             * x            (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n",
+       "│               lat          (y, x) float32 2MB ...\n",
+       "│               lon          (y, x) float32 2MB ...\n",
+       "│           Dimensions without coordinates: bnds\n",
+       "│           Data variables: (12/29)\n",
+       "│               yvelbase     (time, y, x) float32 199MB ...\n",
+       "│               year         (time) float32 344B ...\n",
+       "│               xvelbase     (time, y, x) float32 199MB ...\n",
+       "│               libmassbffl  (time, y, x) float32 199MB ...\n",
+       "│               licalvf      (time, y, x) float32 199MB ...\n",
+       "│               litempbotfl  (time, y, x) float32 199MB ...\n",
+       "│               ...           ...\n",
+       "│               lithk        (time, y, x) float32 199MB ...\n",
+       "│               lifmassbf    (time, y, x) float32 199MB ...\n",
+       "│               strbasemag   (time, y, x) float32 199MB ...\n",
+       "│               zvelsurf     (time, y, x) float32 199MB ...\n",
+       "│               crs          int8 1B ...\n",
+       "│               sftgif       (time, y, x) float32 199MB ...\n",
+       "│           Attributes:\n",
+       "│               title:        ISMIP6 output of simulation ant08_b2_future25-06_expA7\n",
+       "│               institution:  Institute of Low Temperature Science, Hokkaido University, ...\n",
+       "│               source:       SICOPOLIS Version 5-dev\n",
+       "│               history:      Wed Oct  2 11:09:28 2019: ncks -O -F -v time,time_bnds,year...\n",
+       "│               references:   http://www.sicopolis.net/\n",
+       "│               Conventions:  CF-1.6\n",
+       "│               NCO:          netCDF Operators version 4.7.8 (Homepage = http://nco.sf.ne...\n",
+       "│               url:          gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expA7/acabf_...\n",
+       "...\n",
+       "├── Group: /JPL1_ISSM\n",
+       "│   ├── Group: /JPL1_ISSM/expD56\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Data variables: (12/14)\n",
+       "│   │           acabf                (time, y, x) float32 199MB ...\n",
+       "│   │           lithk                (time, y, x) float32 199MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 199MB ...\n",
+       "│   │           strbasemag           (time, y, x) float32 199MB ...\n",
+       "│   │           base                 (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           sftgrf               (time, y, x) float32 199MB ...\n",
+       "│   │           yvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│   │           orog                 (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Author:        Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n",
+       "│   │           Model:         ISSM (Ice Sheet System Model)\n",
+       "│   │           Variable:      Surface mass balance\n",
+       "│   │           Notes:         Experiments performed at Caltech Jet Propulsion Laboratory...\n",
+       "│   │           Date:          11-Feb-2021\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ├── Group: /JPL1_ISSM/expD57\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Data variables: (12/14)\n",
+       "│   │           acabf                (time, y, x) float32 199MB ...\n",
+       "│   │           strbasemag           (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│   │           yvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 199MB ...\n",
+       "│   │           base                 (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           lithk                (time, y, x) float32 199MB ...\n",
+       "│   │           orog                 (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf               (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           sftflf               (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Author:        Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n",
+       "│   │           Model:         ISSM (Ice Sheet System Model)\n",
+       "│   │           Variable:      Surface mass balance\n",
+       "│   │           Notes:         Experiments performed at Caltech Jet Propulsion Laboratory...\n",
+       "│   │           Date:          11-Feb-2021\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ├── Group: /JPL1_ISSM/ctrl\n",
+       "│   │       Dimensions:              (time: 101, y: 761, x: 761)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) object 808B 2007-01-01 00:00:00 ... 2107-01-0...\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Data variables: (12/14)\n",
+       "│   │           xvelmean             (time, y, x) float32 234MB ...\n",
+       "│   │           base                 (time, y, x) float32 234MB ...\n",
+       "│   │           hfgeoubed            (time, y, x) float32 234MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 234MB ...\n",
+       "│   │           sftflf               (time, y, x) float32 234MB ...\n",
+       "│   │           sftgrf               (time, y, x) float32 234MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           yvelmean             (time, y, x) float32 234MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 234MB ...\n",
+       "│   │           orog                 (time, y, x) float32 234MB ...\n",
+       "│   │           strbasemag           (time, y, x) float32 234MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 234MB ...\n",
+       "│   │           lithk                (time, y, x) float32 234MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Author:        Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n",
+       "│   │           Model:         ISSM (Ice Sheet System Model)\n",
+       "│   │           Variable:      Surface mass balance\n",
+       "│   │           Notes:         Experiments performed at Caltech Jet Propulsion Laboratory...\n",
+       "│   │           Date:          20-Jun-2019\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ...\n",
+       "│   ├── Group: /JPL1_ISSM/hist\n",
+       "│   │       Dimensions:              (time: 9, y: 761, x: 761)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) object 72B 2007-01-01 00:00:00 ... 2015-01-01...\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Data variables: (12/14)\n",
+       "│   │           xvelmean             (time, y, x) float32 21MB ...\n",
+       "│   │           acabf                (time, y, x) float32 21MB ...\n",
+       "│   │           base                 (time, y, x) float32 21MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 21MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 21MB ...\n",
+       "│   │           topg                 (time, y, x) float32 21MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           lithk                (time, y, x) float32 21MB ...\n",
+       "│   │           orog                 (time, y, x) float32 21MB ...\n",
+       "│   │           sftflf               (time, y, x) float32 21MB ...\n",
+       "│   │           strbasemag           (time, y, x) float32 21MB ...\n",
+       "│   │           sftgrf               (time, y, x) float32 21MB ...\n",
+       "│   │           yvelmean             (time, y, x) float32 21MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Author:        Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n",
+       "│   │           Model:         ISSM (Ice Sheet System Model)\n",
+       "│   │           Variable:      Surface mass balance\n",
+       "│   │           Notes:         Experiments performed at Caltech Jet Propulsion Laboratory...\n",
+       "│   │           Date:          22-Oct-2019\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ├── Group: /JPL1_ISSM/expD11\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Data variables: (12/14)\n",
+       "│   │           hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│   │           acabf                (time, y, x) float32 199MB ...\n",
+       "│   │           sftflf               (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf               (time, y, x) float32 199MB ...\n",
+       "│   │           topg                 (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           orog                 (time, y, x) float32 199MB ...\n",
+       "│   │           strbasemag           (time, y, x) float32 199MB ...\n",
+       "│   │           yvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           lithk                (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:   CF-1.6\n",
+       "│   │           title:         ISMIP6 Projections Greenland model output\n",
+       "│   │           institution:   NASA Jet Propulsion Laboratory, Pasadena, USA\n",
+       "│   │           source:        ISSM\n",
+       "│   │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           contact:       Name = Helene Seroussi,  Nicole Schlegel, Email = helene.s...\n",
+       "│   │           comment:       JPL1, ISSM\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   └── Group: /JPL1_ISSM/expA1\n",
+       "│           Dimensions:              (time: 86, y: 761, x: 761)\n",
+       "│           Coordinates:\n",
+       "│             * time                 (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n",
+       "│             * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│             * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│               polar_stereographic  int32 4B ...\n",
+       "│           Data variables: (12/14)\n",
+       "│               acabf                (time, y, x) float32 199MB ...\n",
+       "│               topg                 (time, y, x) float32 199MB ...\n",
+       "│               hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│               xvelmean             (time, y, x) float32 199MB ...\n",
+       "│               orog                 (time, y, x) float32 199MB ...\n",
+       "│               sftflf               (time, y, x) float32 199MB ...\n",
+       "│               ...                   ...\n",
+       "│               dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│               yvelmean             (time, y, x) float32 199MB ...\n",
+       "│               lithk                (time, y, x) float32 199MB ...\n",
+       "│               sftgrf               (time, y, x) float32 199MB ...\n",
+       "│               strbasemag           (time, y, x) float32 199MB ...\n",
+       "│               libmassbffl          (time, y, x) float32 199MB ...\n",
+       "│           Attributes:\n",
+       "│               Conventions:   CF-1.6\n",
+       "│               title:         ISMIP6 Projections Greenland model output\n",
+       "│               institution:   NASA Jet Propulsion Laboratory, Pasadena, USA\n",
+       "│               source:        ISSM\n",
+       "│               references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│               contact:       Name = Helene Seroussi,  Nicole Schlegel, Email = helene.s...\n",
+       "│               comment:       JPL1, ISSM\n",
+       "│               grid_mapping:  polar_stereographic\n",
+       "├── Group: /ULB_fETISh_32km\n",
+       "│   ├── Group: /ULB_fETISh_32km/ctrl_proj_open\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761, nv4: 4)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │           lat                  (y, x) float64 5MB ...\n",
+       "│   │           lon                  (y, x) float64 5MB ...\n",
+       "│   │       Dimensions without coordinates: nv4\n",
+       "│   │       Data variables: (12/27)\n",
+       "│   │           xvelbase             (time, y, x) float32 199MB ...\n",
+       "│   │           acabf                (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│   │           sftgrf               (time, y, x) float32 199MB ...\n",
+       "│   │           xvelsurf             (time, y, x) float32 199MB ...\n",
+       "│   │           yvelbase             (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr          (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr          (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│   │           licalvf              (time, y, x) float32 199MB ...\n",
+       "│   │           xvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:   CF-1.6\n",
+       "│   │           title:         ISMIP6 Projections Greenland model output\n",
+       "│   │           source:        fETISh\n",
+       "│   │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           institution:   Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n",
+       "│   │           contact:       Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n",
+       "│   │           comment:       ULB, fETISh\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ├── Group: /ULB_fETISh_32km/exp01\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761, nv4: 4)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           lon                  (y, x) float64 5MB ...\n",
+       "│   │           lat                  (y, x) float64 5MB ...\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Dimensions without coordinates: nv4\n",
+       "│   │       Data variables: (12/27)\n",
+       "│   │           xvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           topg                 (time, y, x) float32 199MB ...\n",
+       "│   │           acabf                (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│   │           lat_bnds             (y, x, nv4) float64 19MB ...\n",
+       "│   │           libmassbfgr          (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           litempbotgr          (time, y, x) float32 199MB ...\n",
+       "│   │           lon_bnds             (y, x, nv4) float64 19MB ...\n",
+       "│   │           base                 (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 199MB ...\n",
+       "│   │           yvelmean             (time, y, x) float32 199MB ...\n",
+       "│   │           ligroundf            (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:   CF-1.6\n",
+       "│   │           title:         ISMIP6 Projections Greenland model output\n",
+       "│   │           source:        fETISh\n",
+       "│   │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           institution:   Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n",
+       "│   │           contact:       Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n",
+       "│   │           comment:       ULB, fETISh\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ├── Group: /ULB_fETISh_32km/hist_std\n",
+       "│   │       Dimensions:              (time: 11, y: 761, x: 761, nv4: 4)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) datetime64[ns] 88B 2005-01-01 ... 2014-11-10\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           lon                  (y, x) float64 5MB ...\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │           lat                  (y, x) float64 5MB ...\n",
+       "│   │       Dimensions without coordinates: nv4\n",
+       "│   │       Data variables: (12/27)\n",
+       "│   │           acabf                (time, y, x) float32 25MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 25MB ...\n",
+       "│   │           sftflf               (time, y, x) float32 25MB ...\n",
+       "│   │           xvelbase             (time, y, x) float32 25MB ...\n",
+       "│   │           xvelsurf             (time, y, x) float32 25MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 25MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           yvelsurf             (time, y, x) float32 25MB ...\n",
+       "│   │           base                 (time, y, x) float32 25MB ...\n",
+       "│   │           xvelmean             (time, y, x) float32 25MB ...\n",
+       "│   │           litempbotfl          (time, y, x) float32 25MB ...\n",
+       "│   │           lithk                (time, y, x) float32 25MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 25MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:   CF-1.6\n",
+       "│   │           title:         ISMIP6 Projections Greenland model output\n",
+       "│   │           source:        fETISh\n",
+       "│   │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           institution:   Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n",
+       "│   │           contact:       Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n",
+       "│   │           comment:       ULB, fETISh\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ...\n",
+       "│   ├── Group: /ULB_fETISh_32km/exp12\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761, nv4: 4)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │           lon                  (y, x) float64 5MB ...\n",
+       "│   │           lat                  (y, x) float64 5MB ...\n",
+       "│   │       Dimensions without coordinates: nv4\n",
+       "│   │       Data variables: (12/27)\n",
+       "│   │           yvelsurf             (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│   │           hfgeoubed            (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 199MB ...\n",
+       "│   │           licalvf              (time, y, x) float32 199MB ...\n",
+       "│   │           ligroundf            (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           lat_bnds             (y, x, nv4) float64 19MB ...\n",
+       "│   │           litempbotfl          (time, y, x) float32 199MB ...\n",
+       "│   │           sftgif               (time, y, x) float32 199MB ...\n",
+       "│   │           xvelsurf             (time, y, x) float32 199MB ...\n",
+       "│   │           lifmassbf            (time, y, x) float32 199MB ...\n",
+       "│   │           litemptop            (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:   CF-1.6\n",
+       "│   │           title:         ISMIP6 Projections Greenland model output\n",
+       "│   │           source:        fETISh\n",
+       "│   │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           institution:   Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n",
+       "│   │           contact:       Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n",
+       "│   │           comment:       ULB, fETISh\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   ├── Group: /ULB_fETISh_32km/ctrl_proj_std\n",
+       "│   │       Dimensions:              (time: 86, y: 761, x: 761, nv4: 4)\n",
+       "│   │       Coordinates:\n",
+       "│   │         * time                 (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n",
+       "│   │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│   │           lat                  (y, x) float64 5MB ...\n",
+       "│   │           lon                  (y, x) float64 5MB ...\n",
+       "│   │           polar_stereographic  int32 4B ...\n",
+       "│   │       Dimensions without coordinates: nv4\n",
+       "│   │       Data variables: (12/27)\n",
+       "│   │           sftflf               (time, y, x) float32 199MB ...\n",
+       "│   │           orog                 (time, y, x) float32 199MB ...\n",
+       "│   │           dlithkdt             (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbfgr          (time, y, x) float32 199MB ...\n",
+       "│   │           licalvf              (time, y, x) float32 199MB ...\n",
+       "│   │           litempbotgr          (time, y, x) float32 199MB ...\n",
+       "│   │           ...                   ...\n",
+       "│   │           base                 (time, y, x) float32 199MB ...\n",
+       "│   │           yvelsurf             (time, y, x) float32 199MB ...\n",
+       "│   │           litemptop            (time, y, x) float32 199MB ...\n",
+       "│   │           xvelsurf             (time, y, x) float32 199MB ...\n",
+       "│   │           libmassbffl          (time, y, x) float32 199MB ...\n",
+       "│   │           topg                 (time, y, x) float32 199MB ...\n",
+       "│   │       Attributes:\n",
+       "│   │           Conventions:   CF-1.6\n",
+       "│   │           title:         ISMIP6 Projections Greenland model output\n",
+       "│   │           source:        fETISh\n",
+       "│   │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│   │           institution:   Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n",
+       "│   │           contact:       Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n",
+       "│   │           comment:       ULB, fETISh\n",
+       "│   │           grid_mapping:  polar_stereographic\n",
+       "│   └── Group: /ULB_fETISh_32km/hist_open\n",
+       "│           Dimensions:              (time: 11, y: 761, x: 761, nv4: 4)\n",
+       "│           Coordinates:\n",
+       "│             * time                 (time) datetime64[ns] 88B 2005-01-01 ... 2014-11-10\n",
+       "│             * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│             * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "│               lat                  (y, x) float64 5MB ...\n",
+       "│               polar_stereographic  int32 4B ...\n",
+       "│               lon                  (y, x) float64 5MB ...\n",
+       "│           Dimensions without coordinates: nv4\n",
+       "│           Data variables: (12/27)\n",
+       "│               acabf                (time, y, x) float32 25MB ...\n",
+       "│               yvelsurf             (time, y, x) float32 25MB ...\n",
+       "│               yvelbase             (time, y, x) float32 25MB ...\n",
+       "│               libmassbfgr          (time, y, x) float32 25MB ...\n",
+       "│               lifmassbf            (time, y, x) float32 25MB ...\n",
+       "│               litempbotgr          (time, y, x) float32 25MB ...\n",
+       "│               ...                   ...\n",
+       "│               libmassbffl          (time, y, x) float32 25MB ...\n",
+       "│               ligroundf            (time, y, x) float32 25MB ...\n",
+       "│               xvelbase             (time, y, x) float32 25MB ...\n",
+       "│               yvelmean             (time, y, x) float32 25MB ...\n",
+       "│               dlithkdt             (time, y, x) float32 25MB ...\n",
+       "│               strbasemag           (time, y, x) float32 25MB ...\n",
+       "│           Attributes:\n",
+       "│               Conventions:   CF-1.6\n",
+       "│               title:         ISMIP6 Projections Greenland model output\n",
+       "│               source:        fETISh\n",
+       "│               references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "│               institution:   Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n",
+       "│               contact:       Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n",
+       "│               comment:       ULB, fETISh\n",
+       "│               grid_mapping:  polar_stereographic\n",
+       "└── Group: /VUW_PISM\n",
+       "    ├── Group: /VUW_PISM/ctrl_proj_open\n",
+       "    │       Dimensions:              (time: 87, y: 761, x: 761, nv4: 4, bnds: 2)\n",
+       "    │       Coordinates:\n",
+       "    │         * time                 (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n",
+       "    │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * nv4                  (nv4) float32 16B 0.0 0.0 0.0 0.0\n",
+       "    │           lon                  (y, x) float64 5MB ...\n",
+       "    │           polar_stereographic  int32 4B ...\n",
+       "    │           lat                  (y, x) float64 5MB ...\n",
+       "    │       Dimensions without coordinates: bnds\n",
+       "    │       Data variables: (12/27)\n",
+       "    │           yvelbase             (time, y, x) float32 202MB ...\n",
+       "    │           hfgeoubed            (y, x) float32 2MB ...\n",
+       "    │           yvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           litempbotfl          (time, y, x) float32 202MB ...\n",
+       "    │           litemptop            (time, y, x) float32 202MB ...\n",
+       "    │           lon_bnds             (y, x, nv4) float64 19MB ...\n",
+       "    │           ...                   ...\n",
+       "    │           yvelmean             (time, y, x) float32 202MB ...\n",
+       "    │           strbasemag           (time, y, x) float32 202MB ...\n",
+       "    │           topg                 (time, y, x) float32 202MB ...\n",
+       "    │           zvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           lat_bnds             (y, x, nv4) float64 19MB ...\n",
+       "    │           litempbotgr          (time, y, x) float32 202MB ...\n",
+       "    │       Attributes:\n",
+       "    │           Conventions:   CF-1.6\n",
+       "    │           title:         ISMIP6 Projections Greenland model output\n",
+       "    │           institution:   Antarctic Research Centre, Victoria University of Wellingt...\n",
+       "    │           source:        PISM\n",
+       "    │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "    │           contact:       Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n",
+       "    │           comment:       VUW, PISM\n",
+       "    │           grid_mapping:  polar_stereographic\n",
+       "    ├── Group: /VUW_PISM/hist_open\n",
+       "    │       Dimensions:              (time: 15, y: 761, x: 761, bnds: 2, nv4: 4)\n",
+       "    │       Coordinates:\n",
+       "    │         * time                 (time) object 120B 2001-01-01 00:00:00 ... 2015-01-0...\n",
+       "    │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * nv4                  (nv4) float32 16B 0.0 0.0 0.0 0.0\n",
+       "    │           lat                  (y, x) float64 5MB ...\n",
+       "    │           lon                  (y, x) float64 5MB ...\n",
+       "    │           polar_stereographic  int32 4B ...\n",
+       "    │       Dimensions without coordinates: bnds\n",
+       "    │       Data variables: (12/27)\n",
+       "    │           xvelmean             (time, y, x) float32 35MB ...\n",
+       "    │           dlithkdt             (time, y, x) float32 35MB ...\n",
+       "    │           xvelsurf             (time, y, x) float32 35MB ...\n",
+       "    │           libmassbffl          (time, y, x) float32 35MB ...\n",
+       "    │           libmassbfgr          (time, y, x) float32 35MB ...\n",
+       "    │           litemptop            (time, y, x) float32 35MB ...\n",
+       "    │           ...                   ...\n",
+       "    │           litempbotfl          (time, y, x) float32 35MB ...\n",
+       "    │           lithk                (time, y, x) float32 35MB ...\n",
+       "    │           topg                 (time, y, x) float32 35MB ...\n",
+       "    │           base                 (time, y, x) float32 35MB ...\n",
+       "    │           sftgrf               (time, y, x) int32 35MB ...\n",
+       "    │           yvelsurf             (time, y, x) float32 35MB ...\n",
+       "    │       Attributes:\n",
+       "    │           Conventions:   CF-1.6\n",
+       "    │           title:         ISMIP6 Projections Greenland model output\n",
+       "    │           institution:   Antarctic Research Centre, Victoria University of Wellingt...\n",
+       "    │           source:        PISM\n",
+       "    │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "    │           contact:       Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n",
+       "    │           comment:       VUW, PISM\n",
+       "    │           grid_mapping:  polar_stereographic\n",
+       "    ├── Group: /VUW_PISM/exp02\n",
+       "    │       Dimensions:              (time: 87, y: 761, x: 761, bnds: 2, nv4: 4)\n",
+       "    │       Coordinates:\n",
+       "    │         * time                 (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n",
+       "    │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * nv4                  (nv4) float32 16B 0.0 0.0 0.0 0.0\n",
+       "    │           lat                  (y, x) float64 5MB ...\n",
+       "    │           lon                  (y, x) float64 5MB ...\n",
+       "    │           polar_stereographic  int32 4B ...\n",
+       "    │       Dimensions without coordinates: bnds\n",
+       "    │       Data variables: (12/27)\n",
+       "    │           sftgif               (time, y, x) int32 202MB ...\n",
+       "    │           time_bnds            (time, bnds) float64 1kB ...\n",
+       "    │           xvelbase             (time, y, x) float32 202MB ...\n",
+       "    │           litemptop            (time, y, x) float32 202MB ...\n",
+       "    │           litempbotfl          (time, y, x) float32 202MB ...\n",
+       "    │           lon_bnds             (y, x, nv4) float64 19MB ...\n",
+       "    │           ...                   ...\n",
+       "    │           sftflf               (time, y, x) int32 202MB ...\n",
+       "    │           zvelbase             (time, y, x) float32 202MB ...\n",
+       "    │           xvelmean             (time, y, x) float32 202MB ...\n",
+       "    │           xvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           yvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           litempbotgr          (time, y, x) float32 202MB ...\n",
+       "    │       Attributes:\n",
+       "    │           Conventions:   CF-1.6\n",
+       "    │           title:         ISMIP6 Projections Greenland model output\n",
+       "    │           institution:   Antarctic Research Centre, Victoria University of Wellingt...\n",
+       "    │           source:        PISM\n",
+       "    │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "    │           contact:       Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n",
+       "    │           comment:       VUW, PISM\n",
+       "    │           grid_mapping:  polar_stereographic\n",
+       "    ├── Group: /VUW_PISM/exp03\n",
+       "    │       Dimensions:              (time: 87, y: 761, x: 761, bnds: 2, nv4: 4)\n",
+       "    │       Coordinates:\n",
+       "    │         * time                 (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n",
+       "    │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * nv4                  (nv4) float32 16B 0.0 0.0 0.0 0.0\n",
+       "    │           lat                  (y, x) float64 5MB ...\n",
+       "    │           lon                  (y, x) float64 5MB ...\n",
+       "    │           polar_stereographic  int32 4B ...\n",
+       "    │       Dimensions without coordinates: bnds\n",
+       "    │       Data variables: (12/27)\n",
+       "    │           zvelbase             (time, y, x) float32 202MB ...\n",
+       "    │           base                 (time, y, x) float32 202MB ...\n",
+       "    │           hfgeoubed            (y, x) float32 2MB ...\n",
+       "    │           litempbotfl          (time, y, x) float32 202MB ...\n",
+       "    │           litemptop            (time, y, x) float32 202MB ...\n",
+       "    │           libmassbfgr          (time, y, x) float32 202MB ...\n",
+       "    │           ...                   ...\n",
+       "    │           sftflf               (time, y, x) int32 202MB ...\n",
+       "    │           dlithkdt             (time, y, x) float32 202MB ...\n",
+       "    │           orog                 (time, y, x) float32 202MB ...\n",
+       "    │           litempbotgr          (time, y, x) float32 202MB ...\n",
+       "    │           yvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           sftgif               (time, y, x) int32 202MB ...\n",
+       "    │       Attributes:\n",
+       "    │           Conventions:   CF-1.6\n",
+       "    │           title:         ISMIP6 Projections Greenland model output\n",
+       "    │           institution:   Antarctic Research Centre, Victoria University of Wellingt...\n",
+       "    │           source:        PISM\n",
+       "    │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "    │           contact:       Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n",
+       "    │           comment:       VUW, PISM\n",
+       "    │           grid_mapping:  polar_stereographic\n",
+       "    ├── Group: /VUW_PISM/exp01\n",
+       "    │       Dimensions:              (time: 87, y: 761, x: 761, nv4: 4, bnds: 2)\n",
+       "    │       Coordinates:\n",
+       "    │         * time                 (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n",
+       "    │         * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "    │         * nv4                  (nv4) float32 16B 0.0 0.0 0.0 0.0\n",
+       "    │           lat                  (y, x) float64 5MB ...\n",
+       "    │           polar_stereographic  int32 4B ...\n",
+       "    │           lon                  (y, x) float64 5MB ...\n",
+       "    │       Dimensions without coordinates: bnds\n",
+       "    │       Data variables: (12/27)\n",
+       "    │           yvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           base                 (time, y, x) float32 202MB ...\n",
+       "    │           zvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           lat_bnds             (y, x, nv4) float64 19MB ...\n",
+       "    │           litempbotgr          (time, y, x) float32 202MB ...\n",
+       "    │           libmassbffl          (time, y, x) float32 202MB ...\n",
+       "    │           ...                   ...\n",
+       "    │           litemptop            (time, y, x) float32 202MB ...\n",
+       "    │           topg                 (time, y, x) float32 202MB ...\n",
+       "    │           yvelbase             (time, y, x) float32 202MB ...\n",
+       "    │           sftgrf               (time, y, x) int32 202MB ...\n",
+       "    │           xvelsurf             (time, y, x) float32 202MB ...\n",
+       "    │           litempbotfl          (time, y, x) float32 202MB ...\n",
+       "    │       Attributes:\n",
+       "    │           Conventions:   CF-1.6\n",
+       "    │           title:         ISMIP6 Projections Greenland model output\n",
+       "    │           institution:   Antarctic Research Centre, Victoria University of Wellingt...\n",
+       "    │           source:        PISM\n",
+       "    │           references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "    │           contact:       Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n",
+       "    │           comment:       VUW, PISM\n",
+       "    │           grid_mapping:  polar_stereographic\n",
+       "    └── Group: /VUW_PISM/exp04\n",
+       "            Dimensions:              (time: 87, y: 761, x: 761, bnds: 2, nv4: 4)\n",
+       "            Coordinates:\n",
+       "              * time                 (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n",
+       "              * y                    (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "              * x                    (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n",
+       "              * nv4                  (nv4) float32 16B 0.0 0.0 0.0 0.0\n",
+       "                lat                  (y, x) float64 5MB ...\n",
+       "                lon                  (y, x) float64 5MB ...\n",
+       "                polar_stereographic  int32 4B ...\n",
+       "            Dimensions without coordinates: bnds\n",
+       "            Data variables: (12/27)\n",
+       "                acabf                (time, y, x) float32 202MB ...\n",
+       "                base                 (time, y, x) float32 202MB ...\n",
+       "                zvelsurf             (time, y, x) float32 202MB ...\n",
+       "                yvelmean             (time, y, x) float32 202MB ...\n",
+       "                libmassbffl          (time, y, x) float32 202MB ...\n",
+       "                litempbotfl          (time, y, x) float32 202MB ...\n",
+       "                ...                   ...\n",
+       "                libmassbfgr          (time, y, x) float32 202MB ...\n",
+       "                orog                 (time, y, x) float32 202MB ...\n",
+       "                topg                 (time, y, x) float32 202MB ...\n",
+       "                lithk                (time, y, x) float32 202MB ...\n",
+       "                xvelsurf             (time, y, x) float32 202MB ...\n",
+       "                sftgif               (time, y, x) int32 202MB ...\n",
+       "            Attributes:\n",
+       "                Conventions:   CF-1.6\n",
+       "                title:         ISMIP6 Projections Greenland model output\n",
+       "                institution:   Antarctic Research Centre, Victoria University of Wellingt...\n",
+       "                source:        PISM\n",
+       "                references:    https://doi.org/10.5194/tc-14-3033-2020\n",
+       "                contact:       Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n",
+       "                comment:       VUW, PISM\n",
+       "                grid_mapping:  polar_stereographic
" + ], + "text/plain": [ + "\n", + "Group: /\n", + "├── Group: /CPOM_BISICLES\n", + "│ └── Group: /CPOM_BISICLES/expTD58_08\n", + "│ Dimensions: (time: 90, x: 761, y: 761)\n", + "│ Coordinates:\n", + "│ * time (time) float64 720B 365.2 730.5 ... 3.251e+04 3.287e+04\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ lat (x, y) float64 5MB ...\n", + "│ lon (x, y) float64 5MB ...\n", + "│ Data variables: (12/31)\n", + "│ acabf (time, x, y) float64 417MB ...\n", + "│ yvelmean (time, x, y) float64 417MB ...\n", + "│ dlithkdt (time, x, y) float64 417MB ...\n", + "│ iareagr (time) float64 720B ...\n", + "│ libmassbfgr (time, x, y) float64 417MB ...\n", + "│ ligroundf (time, x, y) float64 417MB ...\n", + "│ ... ...\n", + "│ lim (time) float64 720B ...\n", + "│ sftgif (time, x, y) float64 417MB ...\n", + "│ xvelbase (time, x, y) float64 417MB ...\n", + "│ litemptop (time, x, y) float64 417MB ...\n", + "│ iareafl (time) float64 720B ...\n", + "│ tendlibmassbf (time) float64 720B ...\n", + "│ Attributes:\n", + "│ info: Model CPOM BISICLES\n", + "│ history: bisiclesISMIPVarExtractorV2.py\n", + "│ meshName: 6080x6080km_8km_Antarctic_stereo\n", + "├── Group: /AWI_PISM1\n", + "│ ├── Group: /AWI_PISM1/expA8\n", + "│ │ Dimensions: (time: 86, bnds: 2, y: 761, x: 761)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n", + "│ │ * bnds (bnds) float32 8B 0.0 0.0\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ Data variables: (12/29)\n", + "│ │ time_bnds (time, bnds) object 1kB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ tendligroundf (time) float32 344B ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ lifmassbf (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ zvelsurf (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: Alfred Wegener Institute for Polar and Marine Research, DE,...\n", + "│ │ source: PISM\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ contact: Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n", + "│ │ comment: AWI, PISM1\n", + "│ ├── Group: /AWI_PISM1/expB4\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * bnds (bnds) float32 8B 0.0 0.0\n", + "│ │ Data variables: (12/29)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ zvelsurf (time, y, x) float32 199MB ...\n", + "│ │ lifmassbf (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ zvelbase (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ strbasemag (time, y, x) float32 199MB ...\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ ligroundf (time, y, x) float32 199MB ...\n", + "│ │ time_bnds (time, bnds) object 1kB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: Alfred Wegener Institute for Polar and Marine Research, DE,...\n", + "│ │ source: PISM\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ contact: Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n", + "│ │ comment: AWI, PISM1\n", + "│ ├── Group: /AWI_PISM1/expB9\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * bnds (bnds) float32 8B 0.0 0.0\n", + "│ │ Data variables: (12/29)\n", + "│ │ orog (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ strbasemag (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ topg (time, y, x) float32 199MB ...\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: Alfred Wegener Institute for Polar and Marine Research, DE,...\n", + "│ │ source: PISM\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ contact: Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n", + "│ │ comment: AWI, PISM1\n", + "│ ...\n", + "│ ├── Group: /AWI_PISM1/exp01\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * bnds (bnds) float32 8B 0.0 0.0\n", + "│ │ Data variables: (12/29)\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ zvelsurf (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ ligroundf (time, y, x) float32 199MB ...\n", + "│ │ yvelsurf (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ litemptop (time, y, x) float32 199MB ...\n", + "│ │ xvelbase (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: Alfred Wegener Institute for Polar and Marine Research, DE,...\n", + "│ │ source: PISM\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ contact: Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n", + "│ │ comment: AWI, PISM1\n", + "│ ├── Group: /AWI_PISM1/exp02\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * bnds (bnds) float32 8B 0.0 0.0\n", + "│ │ Data variables: (12/29)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ zvelsurf (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ lifmassbf (time, y, x) float32 199MB ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ time_bnds (time, bnds) object 1kB ...\n", + "│ │ ligroundf (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: Alfred Wegener Institute for Polar and Marine Research, DE,...\n", + "│ │ source: PISM\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ contact: Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n", + "│ │ comment: AWI, PISM1\n", + "│ └── Group: /AWI_PISM1/exp12\n", + "│ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ Coordinates:\n", + "│ * time (time) object 688B 2015-07-02 12:00:00 ... 2100-07-02 12:0...\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * bnds (bnds) float32 8B 0.0 0.0\n", + "│ Data variables: (12/29)\n", + "│ zvelbase (time, y, x) float32 199MB ...\n", + "│ base (time, y, x) float32 199MB ...\n", + "│ zvelsurf (time, y, x) float32 199MB ...\n", + "│ dlithkdt (time, y, x) float32 199MB ...\n", + "│ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ ... ...\n", + "│ xvelmean (time, y, x) float32 199MB ...\n", + "│ libmassbffl (time, y, x) float32 199MB ...\n", + "│ time_bnds (time, bnds) object 1kB ...\n", + "│ orog (time, y, x) float32 199MB ...\n", + "│ xvelbase (time, y, x) float32 199MB ...\n", + "│ litempbotfl (time, y, x) float32 199MB ...\n", + "│ Attributes:\n", + "│ Conventions: CF-1.6\n", + "│ title: ISMIP6 Projections Greenland model output\n", + "│ institution: Alfred Wegener Institute for Polar and Marine Research, DE,...\n", + "│ source: PISM\n", + "│ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ contact: Name = Thomas Kleiner, Johannes Sutter, Angelika Humbert, E...\n", + "│ comment: AWI, PISM1\n", + "├── Group: /ILTS_PIK_SICOPOLIS1\n", + "│ ├── Group: /ILTS_PIK_SICOPOLIS1/expD12\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n", + "│ │ * y (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ Dimensions without coordinates: bnds\n", + "│ │ Data variables: (12/29)\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ lifmassbf (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ xvelbase (time, y, x) float32 199MB ...\n", + "│ │ litempbotfl (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ zvelsurf (time, y, x) float32 199MB ...\n", + "│ │ mapping int8 1B ...\n", + "│ │ Attributes:\n", + "│ │ title: ISMIP6 output of simulation ant08_b2_future25-06_expD12\n", + "│ │ institution: Institute of Low Temperature Science, Hokkaido University, ...\n", + "│ │ source: SICOPOLIS Version 5.1\n", + "│ │ history: Tue Feb 4 12:21:20 2020: ncks -O -F -v time,time_bnds,year...\n", + "│ │ references: http://www.sicopolis.net/\n", + "│ │ Conventions: CF-1.6\n", + "│ │ NCO: netCDF Operators version 4.8.1 (Homepage = http://nco.sf.ne...\n", + "│ │ url: gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD12/acabf...\n", + "│ ├── Group: /ILTS_PIK_SICOPOLIS1/expD11\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n", + "│ │ * y (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ Dimensions without coordinates: bnds\n", + "│ │ Data variables: (12/29)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ year (time) float32 344B ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ yvelbase (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ topg (time, y, x) float32 199MB ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ title: ISMIP6 output of simulation ant08_b2_future25-06_expD11\n", + "│ │ institution: Institute of Low Temperature Science, Hokkaido University, ...\n", + "│ │ source: SICOPOLIS Version 5.1\n", + "│ │ history: Tue Feb 4 12:20:29 2020: ncks -O -F -v time,time_bnds,year...\n", + "│ │ references: http://www.sicopolis.net/\n", + "│ │ Conventions: CF-1.6\n", + "│ │ NCO: netCDF Operators version 4.8.1 (Homepage = http://nco.sf.ne...\n", + "│ │ url: gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD11/acabf...\n", + "│ ├── Group: /ILTS_PIK_SICOPOLIS1/exp06\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n", + "│ │ * y (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ lat (y, x) float32 2MB ...\n", + "│ │ lon (y, x) float32 2MB ...\n", + "│ │ Dimensions without coordinates: bnds\n", + "│ │ Data variables: (12/28)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ xvelbase (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ topg (time, y, x) float32 199MB ...\n", + "│ │ litemptop (time, y, x) float32 199MB ...\n", + "│ │ zvelbase (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: Institute of Low Temperature Science, Hokkaido University, ...\n", + "│ │ source: SICOPOLIS\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ Conventions: CF-1.6\n", + "│ │ contact: Name = Ralf Greve, Reinhard Calov, Email = greve@lowtem.hok...\n", + "│ │ comment: ILTS_PIK, SICOPOLIS1\n", + "│ │ url: gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/exp06/acabf_...\n", + "│ ...\n", + "│ ├── Group: /ILTS_PIK_SICOPOLIS1/expD51\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n", + "│ │ * y (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ lon (y, x) float32 2MB ...\n", + "│ │ lat (y, x) float32 2MB ...\n", + "│ │ Dimensions without coordinates: bnds\n", + "│ │ Data variables: (12/29)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ yvelbase (time, y, x) float32 199MB ...\n", + "│ │ zvelbase (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ lifmassbf (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ crs int8 1B ...\n", + "│ │ litemptop (time, y, x) float32 199MB ...\n", + "│ │ zvelsurf (time, y, x) float32 199MB ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ title: ISMIP6 output of simulation ant08_b2_future25-06_expD51\n", + "│ │ institution: Institute of Low Temperature Science, Hokkaido University, ...\n", + "│ │ source: SICOPOLIS Version 5-dev\n", + "│ │ history: Sun Oct 6 18:07:06 2019: ncks -O -F -v time,time_bnds,year...\n", + "│ │ references: http://www.sicopolis.net/\n", + "│ │ Conventions: CF-1.6\n", + "│ │ NCO: netCDF Operators version 4.7.8 (Homepage = http://nco.sf.ne...\n", + "│ │ url: gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD51/acabf...\n", + "│ ├── Group: /ILTS_PIK_SICOPOLIS1/expD53\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n", + "│ │ * y (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ * x (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ │ lat (y, x) float32 2MB ...\n", + "│ │ lon (y, x) float32 2MB ...\n", + "│ │ Dimensions without coordinates: bnds\n", + "│ │ Data variables: (12/29)\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ yvelsurf (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ litempbotfl (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ yvelbase (time, y, x) float32 199MB ...\n", + "│ │ orog (time, y, x) float32 199MB ...\n", + "│ │ time_bnds (time, bnds) object 1kB ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ title: ISMIP6 output of simulation ant08_b2_future25-06_expD53\n", + "│ │ institution: Institute of Low Temperature Science, Hokkaido University, ...\n", + "│ │ source: SICOPOLIS Version 5-dev\n", + "│ │ history: Sun Oct 6 18:07:23 2019: ncks -O -F -v time,time_bnds,year...\n", + "│ │ references: http://www.sicopolis.net/\n", + "│ │ Conventions: CF-1.6\n", + "│ │ NCO: netCDF Operators version 4.7.8 (Homepage = http://nco.sf.ne...\n", + "│ │ url: gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expD53/acabf...\n", + "│ └── Group: /ILTS_PIK_SICOPOLIS1/expA7\n", + "│ Dimensions: (time: 86, y: 761, x: 761, bnds: 2)\n", + "│ Coordinates:\n", + "│ * time (time) object 688B 2015-07-01 00:00:00 ... 2100-07-01 00:00:00\n", + "│ * y (y) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ * x (x) float32 3kB -3.04e+06 -3.032e+06 ... 3.032e+06 3.04e+06\n", + "│ lat (y, x) float32 2MB ...\n", + "│ lon (y, x) float32 2MB ...\n", + "│ Dimensions without coordinates: bnds\n", + "│ Data variables: (12/29)\n", + "│ yvelbase (time, y, x) float32 199MB ...\n", + "│ year (time) float32 344B ...\n", + "│ xvelbase (time, y, x) float32 199MB ...\n", + "│ libmassbffl (time, y, x) float32 199MB ...\n", + "│ licalvf (time, y, x) float32 199MB ...\n", + "│ litempbotfl (time, y, x) float32 199MB ...\n", + "│ ... ...\n", + "│ lithk (time, y, x) float32 199MB ...\n", + "│ lifmassbf (time, y, x) float32 199MB ...\n", + "│ strbasemag (time, y, x) float32 199MB ...\n", + "│ zvelsurf (time, y, x) float32 199MB ...\n", + "│ crs int8 1B ...\n", + "│ sftgif (time, y, x) float32 199MB ...\n", + "│ Attributes:\n", + "│ title: ISMIP6 output of simulation ant08_b2_future25-06_expA7\n", + "│ institution: Institute of Low Temperature Science, Hokkaido University, ...\n", + "│ source: SICOPOLIS Version 5-dev\n", + "│ history: Wed Oct 2 11:09:28 2019: ncks -O -F -v time,time_bnds,year...\n", + "│ references: http://www.sicopolis.net/\n", + "│ Conventions: CF-1.6\n", + "│ NCO: netCDF Operators version 4.7.8 (Homepage = http://nco.sf.ne...\n", + "│ url: gs://ismip6/Projection-AIS/ILTS_PIK/SICOPOLIS1/expA7/acabf_...\n", + "...\n", + "├── Group: /JPL1_ISSM\n", + "│ ├── Group: /JPL1_ISSM/expD56\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Data variables: (12/14)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ strbasemag (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ orog (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Author: Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n", + "│ │ Model: ISSM (Ice Sheet System Model)\n", + "│ │ Variable: Surface mass balance\n", + "│ │ Notes: Experiments performed at Caltech Jet Propulsion Laboratory...\n", + "│ │ Date: 11-Feb-2021\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ├── Group: /JPL1_ISSM/expD57\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Data variables: (12/14)\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ strbasemag (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ orog (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Author: Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n", + "│ │ Model: ISSM (Ice Sheet System Model)\n", + "│ │ Variable: Surface mass balance\n", + "│ │ Notes: Experiments performed at Caltech Jet Propulsion Laboratory...\n", + "│ │ Date: 11-Feb-2021\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ├── Group: /JPL1_ISSM/ctrl\n", + "│ │ Dimensions: (time: 101, y: 761, x: 761)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 808B 2007-01-01 00:00:00 ... 2107-01-0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Data variables: (12/14)\n", + "│ │ xvelmean (time, y, x) float32 234MB ...\n", + "│ │ base (time, y, x) float32 234MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 234MB ...\n", + "│ │ libmassbffl (time, y, x) float32 234MB ...\n", + "│ │ sftflf (time, y, x) float32 234MB ...\n", + "│ │ sftgrf (time, y, x) float32 234MB ...\n", + "│ │ ... ...\n", + "│ │ yvelmean (time, y, x) float32 234MB ...\n", + "│ │ dlithkdt (time, y, x) float32 234MB ...\n", + "│ │ orog (time, y, x) float32 234MB ...\n", + "│ │ strbasemag (time, y, x) float32 234MB ...\n", + "│ │ sftgif (time, y, x) float32 234MB ...\n", + "│ │ lithk (time, y, x) float32 234MB ...\n", + "│ │ Attributes:\n", + "│ │ Author: Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n", + "│ │ Model: ISSM (Ice Sheet System Model)\n", + "│ │ Variable: Surface mass balance\n", + "│ │ Notes: Experiments performed at Caltech Jet Propulsion Laboratory...\n", + "│ │ Date: 20-Jun-2019\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ...\n", + "│ ├── Group: /JPL1_ISSM/hist\n", + "│ │ Dimensions: (time: 9, y: 761, x: 761)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 72B 2007-01-01 00:00:00 ... 2015-01-01...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Data variables: (12/14)\n", + "│ │ xvelmean (time, y, x) float32 21MB ...\n", + "│ │ acabf (time, y, x) float32 21MB ...\n", + "│ │ base (time, y, x) float32 21MB ...\n", + "│ │ libmassbffl (time, y, x) float32 21MB ...\n", + "│ │ sftgif (time, y, x) float32 21MB ...\n", + "│ │ topg (time, y, x) float32 21MB ...\n", + "│ │ ... ...\n", + "│ │ lithk (time, y, x) float32 21MB ...\n", + "│ │ orog (time, y, x) float32 21MB ...\n", + "│ │ sftflf (time, y, x) float32 21MB ...\n", + "│ │ strbasemag (time, y, x) float32 21MB ...\n", + "│ │ sftgrf (time, y, x) float32 21MB ...\n", + "│ │ yvelmean (time, y, x) float32 21MB ...\n", + "│ │ Attributes:\n", + "│ │ Author: Helene Seroussi (helene.seroussi@jpl.nasa.gov)\n", + "│ │ Model: ISSM (Ice Sheet System Model)\n", + "│ │ Variable: Surface mass balance\n", + "│ │ Notes: Experiments performed at Caltech Jet Propulsion Laboratory...\n", + "│ │ Date: 22-Oct-2019\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ├── Group: /JPL1_ISSM/expD11\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Data variables: (12/14)\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ topg (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ orog (time, y, x) float32 199MB ...\n", + "│ │ strbasemag (time, y, x) float32 199MB ...\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ lithk (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ institution: NASA Jet Propulsion Laboratory, Pasadena, USA\n", + "│ │ source: ISSM\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ contact: Name = Helene Seroussi, Nicole Schlegel, Email = helene.s...\n", + "│ │ comment: JPL1, ISSM\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ └── Group: /JPL1_ISSM/expA1\n", + "│ Dimensions: (time: 86, y: 761, x: 761)\n", + "│ Coordinates:\n", + "│ * time (time) object 688B 2015-01-01 00:00:00 ... 2100-01-0...\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ polar_stereographic int32 4B ...\n", + "│ Data variables: (12/14)\n", + "│ acabf (time, y, x) float32 199MB ...\n", + "│ topg (time, y, x) float32 199MB ...\n", + "│ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ xvelmean (time, y, x) float32 199MB ...\n", + "│ orog (time, y, x) float32 199MB ...\n", + "│ sftflf (time, y, x) float32 199MB ...\n", + "│ ... ...\n", + "│ dlithkdt (time, y, x) float32 199MB ...\n", + "│ yvelmean (time, y, x) float32 199MB ...\n", + "│ lithk (time, y, x) float32 199MB ...\n", + "│ sftgrf (time, y, x) float32 199MB ...\n", + "│ strbasemag (time, y, x) float32 199MB ...\n", + "│ libmassbffl (time, y, x) float32 199MB ...\n", + "│ Attributes:\n", + "│ Conventions: CF-1.6\n", + "│ title: ISMIP6 Projections Greenland model output\n", + "│ institution: NASA Jet Propulsion Laboratory, Pasadena, USA\n", + "│ source: ISSM\n", + "│ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ contact: Name = Helene Seroussi, Nicole Schlegel, Email = helene.s...\n", + "│ comment: JPL1, ISSM\n", + "│ grid_mapping: polar_stereographic\n", + "├── Group: /ULB_fETISh_32km\n", + "│ ├── Group: /ULB_fETISh_32km/ctrl_proj_open\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, nv4: 4)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ lat (y, x) float64 5MB ...\n", + "│ │ lon (y, x) float64 5MB ...\n", + "│ │ Dimensions without coordinates: nv4\n", + "│ │ Data variables: (12/27)\n", + "│ │ xvelbase (time, y, x) float32 199MB ...\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ sftgrf (time, y, x) float32 199MB ...\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ yvelbase (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ source: fETISh\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ institution: Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n", + "│ │ contact: Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n", + "│ │ comment: ULB, fETISh\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ├── Group: /ULB_fETISh_32km/exp01\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, nv4: 4)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ lon (y, x) float64 5MB ...\n", + "│ │ lat (y, x) float64 5MB ...\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Dimensions without coordinates: nv4\n", + "│ │ Data variables: (12/27)\n", + "│ │ xvelmean (time, y, x) float32 199MB ...\n", + "│ │ topg (time, y, x) float32 199MB ...\n", + "│ │ acabf (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ lat_bnds (y, x, nv4) float64 19MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ lon_bnds (y, x, nv4) float64 19MB ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ yvelmean (time, y, x) float32 199MB ...\n", + "│ │ ligroundf (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ source: fETISh\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ institution: Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n", + "│ │ contact: Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n", + "│ │ comment: ULB, fETISh\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ├── Group: /ULB_fETISh_32km/hist_std\n", + "│ │ Dimensions: (time: 11, y: 761, x: 761, nv4: 4)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) datetime64[ns] 88B 2005-01-01 ... 2014-11-10\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ lon (y, x) float64 5MB ...\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ lat (y, x) float64 5MB ...\n", + "│ │ Dimensions without coordinates: nv4\n", + "│ │ Data variables: (12/27)\n", + "│ │ acabf (time, y, x) float32 25MB ...\n", + "│ │ dlithkdt (time, y, x) float32 25MB ...\n", + "│ │ sftflf (time, y, x) float32 25MB ...\n", + "│ │ xvelbase (time, y, x) float32 25MB ...\n", + "│ │ xvelsurf (time, y, x) float32 25MB ...\n", + "│ │ libmassbffl (time, y, x) float32 25MB ...\n", + "│ │ ... ...\n", + "│ │ yvelsurf (time, y, x) float32 25MB ...\n", + "│ │ base (time, y, x) float32 25MB ...\n", + "│ │ xvelmean (time, y, x) float32 25MB ...\n", + "│ │ litempbotfl (time, y, x) float32 25MB ...\n", + "│ │ lithk (time, y, x) float32 25MB ...\n", + "│ │ sftgif (time, y, x) float32 25MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ source: fETISh\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ institution: Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n", + "│ │ contact: Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n", + "│ │ comment: ULB, fETISh\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ...\n", + "│ ├── Group: /ULB_fETISh_32km/exp12\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, nv4: 4)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ lon (y, x) float64 5MB ...\n", + "│ │ lat (y, x) float64 5MB ...\n", + "│ │ Dimensions without coordinates: nv4\n", + "│ │ Data variables: (12/27)\n", + "│ │ yvelsurf (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ hfgeoubed (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ ligroundf (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ lat_bnds (y, x, nv4) float64 19MB ...\n", + "│ │ litempbotfl (time, y, x) float32 199MB ...\n", + "│ │ sftgif (time, y, x) float32 199MB ...\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ lifmassbf (time, y, x) float32 199MB ...\n", + "│ │ litemptop (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ source: fETISh\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ institution: Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n", + "│ │ contact: Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n", + "│ │ comment: ULB, fETISh\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ ├── Group: /ULB_fETISh_32km/ctrl_proj_std\n", + "│ │ Dimensions: (time: 86, y: 761, x: 761, nv4: 4)\n", + "│ │ Coordinates:\n", + "│ │ * time (time) datetime64[ns] 688B 2015-11-05 ... 2099-08-16\n", + "│ │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ │ lat (y, x) float64 5MB ...\n", + "│ │ lon (y, x) float64 5MB ...\n", + "│ │ polar_stereographic int32 4B ...\n", + "│ │ Dimensions without coordinates: nv4\n", + "│ │ Data variables: (12/27)\n", + "│ │ sftflf (time, y, x) float32 199MB ...\n", + "│ │ orog (time, y, x) float32 199MB ...\n", + "│ │ dlithkdt (time, y, x) float32 199MB ...\n", + "│ │ libmassbfgr (time, y, x) float32 199MB ...\n", + "│ │ licalvf (time, y, x) float32 199MB ...\n", + "│ │ litempbotgr (time, y, x) float32 199MB ...\n", + "│ │ ... ...\n", + "│ │ base (time, y, x) float32 199MB ...\n", + "│ │ yvelsurf (time, y, x) float32 199MB ...\n", + "│ │ litemptop (time, y, x) float32 199MB ...\n", + "│ │ xvelsurf (time, y, x) float32 199MB ...\n", + "│ │ libmassbffl (time, y, x) float32 199MB ...\n", + "│ │ topg (time, y, x) float32 199MB ...\n", + "│ │ Attributes:\n", + "│ │ Conventions: CF-1.6\n", + "│ │ title: ISMIP6 Projections Greenland model output\n", + "│ │ source: fETISh\n", + "│ │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ │ institution: Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n", + "│ │ contact: Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n", + "│ │ comment: ULB, fETISh\n", + "│ │ grid_mapping: polar_stereographic\n", + "│ └── Group: /ULB_fETISh_32km/hist_open\n", + "│ Dimensions: (time: 11, y: 761, x: 761, nv4: 4)\n", + "│ Coordinates:\n", + "│ * time (time) datetime64[ns] 88B 2005-01-01 ... 2014-11-10\n", + "│ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + "│ lat (y, x) float64 5MB ...\n", + "│ polar_stereographic int32 4B ...\n", + "│ lon (y, x) float64 5MB ...\n", + "│ Dimensions without coordinates: nv4\n", + "│ Data variables: (12/27)\n", + "│ acabf (time, y, x) float32 25MB ...\n", + "│ yvelsurf (time, y, x) float32 25MB ...\n", + "│ yvelbase (time, y, x) float32 25MB ...\n", + "│ libmassbfgr (time, y, x) float32 25MB ...\n", + "│ lifmassbf (time, y, x) float32 25MB ...\n", + "│ litempbotgr (time, y, x) float32 25MB ...\n", + "│ ... ...\n", + "│ libmassbffl (time, y, x) float32 25MB ...\n", + "│ ligroundf (time, y, x) float32 25MB ...\n", + "│ xvelbase (time, y, x) float32 25MB ...\n", + "│ yvelmean (time, y, x) float32 25MB ...\n", + "│ dlithkdt (time, y, x) float32 25MB ...\n", + "│ strbasemag (time, y, x) float32 25MB ...\n", + "│ Attributes:\n", + "│ Conventions: CF-1.6\n", + "│ title: ISMIP6 Projections Greenland model output\n", + "│ source: fETISh\n", + "│ references: https://doi.org/10.5194/tc-14-3033-2020\n", + "│ institution: Laboratoire de Glaciologie, Universite Libre de Bruxelles,...\n", + "│ contact: Name = Frank Pattyn, Sainan Sun, Email = fpattyn@ulb.ac.be...\n", + "│ comment: ULB, fETISh\n", + "│ grid_mapping: polar_stereographic\n", + "└── Group: /VUW_PISM\n", + " ├── Group: /VUW_PISM/ctrl_proj_open\n", + " │ Dimensions: (time: 87, y: 761, x: 761, nv4: 4, bnds: 2)\n", + " │ Coordinates:\n", + " │ * time (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n", + " │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * nv4 (nv4) float32 16B 0.0 0.0 0.0 0.0\n", + " │ lon (y, x) float64 5MB ...\n", + " │ polar_stereographic int32 4B ...\n", + " │ lat (y, x) float64 5MB ...\n", + " │ Dimensions without coordinates: bnds\n", + " │ Data variables: (12/27)\n", + " │ yvelbase (time, y, x) float32 202MB ...\n", + " │ hfgeoubed (y, x) float32 2MB ...\n", + " │ yvelsurf (time, y, x) float32 202MB ...\n", + " │ litempbotfl (time, y, x) float32 202MB ...\n", + " │ litemptop (time, y, x) float32 202MB ...\n", + " │ lon_bnds (y, x, nv4) float64 19MB ...\n", + " │ ... ...\n", + " │ yvelmean (time, y, x) float32 202MB ...\n", + " │ strbasemag (time, y, x) float32 202MB ...\n", + " │ topg (time, y, x) float32 202MB ...\n", + " │ zvelsurf (time, y, x) float32 202MB ...\n", + " │ lat_bnds (y, x, nv4) float64 19MB ...\n", + " │ litempbotgr (time, y, x) float32 202MB ...\n", + " │ Attributes:\n", + " │ Conventions: CF-1.6\n", + " │ title: ISMIP6 Projections Greenland model output\n", + " │ institution: Antarctic Research Centre, Victoria University of Wellingt...\n", + " │ source: PISM\n", + " │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + " │ contact: Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n", + " │ comment: VUW, PISM\n", + " │ grid_mapping: polar_stereographic\n", + " ├── Group: /VUW_PISM/hist_open\n", + " │ Dimensions: (time: 15, y: 761, x: 761, bnds: 2, nv4: 4)\n", + " │ Coordinates:\n", + " │ * time (time) object 120B 2001-01-01 00:00:00 ... 2015-01-0...\n", + " │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * nv4 (nv4) float32 16B 0.0 0.0 0.0 0.0\n", + " │ lat (y, x) float64 5MB ...\n", + " │ lon (y, x) float64 5MB ...\n", + " │ polar_stereographic int32 4B ...\n", + " │ Dimensions without coordinates: bnds\n", + " │ Data variables: (12/27)\n", + " │ xvelmean (time, y, x) float32 35MB ...\n", + " │ dlithkdt (time, y, x) float32 35MB ...\n", + " │ xvelsurf (time, y, x) float32 35MB ...\n", + " │ libmassbffl (time, y, x) float32 35MB ...\n", + " │ libmassbfgr (time, y, x) float32 35MB ...\n", + " │ litemptop (time, y, x) float32 35MB ...\n", + " │ ... ...\n", + " │ litempbotfl (time, y, x) float32 35MB ...\n", + " │ lithk (time, y, x) float32 35MB ...\n", + " │ topg (time, y, x) float32 35MB ...\n", + " │ base (time, y, x) float32 35MB ...\n", + " │ sftgrf (time, y, x) int32 35MB ...\n", + " │ yvelsurf (time, y, x) float32 35MB ...\n", + " │ Attributes:\n", + " │ Conventions: CF-1.6\n", + " │ title: ISMIP6 Projections Greenland model output\n", + " │ institution: Antarctic Research Centre, Victoria University of Wellingt...\n", + " │ source: PISM\n", + " │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + " │ contact: Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n", + " │ comment: VUW, PISM\n", + " │ grid_mapping: polar_stereographic\n", + " ├── Group: /VUW_PISM/exp02\n", + " │ Dimensions: (time: 87, y: 761, x: 761, bnds: 2, nv4: 4)\n", + " │ Coordinates:\n", + " │ * time (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n", + " │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * nv4 (nv4) float32 16B 0.0 0.0 0.0 0.0\n", + " │ lat (y, x) float64 5MB ...\n", + " │ lon (y, x) float64 5MB ...\n", + " │ polar_stereographic int32 4B ...\n", + " │ Dimensions without coordinates: bnds\n", + " │ Data variables: (12/27)\n", + " │ sftgif (time, y, x) int32 202MB ...\n", + " │ time_bnds (time, bnds) float64 1kB ...\n", + " │ xvelbase (time, y, x) float32 202MB ...\n", + " │ litemptop (time, y, x) float32 202MB ...\n", + " │ litempbotfl (time, y, x) float32 202MB ...\n", + " │ lon_bnds (y, x, nv4) float64 19MB ...\n", + " │ ... ...\n", + " │ sftflf (time, y, x) int32 202MB ...\n", + " │ zvelbase (time, y, x) float32 202MB ...\n", + " │ xvelmean (time, y, x) float32 202MB ...\n", + " │ xvelsurf (time, y, x) float32 202MB ...\n", + " │ yvelsurf (time, y, x) float32 202MB ...\n", + " │ litempbotgr (time, y, x) float32 202MB ...\n", + " │ Attributes:\n", + " │ Conventions: CF-1.6\n", + " │ title: ISMIP6 Projections Greenland model output\n", + " │ institution: Antarctic Research Centre, Victoria University of Wellingt...\n", + " │ source: PISM\n", + " │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + " │ contact: Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n", + " │ comment: VUW, PISM\n", + " │ grid_mapping: polar_stereographic\n", + " ├── Group: /VUW_PISM/exp03\n", + " │ Dimensions: (time: 87, y: 761, x: 761, bnds: 2, nv4: 4)\n", + " │ Coordinates:\n", + " │ * time (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n", + " │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * nv4 (nv4) float32 16B 0.0 0.0 0.0 0.0\n", + " │ lat (y, x) float64 5MB ...\n", + " │ lon (y, x) float64 5MB ...\n", + " │ polar_stereographic int32 4B ...\n", + " │ Dimensions without coordinates: bnds\n", + " │ Data variables: (12/27)\n", + " │ zvelbase (time, y, x) float32 202MB ...\n", + " │ base (time, y, x) float32 202MB ...\n", + " │ hfgeoubed (y, x) float32 2MB ...\n", + " │ litempbotfl (time, y, x) float32 202MB ...\n", + " │ litemptop (time, y, x) float32 202MB ...\n", + " │ libmassbfgr (time, y, x) float32 202MB ...\n", + " │ ... ...\n", + " │ sftflf (time, y, x) int32 202MB ...\n", + " │ dlithkdt (time, y, x) float32 202MB ...\n", + " │ orog (time, y, x) float32 202MB ...\n", + " │ litempbotgr (time, y, x) float32 202MB ...\n", + " │ yvelsurf (time, y, x) float32 202MB ...\n", + " │ sftgif (time, y, x) int32 202MB ...\n", + " │ Attributes:\n", + " │ Conventions: CF-1.6\n", + " │ title: ISMIP6 Projections Greenland model output\n", + " │ institution: Antarctic Research Centre, Victoria University of Wellingt...\n", + " │ source: PISM\n", + " │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + " │ contact: Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n", + " │ comment: VUW, PISM\n", + " │ grid_mapping: polar_stereographic\n", + " ├── Group: /VUW_PISM/exp01\n", + " │ Dimensions: (time: 87, y: 761, x: 761, nv4: 4, bnds: 2)\n", + " │ Coordinates:\n", + " │ * time (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n", + " │ * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " │ * nv4 (nv4) float32 16B 0.0 0.0 0.0 0.0\n", + " │ lat (y, x) float64 5MB ...\n", + " │ polar_stereographic int32 4B ...\n", + " │ lon (y, x) float64 5MB ...\n", + " │ Dimensions without coordinates: bnds\n", + " │ Data variables: (12/27)\n", + " │ yvelsurf (time, y, x) float32 202MB ...\n", + " │ base (time, y, x) float32 202MB ...\n", + " │ zvelsurf (time, y, x) float32 202MB ...\n", + " │ lat_bnds (y, x, nv4) float64 19MB ...\n", + " │ litempbotgr (time, y, x) float32 202MB ...\n", + " │ libmassbffl (time, y, x) float32 202MB ...\n", + " │ ... ...\n", + " │ litemptop (time, y, x) float32 202MB ...\n", + " │ topg (time, y, x) float32 202MB ...\n", + " │ yvelbase (time, y, x) float32 202MB ...\n", + " │ sftgrf (time, y, x) int32 202MB ...\n", + " │ xvelsurf (time, y, x) float32 202MB ...\n", + " │ litempbotfl (time, y, x) float32 202MB ...\n", + " │ Attributes:\n", + " │ Conventions: CF-1.6\n", + " │ title: ISMIP6 Projections Greenland model output\n", + " │ institution: Antarctic Research Centre, Victoria University of Wellingt...\n", + " │ source: PISM\n", + " │ references: https://doi.org/10.5194/tc-14-3033-2020\n", + " │ contact: Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n", + " │ comment: VUW, PISM\n", + " │ grid_mapping: polar_stereographic\n", + " └── Group: /VUW_PISM/exp04\n", + " Dimensions: (time: 87, y: 761, x: 761, bnds: 2, nv4: 4)\n", + " Coordinates:\n", + " * time (time) object 696B 2015-01-01 00:00:00 ... 2101-01-0...\n", + " * y (y) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " * x (x) float64 6kB -3.04e+06 -3.032e+06 ... 3.04e+06\n", + " * nv4 (nv4) float32 16B 0.0 0.0 0.0 0.0\n", + " lat (y, x) float64 5MB ...\n", + " lon (y, x) float64 5MB ...\n", + " polar_stereographic int32 4B ...\n", + " Dimensions without coordinates: bnds\n", + " Data variables: (12/27)\n", + " acabf (time, y, x) float32 202MB ...\n", + " base (time, y, x) float32 202MB ...\n", + " zvelsurf (time, y, x) float32 202MB ...\n", + " yvelmean (time, y, x) float32 202MB ...\n", + " libmassbffl (time, y, x) float32 202MB ...\n", + " litempbotfl (time, y, x) float32 202MB ...\n", + " ... ...\n", + " libmassbfgr (time, y, x) float32 202MB ...\n", + " orog (time, y, x) float32 202MB ...\n", + " topg (time, y, x) float32 202MB ...\n", + " lithk (time, y, x) float32 202MB ...\n", + " xvelsurf (time, y, x) float32 202MB ...\n", + " sftgif (time, y, x) int32 202MB ...\n", + " Attributes:\n", + " Conventions: CF-1.6\n", + " title: ISMIP6 Projections Greenland model output\n", + " institution: Antarctic Research Centre, Victoria University of Wellingt...\n", + " source: PISM\n", + " references: https://doi.org/10.5194/tc-14-3033-2020\n", + " contact: Name = Nick Golledge, Dan Lowry, Email = nicholas.golledge...\n", + " comment: VUW, PISM\n", + " grid_mapping: polar_stereographic" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7c59a8a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "environment": { + "kernel": "conda-env-python313-py", + "name": "workbench-notebooks.m136", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m136" + }, + "kernelspec": { + "display_name": ".venv", + "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.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index 450d210..2076da7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ ] dependencies = [ + "coiled>=1.129.3", "cftime>=1.6.5", "dask>=2025.11.0", "fsspec>=2025.9.0", @@ -28,19 +29,24 @@ dependencies = [ "h5netcdf>=1.7.3", "holoviews>=1.19.0", "hvplot>=0.10.0", + "icechunk>=1.1.13", "ipywidgets>=8.1.0", "jupyter>=1.1.0", "jupyter-bokeh>=4.0.5", "matplotlib>=3.10.7", "netcdf4>=1.7.0", "numpy>=2.3.4", + "obstore>=0.8.2", "pandas>=2.3.3", "panel>=1.5.4", "pyarrow>=22.0.0", "pyproj>=3.7.0", "pyyaml>=6.0.0", "scipy>=1.16.2", + "virtualizarr>=2.2.1", "xarray>=2025.10.1", + "lithops>=3.6.2", + "kerchunk>=0.2.9", ] [project.optional-dependencies] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..74e748c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,32 @@ +# Mandatory Lithops packages +google-cloud +google-cloud-storage +google-cloud-pubsub +google-auth +google-api-python-client +numpy +six +requests +redis +pika +scikit-learn +diskcache +cloudpickle +ps-mem +tblib +PyYAML +urllib3 +psutil + +# other packages +lithops +icechunk +obstore +xarray +virtualizarr +zarr +numpy +pandas +h5netcdf +gcsfs +pyproj diff --git a/uv.lock b/uv.lock index f946ee4..7f49286 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.13" resolution-markers = [ "python_full_version >= '3.14'", @@ -209,6 +209,81 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] +[[package]] +name = "backoff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, +] + +[[package]] +name = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" }, + { url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, +] + [[package]] name = "beautifulsoup4" version = "4.14.2" @@ -260,6 +335,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/9a/8e641b5415e12036d8a206147b8229d917a767b7d939521458d90feddcf5/bokeh-3.8.0-py3-none-any.whl", hash = "sha256:117c5e559231ad39fef87891a1a1b62b3bfefbaa47d536023537338f46015841", size = 7205343, upload-time = "2025-08-29T12:16:52.77Z" }, ] +[[package]] +name = "boto3" +version = "1.42.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4e/b1add2d248d7120ee59df1ca1781a0d5fabdb9e45a477ef50c7598908e80/boto3-1.42.3.tar.gz", hash = "sha256:f7fe002c39806d5efe9105f0d74e836f001230e9520b4502c752dd4951f60041", size = 112797, upload-time = "2025-12-04T18:14:50.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/ac/81fb1f37bef7f29f7d0d4b71eb64c6425917cb230da437b42a2a58335ddf/boto3-1.42.3-py3-none-any.whl", hash = "sha256:163df55a774402fa940e95a152c308a33fb0f49cbcb5ec1725936e48635512f7", size = 140619, upload-time = "2025-12-04T18:14:48.581Z" }, +] + +[[package]] +name = "botocore" +version = "1.42.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/e1/8238fbbab5c45def1b4f75d486a95d1d838e8e21a348563d075a2b09f74b/botocore-1.42.3.tar.gz", hash = "sha256:6bad2e512ab85926bbfb391a9486bb3120f4be71419e2f70b556d99783dcb1ce", size = 14842884, upload-time = "2025-12-04T18:14:38.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/69721ba9d89b4053ac243016428cdd2ea1a1f1c7217572a965aab9f57a20/botocore-1.42.3-py3-none-any.whl", hash = "sha256:fa174f53224ab2adc3a01bb3215b41d314df2f6578381a4a0051bd60d5c718d9", size = 14517527, upload-time = "2025-12-04T18:14:35.317Z" }, +] + [[package]] name = "cachetools" version = "6.2.1" @@ -408,6 +511,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, ] +[[package]] +name = "coiled" +version = "1.129.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "backoff" }, + { name = "boto3" }, + { name = "certifi" }, + { name = "click" }, + { name = "dask" }, + { name = "distributed" }, + { name = "fabric" }, + { name = "filelock" }, + { name = "gilknocker" }, + { name = "httpx", extra = ["http2"] }, + { name = "invoke" }, + { name = "ipywidgets" }, + { name = "jmespath" }, + { name = "jsondiff" }, + { name = "packaging" }, + { name = "paramiko" }, + { name = "pip" }, + { name = "pip-requirements-parser" }, + { name = "prometheus-client" }, + { name = "rich" }, + { name = "toml" }, + { name = "typing-extensions" }, + { name = "wheel" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/e8/bf6a6c55645f247b015b9f4db582db43be9c87f8bee0590c2092af761490/coiled-1.129.3.tar.gz", hash = "sha256:af563a49f536b1f1084985a1eeb6805c6c93fe1707a0602cd2817ddae5644f9e", size = 259211, upload-time = "2025-12-02T17:07:30.448Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/fe/4d96dea40db7cda47bdcb8d26d370001c7a34082dd7f7868a1efa7117bc8/coiled-1.129.3-py3-none-any.whl", hash = "sha256:12c0e69d9b41f27fbb069c37afb5bda2d92a763c1dbe72d739c825ae36435d3d", size = 302980, upload-time = "2025-12-02T17:07:27.403Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -551,6 +689,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/8f/92bdd27b067204b99f396a1414d6342122f3e2663459baf787108a6b8b84/coverage-7.11.3-py3-none-any.whl", hash = "sha256:351511ae28e2509c8d8cae5311577ea7dd511ab8e746ffc8814a0896c3d33fbe", size = 208478, upload-time = "2025-11-10T00:13:14.908Z" }, ] +[[package]] +name = "cryptography" +version = "46.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, +] + [[package]] name = "cycler" version = "0.12.1" @@ -613,6 +807,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] +[[package]] +name = "deprecated" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, +] + +[[package]] +name = "distributed" +version = "2025.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "cloudpickle" }, + { name = "dask" }, + { name = "jinja2" }, + { name = "locket" }, + { name = "msgpack" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "sortedcontainers" }, + { name = "tblib" }, + { name = "toolz" }, + { name = "tornado" }, + { name = "urllib3" }, + { name = "zict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/be/085a60b627c1f2b795827ce41d4cc1e11e74ffdadcb5235ee5fb620f7929/distributed-2025.11.0.tar.gz", hash = "sha256:372c2f0c2faa890fc42188349969ba468161a9b356df49c4ca7d9a8d551a7ace", size = 2119140, upload-time = "2025-11-06T16:57:32.391Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/ec/da78855318971c2be94d0283a41de6941a6b9f16146fb00babc74903ae01/distributed-2025.11.0-py3-none-any.whl", hash = "sha256:1794ff25b19ba347ccce563fb1dd5898c3bb30f500b15f8c20ad373f6281b30f", size = 1009248, upload-time = "2025-11-06T16:57:28.714Z" }, +] + +[[package]] +name = "donfig" +version = "0.8.1.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/71/80cc718ff6d7abfbabacb1f57aaa42e9c1552bfdd01e64ddd704e4a03638/donfig-0.8.1.post1.tar.gz", hash = "sha256:3bef3413a4c1c601b585e8d297256d0c1470ea012afa6e8461dc28bfb7c23f52", size = 19506, upload-time = "2024-05-23T14:14:31.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/d5/c5db1ea3394c6e1732fb3286b3bd878b59507a8f77d32a2cebda7d7b7cd4/donfig-0.8.1.post1-py3-none-any.whl", hash = "sha256:2a3175ce74a06109ff9307d90a230f81215cbac9a751f4d1c6194644b8204f9d", size = 21592, upload-time = "2024-05-23T14:13:55.283Z" }, +] + [[package]] name = "executing" version = "2.2.1" @@ -622,6 +866,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] +[[package]] +name = "fabric" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "decorator" }, + { name = "deprecated" }, + { name = "invoke" }, + { name = "paramiko" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/3f/337f278b70ba339c618a490f6b8033b7006c583bd197a897f12fbc468c51/fabric-3.2.2.tar.gz", hash = "sha256:8783ca42e3b0076f08b26901aac6b9d9b1f19c410074e7accfab902c184ff4a3", size = 183215, upload-time = "2023-08-31T01:42:05.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/1f/e99e23ee01847147fa194e8d41cfcf2535a2dbfcb51414c541cadb15c5d7/fabric-3.2.2-py3-none-any.whl", hash = "sha256:91c47c0be68b14936c88b34da8a1f55e5710fd28397dac5d4ff2e21558113a6f", size = 59417, upload-time = "2023-08-31T01:42:03.917Z" }, +] + [[package]] name = "fastjsonschema" version = "2.21.2" @@ -631,6 +890,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, ] +[[package]] +name = "filelock" +version = "3.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, +] + [[package]] name = "fonttools" version = "4.60.1" @@ -773,6 +1041,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4c/41/f793f3bae39f9fbaabf935d0afcf3aa99e417c92096f3e232ac085aaddbf/gcsfs-2025.9.0-py2.py3-none-any.whl", hash = "sha256:38208bc79af60c693e44ff2f0bd6fd3ca664fea1940fe6770ac1c6003aa0f559", size = 36893, upload-time = "2025-09-02T19:23:18.002Z" }, ] +[[package]] +name = "gilknocker" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/14/ae607709ddc328f9325da59105668def6e525a42e79ef6471b1e055d0946/gilknocker-0.4.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a17d2e708b2ca3e40b0ceb91a8c04b01b3c252211d05e13e617c2b1c1655d30c", size = 488199, upload-time = "2025-10-18T07:26:35.332Z" }, + { url = "https://files.pythonhosted.org/packages/da/0d/9d7c6249a6310e31abebe32d9939159ace679cb3be2a04563d4996427513/gilknocker-0.4.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e9c738ad978b17888df69d431f02b9cfb14f26acecbefa727ebe26adfd2481fd", size = 286884, upload-time = "2025-10-18T07:26:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/a9/bc/5e92674573cbc93f85ac972ef0c6fe54349429b2a7408824ab9f4460ae58/gilknocker-0.4.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f1540518b1cbdb8b45c4841a2345c903025305cee83a45d93c8f52ad19434b", size = 278075, upload-time = "2025-10-18T07:26:37.262Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/bd434862c2ac602066cbced739dcecbb474c30371859ec49bcf937f0afe3/gilknocker-0.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c1d2aa26b839dd7287e6ed0b78704305b21fd9fb07f4a19ef143ff325aaed9", size = 269989, upload-time = "2025-10-18T07:26:38.195Z" }, + { url = "https://files.pythonhosted.org/packages/03/81/2aae73f0810a56f802eb534e68fd6a59e55399c7adc30386ae5ad63ea417/gilknocker-0.4.2-cp313-cp313-win32.whl", hash = "sha256:1efeba93e6869600974d6e58f9f18c24053841bfc5652474ca1f61b23c3a786f", size = 146394, upload-time = "2025-10-18T07:26:39.045Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f2/2acb023b257ccc5da7a2235deea2294e94ea8380d7dc52894065c1be4917/gilknocker-0.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:9bbb03661659294cab657936b80850b860054f3b9236d4950931a7b2797c02bf", size = 157031, upload-time = "2025-10-18T07:26:40.133Z" }, + { url = "https://files.pythonhosted.org/packages/27/4b/05831488845ba2983d70e482aae6f044903dbe0eeb41b212f5f5dd03d104/gilknocker-0.4.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:83da0909036ae262c148b1c8f7900f4719e8bc62f46df0038595b12a7f010c09", size = 488196, upload-time = "2025-10-18T07:26:41.325Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e7/83a6ac99b8cfb1ab87bf636af9ba0bb49bc93923fcbf6c1ff676aaab4cea/gilknocker-0.4.2-cp314-cp314-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64e98bb6c9ada0a7397c0fee2dacc843ee241f0e5eab851b167b055f9f0d71a7", size = 286881, upload-time = "2025-10-18T07:26:42.43Z" }, + { url = "https://files.pythonhosted.org/packages/bf/31/4b8d81453a905c2767b8f215c0c47de05230f69ebe25d81012b9c09f4543/gilknocker-0.4.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35da73a95af51d79c10341b68c0a7093b59fb48f0079284c0d542ff0e73d01de", size = 278077, upload-time = "2025-10-18T07:26:43.269Z" }, + { url = "https://files.pythonhosted.org/packages/56/3d/3fd80ec53c5aa31a6116cc63ed0914d09c45baa49b89afba3ab3d23089c8/gilknocker-0.4.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c6fbce044af8f06df858d745b65df61b0ed2383dafb9461877bb1342b844a2", size = 269989, upload-time = "2025-10-18T07:26:44.421Z" }, + { url = "https://files.pythonhosted.org/packages/39/f0/88365d1d436bace32805c491340c99de95ef671d1174d954618f523a9060/gilknocker-0.4.2-cp314-cp314-win32.whl", hash = "sha256:b2c5ba5a0c82ce1a430b98b6c3363cc4df1c1d86481e85e9e9fa487d483132d8", size = 146392, upload-time = "2025-10-18T07:26:45.608Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/8c0edc80060559b7e6b699314151b8161b92797aeb043007627d44b7a23f/gilknocker-0.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:052a31d051cd8f873e834a608607f7c59ff402c25039044926bc1fc0dbf780e8", size = 157030, upload-time = "2025-10-18T07:26:46.446Z" }, +] + [[package]] name = "google-api-core" version = "2.27.0" @@ -894,6 +1181,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] +[[package]] +name = "h2" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack" }, + { name = "hyperframe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, +] + [[package]] name = "h5netcdf" version = "1.7.3" @@ -953,6 +1253,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/75/d451b9a0ab3a9c0b2c7d1d3cf0bcf797ccac420f3479476f9867e1737d39/holoviews-1.21.0-py3-none-any.whl", hash = "sha256:74f3c01f35b9e8e2a8d6eb457a7ef05727de2a2a56509d59d7dc0d0409bc91c0", size = 5911622, upload-time = "2025-06-25T08:16:13.508Z" }, ] +[[package]] +name = "hpack" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" }, +] + [[package]] name = "httpcore" version = "1.0.9" @@ -981,6 +1290,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] +[package.optional-dependencies] +http2 = [ + { name = "h2" }, +] + [[package]] name = "hvplot" version = "0.12.1" @@ -1000,6 +1314,58 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/f5/99be28b5d19644343f51391841dadf48b91ade96c1885e1630727cbcb4bf/hvplot-0.12.1-py3-none-any.whl", hash = "sha256:034b5061cba597877f85dd427523364f11677d9d04c5e845c17e6d733a7bfaed", size = 175470, upload-time = "2025-08-29T08:27:35.939Z" }, ] +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, +] + +[[package]] +name = "icechunk" +version = "1.1.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zarr" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/762aa0ff7b8b398a469cd138444c68d0154178995f9923cbfb3d02fad6ce/icechunk-1.1.13.tar.gz", hash = "sha256:d83726fff9bab9fca112e957e361aba63f56db029f8eee9e691c7c5d5c6fd7be", size = 430918, upload-time = "2025-11-28T22:07:16.446Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/81/b4a40d638b801fca214a3d619129301473e046a131edbb28feea42279c0a/icechunk-1.1.13-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6dbc822e2fbf29df312c9f8c22ef839f55ccf4f0bc67cfbf956b113f41bf7aee", size = 17355194, upload-time = "2025-11-28T22:06:05.181Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fb/c5f3a05888781aa8e6fa660e5873f515e7cf6ecd2e4559c73dfb04db89cd/icechunk-1.1.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a602c058d00067835233cbe90f329307265ba62e27ce068a1e56cdcf6fadf7de", size = 16781424, upload-time = "2025-11-28T22:05:56.564Z" }, + { url = "https://files.pythonhosted.org/packages/2b/74/c335456c500cda9e67ab88064b89b1e92a5a11b6203dbb309e00ddc58d50/icechunk-1.1.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763b1d1ec69d3f365dd82832fad70673e812dfd231c067073ad5729792340fa7", size = 18244222, upload-time = "2025-11-28T22:05:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/8d/4f/35430ce6433cb1c0de2b2b86b79567da355372500a9dd2719c9d295ee119/icechunk-1.1.13-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a4d06b07f16028ab51e479c3c3c15a0fb0311c38e0a11faab2fba8252d55e48f", size = 18907239, upload-time = "2025-11-28T22:05:12.491Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/bb8d1f8ddfc5c4e7ec237ac73ffa6d984f77b1f736839a1fa3b1ef26ad4e/icechunk-1.1.13-cp313-cp313-manylinux_2_28_armv7l.whl", hash = "sha256:3a1f27075cd5c71f4fead84bfab6401661b500f193dea8aba55d0115a38fecf4", size = 18023701, upload-time = "2025-11-28T22:05:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/de5e397196a7c0bed70320413a0bb04e6dc12775a2b26492654f6e5d8884/icechunk-1.1.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bea1f2e13c68a09bcb991f263ee1e719ada1092daff99916c7b4cfd62dec65d3", size = 19148790, upload-time = "2025-11-28T22:06:14.337Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/be6b989997e897ee5726b4ff2774719ba9130cbefd0db459ee19f289bb87/icechunk-1.1.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4a4809dbff82568e3d2350753c0d05f8a3f6dcf5404b9d0315fcae39d37da0d3", size = 18236274, upload-time = "2025-11-28T22:06:30.18Z" }, + { url = "https://files.pythonhosted.org/packages/6d/13/af994a6c434b8870526baf75bfaac42b58eeda6815a2b08a1a8fefb107c0/icechunk-1.1.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d29c17ff44df83be99d5683edc40faefc18c34e044a4a03f612f6788efc9846b", size = 18982848, upload-time = "2025-11-28T22:06:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/6e/8f2fd47d49efe26c1fc30319f821e3e3789ea61935a3955a7d5e61cdca2d/icechunk-1.1.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a93f45d1dc0c91cee8da14bc58c961a0ac837b263fd06de558117af80e2893b", size = 19005138, upload-time = "2025-11-28T22:07:05.04Z" }, + { url = "https://files.pythonhosted.org/packages/e1/59/743351eec00a14e3d1920d5e8560f7f4033b08b27ad8faddeaa615ba827c/icechunk-1.1.13-cp313-cp313-win_amd64.whl", hash = "sha256:7b378d958ac8175dde75adf23f8c9a4161064281e3408959c393f7363ca99d84", size = 15503670, upload-time = "2025-11-28T22:07:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f4/f156342d28188f0a0659fce4a3b4eb882561ea7688fc966a7ba37b412481/icechunk-1.1.13-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:009201cdfa307e51035821c37e24d410c566e03a82f1bf45df1ef2abf78208e1", size = 18887242, upload-time = "2025-11-28T22:05:14.592Z" }, + { url = "https://files.pythonhosted.org/packages/96/ea/74848485ae27b7b5f6372301d00d97a4a198aa91a1951ee6351a15b28dfd/icechunk-1.1.13-cp313-cp313t-manylinux_2_28_armv7l.whl", hash = "sha256:39e855791de8c9ddff5e1c4fef2092b00e17685877f4ac9305c9c75f21ed274b", size = 18004154, upload-time = "2025-11-28T22:05:31.585Z" }, + { url = "https://files.pythonhosted.org/packages/8a/af/455161a1e54f77a1139878452d5cad7e9c15dcf4023027583f6ab5c36761/icechunk-1.1.13-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec909f0db320ecc0f5a4b9424b631ee8a0ee1577b3330ae435ec9bd4b98c731", size = 19125754, upload-time = "2025-11-28T22:06:16.349Z" }, + { url = "https://files.pythonhosted.org/packages/65/c5/1c0a8b17a5d66d4056931ccabec7e1a8639c513c3fbfa6af082289f0ba7a/icechunk-1.1.13-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:ab089f0b9573716f97dbba235854882b29f441294985a4e425137600ceb33145", size = 18218012, upload-time = "2025-11-28T22:06:32.204Z" }, + { url = "https://files.pythonhosted.org/packages/5a/60/1ae498489ad9ea3879655f5993e9ddfc1d34176f71d61c657fae20adc2ac/icechunk-1.1.13-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c14e4a56b4daa76b00ac10674abd1dbdd5c4d22434a9ec5f9d7c2a7a7dc38994", size = 18972554, upload-time = "2025-11-28T22:06:49.582Z" }, + { url = "https://files.pythonhosted.org/packages/c7/c2/52487749236941d9b726751325e6c1f5b0b8dc9ba5819b23f6007c2f2573/icechunk-1.1.13-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9cb082886a177d50792ce314b1d7258cd657ce4e8d5f9d6ab580ce40ba3faa2c", size = 18982905, upload-time = "2025-11-28T22:07:07.29Z" }, + { url = "https://files.pythonhosted.org/packages/06/94/dbec84e96d273d1a1489f45879c986e151b52aa63342ea6807aa8406d3b7/icechunk-1.1.13-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e0bf22ddb6154e6f2b73c68d54e047a915905ea0e706f7fad854aa1f0d81079a", size = 17330852, upload-time = "2025-11-28T22:06:07.286Z" }, + { url = "https://files.pythonhosted.org/packages/1a/25/e7e2f9435c484f953598f919633976a3f1af7356c8e98526a5d364ecca16/icechunk-1.1.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fc49a4a3a7331daee6e0dedd73ff69df70471ce03c52df5dd858502c3891ac7f", size = 16769008, upload-time = "2025-11-28T22:05:58.6Z" }, + { url = "https://files.pythonhosted.org/packages/49/8b/520d1b66211f8caaa2576e14633a22dac4644696cca49144dfbd476488d6/icechunk-1.1.13-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85391437dd9d4dde9da1b91a1b6c0ba9ad7410b61b008d27574aaeb40017b660", size = 18232608, upload-time = "2025-11-28T22:05:47.541Z" }, + { url = "https://files.pythonhosted.org/packages/e3/cd/072ccbd5a8a37620117c27cc5eeef5c865275596a0f498c6dba949fd5d7c/icechunk-1.1.13-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1093d2d51c9ece50ad849086b8f7eee29362f040f06c4ceedd514c66fa3fb", size = 18887045, upload-time = "2025-11-28T22:05:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7c/bccdb83a2f3c04701e611bdbf8230abbc6538aae0e569c4470f1f724a3c7/icechunk-1.1.13-cp314-cp314-manylinux_2_28_armv7l.whl", hash = "sha256:3b7aa8438305bce81d5672ef4b6c93dbf05f5c9b2bab98cc968767a0db308989", size = 18009100, upload-time = "2025-11-28T22:05:33.923Z" }, + { url = "https://files.pythonhosted.org/packages/e4/8e/90ec52a614feaec9060c2bbd92f51ca4656818a093d7e3aa5a425532a93e/icechunk-1.1.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5d88dd247de519956cb58047143950efd5a99056c303bdc62ca2277773e14e49", size = 19126200, upload-time = "2025-11-28T22:06:18.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/04/e34d2eae4c493ae5f52a5677fa08933250f305b187f259507f7bd536976c/icechunk-1.1.13-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:0d47a73b037ad853bbc2437d3d45509685dd16ba691dcdc3ee5b15f0dcf1d651", size = 18223470, upload-time = "2025-11-28T22:06:34.953Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d9/3939358080d34dbab9f3d373620a58001fe3c6566c2911eef22a9120d39b/icechunk-1.1.13-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:923dbc48c264fdf48e35bd672e5f75f24c7b9738b475c50d7f563a60874f8d00", size = 18967034, upload-time = "2025-11-28T22:06:51.704Z" }, + { url = "https://files.pythonhosted.org/packages/71/2f/c9fa5e07267fcd3e3067666d36cc5c65e2f583b6d9f126000f830e0f970b/icechunk-1.1.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8bc48d291b1592590d0f79926d6ec7162590ff666a1261010e58837867cd1f9d", size = 18993751, upload-time = "2025-11-28T22:07:09.333Z" }, + { url = "https://files.pythonhosted.org/packages/24/af/786284b7386234277c5a1b71fb4cc6c5556237d9e9fa0caad1b0256bae40/icechunk-1.1.13-cp314-cp314-win_amd64.whl", hash = "sha256:078e7d4094d4c7e050b5ad540b26fae6c9955c61f4ea99a23969d7ffd69e35c6", size = 15478832, upload-time = "2025-11-28T22:07:25.461Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cd/27910e10c17e8dd2360804a19da857d0b8882afa0e92da0f10d239096cea/icechunk-1.1.13-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0d50de47d705f55ad356037c31f55fcc538d760461e9a5caee9240bc47ec1125", size = 18886472, upload-time = "2025-11-28T22:05:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/446bd1543bea6d7369cf990591cb65cf2109e68fbeff02d3a7cf44753ce9/icechunk-1.1.13-cp314-cp314t-manylinux_2_28_armv7l.whl", hash = "sha256:6f341bbe4b2bafc610f237905595fb51822410ab93f314761f864b4e2afa376b", size = 18004332, upload-time = "2025-11-28T22:05:36.234Z" }, + { url = "https://files.pythonhosted.org/packages/57/02/c99811b376611dc061d0960c511ff1244ad937d451ae3f724d40935a38c8/icechunk-1.1.13-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc1f9ae1131c43cce8196ab6d8772841dcc378a4845b9801e8893f3f2834276f", size = 19130297, upload-time = "2025-11-28T22:06:21.251Z" }, + { url = "https://files.pythonhosted.org/packages/47/ef/6c568e29016d1d909b1d115cdf0096d8aaa758010682af39252c1119109b/icechunk-1.1.13-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0a83f9bbf925e895d3f88b1131772a6d0df02dacc4b28f6f77e119cff1e5912b", size = 18218065, upload-time = "2025-11-28T22:06:37.364Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2c/26b0df6791205386167b148ee1c043d95cb5a2847de47c9354cdf687640f/icechunk-1.1.13-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4f78fa3811848b6c8af9dc79b7622a67e6a5ac661dd17e7348beb7484a6b447e", size = 18953910, upload-time = "2025-11-28T22:06:54.113Z" }, + { url = "https://files.pythonhosted.org/packages/50/08/6d4a7e20d3c1f9c1b50a38da8c9291bd72197d10d7ebc09bc73887951f99/icechunk-1.1.13-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf526b28f67b6568ca2bc095f12008324460c36b5e69cc491769a68c2e219253", size = 18987897, upload-time = "2025-11-28T22:07:11.75Z" }, +] + [[package]] name = "idna" version = "3.11" @@ -1018,6 +1384,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "invoke" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/bd/b461d3424a24c80490313fd77feeb666ca4f6a28c7e72713e3d9095719b4/invoke-2.2.1.tar.gz", hash = "sha256:515bf49b4a48932b79b024590348da22f39c4942dff991ad1fb8b8baea1be707", size = 304762, upload-time = "2025-10-11T00:36:35.172Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/4b/b99e37f88336009971405cbb7630610322ed6fbfa31e1d7ab3fbf3049a2d/invoke-2.2.1-py3-none-any.whl", hash = "sha256:2413bc441b376e5cd3f55bb5d364f973ad8bdd7bf87e53c79de3c11bf3feecc8", size = 160287, upload-time = "2025-10-11T00:36:33.703Z" }, +] + [[package]] name = "ipykernel" version = "7.1.0" @@ -1097,24 +1472,30 @@ version = "0.1.0" source = { editable = "." } dependencies = [ { name = "cftime" }, + { name = "coiled" }, { name = "dask" }, { name = "fsspec" }, { name = "gcsfs" }, { name = "h5netcdf" }, { name = "holoviews" }, { name = "hvplot" }, + { name = "icechunk" }, { name = "ipywidgets" }, { name = "jupyter" }, { name = "jupyter-bokeh" }, + { name = "kerchunk" }, + { name = "lithops" }, { name = "matplotlib" }, { name = "netcdf4" }, { name = "numpy" }, + { name = "obstore" }, { name = "pandas" }, { name = "panel" }, { name = "pyarrow" }, { name = "pyproj" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "virtualizarr" }, { name = "xarray" }, ] @@ -1128,18 +1509,23 @@ dev = [ [package.metadata] requires-dist = [ { name = "cftime", specifier = ">=1.6.5" }, + { name = "coiled", specifier = ">=1.129.3" }, { name = "dask", specifier = ">=2025.11.0" }, { name = "fsspec", specifier = ">=2025.9.0" }, { name = "gcsfs", specifier = ">=2025.9.0" }, { name = "h5netcdf", specifier = ">=1.7.3" }, { name = "holoviews", specifier = ">=1.19.0" }, { name = "hvplot", specifier = ">=0.10.0" }, + { name = "icechunk", specifier = ">=1.1.13" }, { name = "ipywidgets", specifier = ">=8.1.0" }, { name = "jupyter", specifier = ">=1.1.0" }, { name = "jupyter-bokeh", specifier = ">=4.0.5" }, + { name = "kerchunk", specifier = ">=0.2.9" }, + { name = "lithops", specifier = ">=3.6.2" }, { name = "matplotlib", specifier = ">=3.10.7" }, { name = "netcdf4", specifier = ">=1.7.0" }, { name = "numpy", specifier = ">=2.3.4" }, + { name = "obstore", specifier = ">=0.8.2" }, { name = "pandas", specifier = ">=2.3.3" }, { name = "panel", specifier = ">=1.5.4" }, { name = "pyarrow", specifier = ">=22.0.0" }, @@ -1149,6 +1535,7 @@ requires-dist = [ { name = "pyyaml", specifier = ">=6.0.0" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, { name = "scipy", specifier = ">=1.16.2" }, + { name = "virtualizarr", specifier = ">=2.2.1" }, { name = "xarray", specifier = ">=2025.10.1" }, ] provides-extras = ["dev"] @@ -1189,6 +1576,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jmespath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" }, +] + [[package]] name = "json5" version = "0.12.1" @@ -1198,6 +1594,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl", hash = "sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5", size = 36119, upload-time = "2025-08-12T19:47:41.131Z" }, ] +[[package]] +name = "jsondiff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/48/841137f1843fa215ea284834d1514b8e9e20962bda63a636c7417e02f8fb/jsondiff-2.2.1.tar.gz", hash = "sha256:658d162c8a86ba86de26303cd86a7b37e1b2c1ec98b569a60e2ca6180545f7fe", size = 26649, upload-time = "2024-08-29T04:09:06.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/94/a8066f84d62ab666d61ef97deba1a33126e3e5c0c0da2c458ada17053ed6/jsondiff-2.2.1-py3-none-any.whl", hash = "sha256:b1f0f7e2421881848b1d556d541ac01a91680cfcc14f51a9b62cdf4da0e56722", size = 13440, upload-time = "2024-08-29T04:09:04.955Z" }, +] + [[package]] name = "jsonpointer" version = "3.0.0" @@ -1458,6 +1866,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571, upload-time = "2025-05-05T12:32:29.534Z" }, ] +[[package]] +name = "kerchunk" +version = "0.2.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec" }, + { name = "numcodecs" }, + { name = "numpy" }, + { name = "ujson" }, + { name = "zarr" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/4d/4e8a1d7780eebe3d869887835eaa63ccc0b5bd316a4c0ba793e0e73c848d/kerchunk-0.2.9.tar.gz", hash = "sha256:86a54da9a57a94fd6fb97be786e2d83182d3d8e4fd7c0ea2b67cde3d0641df7d", size = 712534, upload-time = "2025-07-31T14:36:17.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/96/355144a51c7dd7444e7550b26addfce45f31bc59c4a258d6efc84f585af4/kerchunk-0.2.9-py3-none-any.whl", hash = "sha256:5f7ff385ace07c62bd0ae5db639cac8b441169fea2389bb006fd209549f699c2", size = 66440, upload-time = "2025-07-31T14:36:16.628Z" }, +] + [[package]] name = "kiwisolver" version = "1.4.9" @@ -1538,6 +1962,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820, upload-time = "2024-02-04T14:48:02.496Z" }, ] +[[package]] +name = "lithops" +version = "3.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "cloudpickle" }, + { name = "paramiko" }, + { name = "pika" }, + { name = "ps-mem" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "six" }, + { name = "tabulate" }, + { name = "tblib" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/36/46b9218b3e3cd1e79a3440e8058f29f8ebd7e7ca70cb38da6dd84a92fa5b/lithops-3.6.2.tar.gz", hash = "sha256:786a16edced8fdbd0129055107dce8c04f95d16bd673d6c02d55a239c463b78b", size = 276112, upload-time = "2025-09-13T13:55:12.861Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/a3/f06f296ad1a8eb0519996bda0e748905664526897f465ef48bf9800b12fc/lithops-3.6.2-py3-none-any.whl", hash = "sha256:b04401164c9c45278422d28e1a667a934c62b8d55d1ca9f2884e27cebf3a0584", size = 391820, upload-time = "2025-09-13T13:55:11.077Z" }, +] + [[package]] name = "locket" version = "1.0.0" @@ -1709,6 +2156,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, ] +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, +] + [[package]] name = "multidict" version = "6.7.0" @@ -1909,6 +2391,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, ] +[[package]] +name = "numcodecs" +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/bd/8a391e7c356366224734efd24da929cc4796fff468bfb179fe1af6548535/numcodecs-0.16.5.tar.gz", hash = "sha256:0d0fb60852f84c0bd9543cc4d2ab9eefd37fc8efcc410acd4777e62a1d300318", size = 6276387, upload-time = "2025-11-21T02:49:48.986Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/38/071ced5a5fd1c85ba0e14ba721b66b053823e5176298c2f707e50bed11d9/numcodecs-0.16.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25be3a516ab677dad890760d357cfe081a371d9c0a2e9a204562318ac5969de3", size = 1654359, upload-time = "2025-11-21T02:49:33.673Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c0/5f84ba7525577c1b9909fc2d06ef11314825fc4ad4378f61d0e4c9883b4a/numcodecs-0.16.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0107e839ef75b854e969cb577e140b1aadb9847893937636582d23a2a4c6ce50", size = 1144237, upload-time = "2025-11-21T02:49:35.294Z" }, + { url = "https://files.pythonhosted.org/packages/0b/00/787ea5f237b8ea7bc67140c99155f9c00b5baf11c49afc5f3bfefa298f95/numcodecs-0.16.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:015a7c859ecc2a06e2a548f64008c0ec3aaecabc26456c2c62f4278d8fc20597", size = 8483064, upload-time = "2025-11-21T02:49:36.454Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e6/d359fdd37498e74d26a167f7a51e54542e642ea47181eb4e643a69a066c3/numcodecs-0.16.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84230b4b9dad2392f2a84242bd6e3e659ac137b5a1ce3571d6965fca673e0903", size = 9126063, upload-time = "2025-11-21T02:49:38.018Z" }, + { url = "https://files.pythonhosted.org/packages/27/72/6663cc0382ddbb866136c255c837bcb96cc7ce5e83562efec55e1b995941/numcodecs-0.16.5-cp313-cp313-win_amd64.whl", hash = "sha256:5088145502ad1ebf677ec47d00eb6f0fd600658217db3e0c070c321c85d6cf3d", size = 799275, upload-time = "2025-11-21T02:49:39.558Z" }, + { url = "https://files.pythonhosted.org/packages/3c/9e/38e7ca8184c958b51f45d56a4aeceb1134ecde2d8bd157efadc98502cc42/numcodecs-0.16.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b05647b8b769e6bc8016e9fd4843c823ce5c9f2337c089fb5c9c4da05e5275de", size = 1654721, upload-time = "2025-11-21T02:49:40.602Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/260fa42e7b2b08e6e00ad632f8dd620961a60a459426c26cea390f8c68d0/numcodecs-0.16.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3832bd1b5af8bb3e413076b7d93318c8e7d7b68935006b9fa36ca057d1725a8f", size = 1146887, upload-time = "2025-11-21T02:49:41.721Z" }, + { url = "https://files.pythonhosted.org/packages/4e/15/e2e1151b5a8b14a15dfd4bb4abccce7fff7580f39bc34092780088835f3a/numcodecs-0.16.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49f7b7d24f103187f53135bed28bb9f0ed6b2e14c604664726487bb6d7c882e1", size = 8476987, upload-time = "2025-11-21T02:49:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/6d/30/16a57fc4d9fb0ba06c600408bd6634f2f1753c54a7a351c99c5e09b51ee2/numcodecs-0.16.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aec9736d81b70f337d89c4070ee3ffeff113f386fd789492fa152d26a15043e4", size = 9102377, upload-time = "2025-11-21T02:49:45.508Z" }, + { url = "https://files.pythonhosted.org/packages/31/a5/a0425af36c20d55a3ea884db4b4efca25a43bea9214ba69ca7932dd997b4/numcodecs-0.16.5-cp314-cp314-win_amd64.whl", hash = "sha256:b16a14303800e9fb88abc39463ab4706c037647ac17e49e297faa5f7d7dbbf1d", size = 819022, upload-time = "2025-11-21T02:49:47.39Z" }, +] + [[package]] name = "numpy" version = "2.3.4" @@ -1970,6 +2474,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, ] +[[package]] +name = "obstore" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/8c/9ec984edd0f3b72226adfaa19b1c61b15823b35b52f311ca4af36d009d15/obstore-0.8.2.tar.gz", hash = "sha256:a467bc4e97169e2ba749981b4fd0936015428d9b8f3fb83a5528536b1b6f377f", size = 168852, upload-time = "2025-09-16T15:34:55.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/5d/8c3316cc958d386d5e6ab03e9db9ddc27f8e2141cee4a6777ae5b92f3aac/obstore-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:212f033e53fe6e53d64957923c5c88949a400e9027f7038c705ec2e9038be563", size = 3612027, upload-time = "2025-09-16T15:33:45.6Z" }, + { url = "https://files.pythonhosted.org/packages/ea/4d/699359774ce6330130536d008bfc32827fab0c25a00238d015a5974a3d1d/obstore-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bee21fa4ba148d08fa90e47a96df11161661ed31e09c056a373cb2154b0f2852", size = 3344686, upload-time = "2025-09-16T15:33:47.185Z" }, + { url = "https://files.pythonhosted.org/packages/82/37/55437341f10512906e02fd9fa69a8a95ad3f2f6a916d3233fda01763d110/obstore-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4c66594b59832ff1ced4c72575d9beb8b5f9b4e404ac1150a42bfb226617fd50", size = 3459860, upload-time = "2025-09-16T15:33:48.382Z" }, + { url = "https://files.pythonhosted.org/packages/7a/51/4245a616c94ee4851965e33f7a563ab4090cc81f52cc73227ff9ceca2e46/obstore-0.8.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:089f33af5c2fe132d00214a0c1f40601b28f23a38e24ef9f79fb0576f2730b74", size = 3691648, upload-time = "2025-09-16T15:33:49.524Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/4e2fb24171e3ca3641a4653f006be826e7e17634b11688a5190553b00b83/obstore-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d87f658dfd340d5d9ea2d86a7c90d44da77a0db9e00c034367dca335735110cf", size = 3956867, upload-time = "2025-09-16T15:33:51.082Z" }, + { url = "https://files.pythonhosted.org/packages/42/f5/b703115361c798c9c1744e1e700d5908d904a8c2e2bd38bec759c9ffb469/obstore-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e2e4fa92828c4fbc2d487f3da2d3588701a1b67d9f6ca3c97cc2afc912e9c63", size = 3950599, upload-time = "2025-09-16T15:33:52.173Z" }, + { url = "https://files.pythonhosted.org/packages/53/20/08c6dc0f20c1394e2324b9344838e4e7af770cdcb52c30757a475f50daeb/obstore-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab440e89c5c37a8ec230857dd65147d4b923e0cada33297135d05e0f937d696a", size = 3765865, upload-time = "2025-09-16T15:33:53.291Z" }, + { url = "https://files.pythonhosted.org/packages/77/20/77907765e29b2eba6bd8821872284d91170d7084f670855b2dfcb249ea14/obstore-0.8.2-cp313-cp313-manylinux_2_24_aarch64.whl", hash = "sha256:b9beed107c5c9cd995d4a73263861fcfbc414d58773ed65c14f80eb18258a932", size = 3529807, upload-time = "2025-09-16T15:33:54.535Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f5/f629d39cc30d050f52b1bf927e4d65c1cc7d7ffbb8a635cd546b5c5219a0/obstore-0.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b75b4e7746292c785e31edcd5aadc8b758238372a19d4c5e394db5c305d7d175", size = 3693629, upload-time = "2025-09-16T15:33:56.016Z" }, + { url = "https://files.pythonhosted.org/packages/30/ff/106763fd10f2a1cb47f2ef1162293c78ad52f4e73223d8d43fc6b755445d/obstore-0.8.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f33e6c366869d05ab0b7f12efe63269e631c5450d95d6b4ba4c5faf63f69de70", size = 3686176, upload-time = "2025-09-16T15:33:57.247Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/d2ccb6f32feeca906d5a7c4255340df5262af8838441ca06c9e4e37b67d5/obstore-0.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:12c885a9ce5ceb09d13cc186586c0c10b62597eff21b985f6ce8ff9dab963ad3", size = 3773081, upload-time = "2025-09-16T15:33:58.475Z" }, + { url = "https://files.pythonhosted.org/packages/fa/79/40d1cc504cefc89c9b3dd8874287f3fddc7d963a8748d6dffc5880222013/obstore-0.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4accc883b93349a81c9931e15dd318cc703b02bbef2805d964724c73d006d00e", size = 3938589, upload-time = "2025-09-16T15:33:59.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/dd/916c6777222db3271e9fb3cf9a97ed92b3a9b3e465bdeec96de9ab809d53/obstore-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ec850adf9980e5788a826ccfd5819989724e2a2f712bfa3258e85966c8d9981e", size = 3977768, upload-time = "2025-09-16T15:34:01.25Z" }, + { url = "https://files.pythonhosted.org/packages/f1/61/66f8dc98bbf5613bbfe5bf21747b4c8091442977f4bd897945895ab7325c/obstore-0.8.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1431e40e9bb4773a261e51b192ea6489d0799b9d4d7dbdf175cdf813eb8c0503", size = 3623364, upload-time = "2025-09-16T15:34:02.957Z" }, + { url = "https://files.pythonhosted.org/packages/1a/66/6d527b3027e42f625c8fc816ac7d19b0d6228f95bfe7666e4d6b081d2348/obstore-0.8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ddb39d4da303f50b959da000aa42734f6da7ac0cc0be2d5a7838b62c97055bb9", size = 3347764, upload-time = "2025-09-16T15:34:04.236Z" }, + { url = "https://files.pythonhosted.org/packages/0d/79/c00103302b620192ea447a948921ad3fed031ce3d19e989f038e1183f607/obstore-0.8.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e01f4e13783db453e17e005a4a3ceff09c41c262e44649ba169d253098c775e8", size = 3460981, upload-time = "2025-09-16T15:34:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/3d/d9/bfe4ed4b1aebc45b56644dd5b943cf8e1673505cccb352e66878a457e807/obstore-0.8.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df0fc2d0bc17caff9b538564ddc26d7616f7e8b7c65b1a3c90b5048a8ad2e797", size = 3692711, upload-time = "2025-09-16T15:34:06.796Z" }, + { url = "https://files.pythonhosted.org/packages/13/47/cd6c2cbb18e1f40c77e7957a4a03d2d83f1859a2e876a408f1ece81cad4c/obstore-0.8.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e439d06c99a140348f046c9f598ee349cc2dcd9105c15540a4b231f9cc48bbae", size = 3958362, upload-time = "2025-09-16T15:34:08.277Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ea/5ee82bf23abd71c7d6a3f2d008197ae8f8f569d41314c26a8f75318245be/obstore-0.8.2-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e37d9046669fcc59522d0faf1d105fcbfd09c84cccaaa1e809227d8e030f32c", size = 3957082, upload-time = "2025-09-16T15:34:09.477Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ee/46650405e50fdaa8d95f30375491f9c91fac9517980e8a28a4a6af66927f/obstore-0.8.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2646fdcc4bbe92dc2bb5bcdff15574da1211f5806c002b66d514cee2a23c7cb8", size = 3775539, upload-time = "2025-09-16T15:34:10.726Z" }, + { url = "https://files.pythonhosted.org/packages/35/d6/348a7ebebe2ca3d94dfc75344ea19675ae45472823e372c1852844078307/obstore-0.8.2-cp314-cp314-manylinux_2_24_aarch64.whl", hash = "sha256:e31a7d37675056d93dfc244605089dee67f5bba30f37c88436623c8c5ad9ba9d", size = 3535048, upload-time = "2025-09-16T15:34:12.076Z" }, + { url = "https://files.pythonhosted.org/packages/41/07/b7a16cc0da91a4b902d47880ad24016abfe7880c63f7cdafda45d89a2f91/obstore-0.8.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:656313dd8170dde0f0cd471433283337a63912e8e790a121f7cc7639c83e3816", size = 3699035, upload-time = "2025-09-16T15:34:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/3269a3a58347e0b019742d888612c4b765293c9c75efa44e144b1e884c0d/obstore-0.8.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329038c9645d6d1741e77fe1a53e28a14b1a5c1461cfe4086082ad39ebabf981", size = 3687307, upload-time = "2025-09-16T15:34:14.501Z" }, + { url = "https://files.pythonhosted.org/packages/01/f9/4fd4819ad6a49d2f462a45be453561f4caebded0dc40112deeffc34b89b1/obstore-0.8.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1e4df99b369790c97c752d126b286dc86484ea49bff5782843a265221406566f", size = 3776076, upload-time = "2025-09-16T15:34:16.207Z" }, + { url = "https://files.pythonhosted.org/packages/14/dd/7c4f958fa0b9fc4778fb3d232e38b37db8c6b260f641022fbba48b049d7e/obstore-0.8.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9e1c65c65e20cc990414a8a9af88209b1bbc0dd9521b5f6b0293c60e19439bb7", size = 3947445, upload-time = "2025-09-16T15:34:17.423Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -2061,6 +2598,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/57/2b46b199482bbaaade2f978164577cf7c2fdc2782a7caf29fabd5265a84f/param-2.2.1-py3-none-any.whl", hash = "sha256:e3a4ca7f3d7610615129a55dbde2e90eb67d11cef70936487b0a59717dba0bdc", size = 119047, upload-time = "2025-06-11T15:10:25.136Z" }, ] +[[package]] +name = "paramiko" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bcrypt" }, + { name = "cryptography" }, + { name = "invoke" }, + { name = "pynacl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/e7/81fdcbc7f190cdb058cffc9431587eb289833bdd633e2002455ca9bb13d4/paramiko-4.0.0.tar.gz", hash = "sha256:6a25f07b380cc9c9a88d2b920ad37167ac4667f8d9886ccebd8f90f654b5d69f", size = 1630743, upload-time = "2025-08-04T01:02:03.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/90/a744336f5af32c433bd09af7854599682a383b37cfd78f7de263de6ad6cb/paramiko-4.0.0-py3-none-any.whl", hash = "sha256:0e20e00ac666503bf0b4eda3b6d833465a2b7aff2e2b3d79a8bba5ef144ee3b9", size = 223932, upload-time = "2025-08-04T01:02:02.029Z" }, +] + [[package]] name = "parso" version = "0.8.5" @@ -2083,6 +2635,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905, upload-time = "2024-05-06T19:51:39.271Z" }, ] +[[package]] +name = "pathlib-abc" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/cb/448649d7f25d228bf0be3a04590ab7afa77f15e056f8fa976ed05ec9a78f/pathlib_abc-0.5.2.tar.gz", hash = "sha256:fcd56f147234645e2c59c7ae22808b34c364bb231f685ddd9f96885aed78a94c", size = 33342, upload-time = "2025-10-10T18:37:20.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl", hash = "sha256:4c9d94cf1b23af417ce7c0417b43333b06a106c01000b286c99de230d95eefbb", size = 19070, upload-time = "2025-10-10T18:37:19.437Z" }, +] + [[package]] name = "pexpect" version = "4.9.0" @@ -2095,6 +2656,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, ] +[[package]] +name = "pika" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/db/d4102f356af18f316c67f2cead8ece307f731dd63140e2c71f170ddacf9b/pika-1.3.2.tar.gz", hash = "sha256:b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f", size = 145029, upload-time = "2023-05-05T14:25:43.368Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/f3/f412836ec714d36f0f4ab581b84c491e3f42c6b5b97a6c6ed1817f3c16d0/pika-1.3.2-py3-none-any.whl", hash = "sha256:0779a7c1fafd805672796085560d290213a465e4f6f76a6fb19e378d8041a14f", size = 155415, upload-time = "2023-05-05T14:25:41.484Z" }, +] + [[package]] name = "pillow" version = "12.0.0" @@ -2153,6 +2723,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, ] +[[package]] +name = "pip" +version = "25.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/6e/74a3f0179a4a73a53d66ce57fdb4de0080a8baa1de0063de206d6167acc2/pip-25.3.tar.gz", hash = "sha256:8d0538dbbd7babbd207f261ed969c65de439f6bc9e5dbd3b3b9a77f25d95f343", size = 1803014, upload-time = "2025-10-25T00:55:41.394Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl", hash = "sha256:9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd", size = 1778622, upload-time = "2025-10-25T00:55:39.247Z" }, +] + +[[package]] +name = "pip-requirements-parser" +version = "32.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359, upload-time = "2022-12-21T15:25:22.732Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648, upload-time = "2022-12-21T15:25:21.046Z" }, +] + [[package]] name = "platformdirs" version = "4.5.0" @@ -2288,6 +2880,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/d1/0a28c21707807c6aacd5dc9c3704b2aa1effbf37adebd8caeaf68b17a636/protobuf-6.33.0-py3-none-any.whl", hash = "sha256:25c9e1963c6734448ea2d308cfa610e692b801304ba0908d7bfa564ac5132995", size = 170477, upload-time = "2025-10-15T20:39:51.311Z" }, ] +[[package]] +name = "ps-mem" +version = "3.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/44/26189e96f535a3479e1a4b858da3fb75ad25f82e9ab3323e032deab28420/ps_mem-3.14.tar.gz", hash = "sha256:14de44f747effbaec620e1cc783a6ab6bd78b2639c0dcfaa132561f9efef47ca", size = 19477, upload-time = "2022-05-28T11:38:09.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/e9/c843b735b12d57eb77bd563a11c530e103df5fd2bbbbb9974cde7d98d515/ps_mem-3.14-py2.py3-none-any.whl", hash = "sha256:43f5cd9f173fcf20d035dd44c02dca828c914dbfb4f202b1229aa0675ff25139", size = 19268, upload-time = "2022-05-28T11:38:06.725Z" }, +] + [[package]] name = "psutil" version = "7.1.2" @@ -2407,6 +3008,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pynacl" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/46/aeca065d227e2265125aea590c9c47fbf5786128c9400ee0eb7c88931f06/pynacl-1.6.1.tar.gz", hash = "sha256:8d361dac0309f2b6ad33b349a56cd163c98430d409fa503b10b70b3ad66eaa1d", size = 3506616, upload-time = "2025-11-10T16:02:13.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/d6/4b2dca33ed512de8f54e5c6074aa06eaeb225bfbcd9b16f33a414389d6bd/pynacl-1.6.1-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:7d7c09749450c385301a3c20dca967a525152ae4608c0a096fe8464bfc3df93d", size = 389109, upload-time = "2025-11-10T16:01:28.79Z" }, + { url = "https://files.pythonhosted.org/packages/3c/30/e8dbb8ff4fa2559bbbb2187ba0d0d7faf728d17cb8396ecf4a898b22d3da/pynacl-1.6.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc734c1696ffd49b40f7c1779c89ba908157c57345cf626be2e0719488a076d3", size = 808254, upload-time = "2025-11-10T16:01:37.839Z" }, + { url = "https://files.pythonhosted.org/packages/44/f9/f5449c652f31da00249638dbab065ad4969c635119094b79b17c3a4da2ab/pynacl-1.6.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cd787ec1f5c155dc8ecf39b1333cfef41415dc96d392f1ce288b4fe970df489", size = 1407365, upload-time = "2025-11-10T16:01:40.454Z" }, + { url = "https://files.pythonhosted.org/packages/eb/2f/9aa5605f473b712065c0a193ebf4ad4725d7a245533f0cd7e5dcdbc78f35/pynacl-1.6.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b35d93ab2df03ecb3aa506be0d3c73609a51449ae0855c2e89c7ed44abde40b", size = 843842, upload-time = "2025-11-10T16:01:30.524Z" }, + { url = "https://files.pythonhosted.org/packages/32/8d/748f0f6956e207453da8f5f21a70885fbbb2e060d5c9d78e0a4a06781451/pynacl-1.6.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dece79aecbb8f4640a1adbb81e4aa3bfb0e98e99834884a80eb3f33c7c30e708", size = 1445559, upload-time = "2025-11-10T16:01:33.663Z" }, + { url = "https://files.pythonhosted.org/packages/78/d0/2387f0dcb0e9816f38373999e48db4728ed724d31accdd4e737473319d35/pynacl-1.6.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c2228054f04bf32d558fb89bb99f163a8197d5a9bf4efa13069a7fa8d4b93fc3", size = 825791, upload-time = "2025-11-10T16:01:34.823Z" }, + { url = "https://files.pythonhosted.org/packages/18/3d/ef6fb7eb072aaf15f280bc66f26ab97e7fc9efa50fb1927683013ef47473/pynacl-1.6.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:2b12f1b97346f177affcdfdc78875ff42637cb40dcf79484a97dae3448083a78", size = 1410843, upload-time = "2025-11-10T16:01:36.401Z" }, + { url = "https://files.pythonhosted.org/packages/e3/fb/23824a017526850ee7d8a1cc4cd1e3e5082800522c10832edbbca8619537/pynacl-1.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e735c3a1bdfde3834503baf1a6d74d4a143920281cb724ba29fb84c9f49b9c48", size = 801140, upload-time = "2025-11-10T16:01:42.013Z" }, + { url = "https://files.pythonhosted.org/packages/5d/d1/ebc6b182cb98603a35635b727d62f094bc201bf610f97a3bb6357fe688d2/pynacl-1.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3384a454adf5d716a9fadcb5eb2e3e72cd49302d1374a60edc531c9957a9b014", size = 1371966, upload-time = "2025-11-10T16:01:43.297Z" }, + { url = "https://files.pythonhosted.org/packages/64/f4/c9d7b6f02924b1f31db546c7bd2a83a2421c6b4a8e6a2e53425c9f2802e0/pynacl-1.6.1-cp314-cp314t-win32.whl", hash = "sha256:d8615ee34d01c8e0ab3f302dcdd7b32e2bcf698ba5f4809e7cc407c8cdea7717", size = 230482, upload-time = "2025-11-10T16:01:47.688Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2c/942477957fba22da7bf99131850e5ebdff66623418ab48964e78a7a8293e/pynacl-1.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5f5b35c1a266f8a9ad22525049280a600b19edd1f785bccd01ae838437dcf935", size = 243232, upload-time = "2025-11-10T16:01:45.208Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0c/bdbc0d04a53b96a765ab03aa2cf9a76ad8653d70bf1665459b9a0dedaa1c/pynacl-1.6.1-cp314-cp314t-win_arm64.whl", hash = "sha256:d984c91fe3494793b2a1fb1e91429539c6c28e9ec8209d26d25041ec599ccf63", size = 187907, upload-time = "2025-11-10T16:01:46.328Z" }, + { url = "https://files.pythonhosted.org/packages/49/41/3cfb3b4f3519f6ff62bf71bf1722547644bcfb1b05b8fdbdc300249ba113/pynacl-1.6.1-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:a6f9fd6d6639b1e81115c7f8ff16b8dedba1e8098d2756275d63d208b0e32021", size = 387591, upload-time = "2025-11-10T16:01:49.1Z" }, + { url = "https://files.pythonhosted.org/packages/18/21/b8a6563637799f617a3960f659513eccb3fcc655d5fc2be6e9dc6416826f/pynacl-1.6.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e49a3f3d0da9f79c1bec2aa013261ab9fa651c7da045d376bd306cf7c1792993", size = 798866, upload-time = "2025-11-10T16:01:55.688Z" }, + { url = "https://files.pythonhosted.org/packages/e8/6c/dc38033bc3ea461e05ae8f15a81e0e67ab9a01861d352ae971c99de23e7c/pynacl-1.6.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7713f8977b5d25f54a811ec9efa2738ac592e846dd6e8a4d3f7578346a841078", size = 1398001, upload-time = "2025-11-10T16:01:57.101Z" }, + { url = "https://files.pythonhosted.org/packages/9f/05/3ec0796a9917100a62c5073b20c4bce7bf0fea49e99b7906d1699cc7b61b/pynacl-1.6.1-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a3becafc1ee2e5ea7f9abc642f56b82dcf5be69b961e782a96ea52b55d8a9fc", size = 834024, upload-time = "2025-11-10T16:01:50.228Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b7/ae9982be0f344f58d9c64a1c25d1f0125c79201634efe3c87305ac7cb3e3/pynacl-1.6.1-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ce50d19f1566c391fedc8dc2f2f5be265ae214112ebe55315e41d1f36a7f0a9", size = 1436766, upload-time = "2025-11-10T16:01:51.886Z" }, + { url = "https://files.pythonhosted.org/packages/b4/51/b2ccbf89cf3025a02e044dd68a365cad593ebf70f532299f2c047d2b7714/pynacl-1.6.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:543f869140f67d42b9b8d47f922552d7a967e6c116aad028c9bfc5f3f3b3a7b7", size = 817275, upload-time = "2025-11-10T16:01:53.351Z" }, + { url = "https://files.pythonhosted.org/packages/a8/6c/dd9ee8214edf63ac563b08a9b30f98d116942b621d39a751ac3256694536/pynacl-1.6.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a2bb472458c7ca959aeeff8401b8efef329b0fc44a89d3775cffe8fad3398ad8", size = 1401891, upload-time = "2025-11-10T16:01:54.587Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c1/97d3e1c83772d78ee1db3053fd674bc6c524afbace2bfe8d419fd55d7ed1/pynacl-1.6.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3206fa98737fdc66d59b8782cecc3d37d30aeec4593d1c8c145825a345bba0f0", size = 772291, upload-time = "2025-11-10T16:01:58.111Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ca/691ff2fe12f3bb3e43e8e8df4b806f6384593d427f635104d337b8e00291/pynacl-1.6.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:53543b4f3d8acb344f75fd4d49f75e6572fce139f4bfb4815a9282296ff9f4c0", size = 1370839, upload-time = "2025-11-10T16:01:59.252Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/06fe5389d30391fce006442246062cc35773c84fbcad0209fbbf5e173734/pynacl-1.6.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:319de653ef84c4f04e045eb250e6101d23132372b0a61a7acf91bac0fda8e58c", size = 791371, upload-time = "2025-11-10T16:02:01.075Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7a/e2bde8c9d39074a5aa046c7d7953401608d1f16f71e237f4bef3fb9d7e49/pynacl-1.6.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:262a8de6bba4aee8a66f5edf62c214b06647461c9b6b641f8cd0cb1e3b3196fe", size = 1363031, upload-time = "2025-11-10T16:02:02.656Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b6/63fd77264dae1087770a1bb414bc604470f58fbc21d83822fc9c76248076/pynacl-1.6.1-cp38-abi3-win32.whl", hash = "sha256:9fd1a4eb03caf8a2fe27b515a998d26923adb9ddb68db78e35ca2875a3830dde", size = 226585, upload-time = "2025-11-10T16:02:07.116Z" }, + { url = "https://files.pythonhosted.org/packages/12/c8/b419180f3fdb72ab4d45e1d88580761c267c7ca6eda9a20dcbcba254efe6/pynacl-1.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:a569a4069a7855f963940040f35e87d8bc084cb2d6347428d5ad20550a0a1a21", size = 238923, upload-time = "2025-11-10T16:02:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/35/76/c34426d532e4dce7ff36e4d92cb20f4cbbd94b619964b93d24e8f5b5510f/pynacl-1.6.1-cp38-abi3-win_arm64.whl", hash = "sha256:5953e8b8cfadb10889a6e7bd0f53041a745d1b3d30111386a1bb37af171e6daf", size = 183970, upload-time = "2025-11-10T16:02:05.786Z" }, +] + [[package]] name = "pyparsing" version = "3.2.5" @@ -2700,6 +3338,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, ] +[[package]] +name = "rich" +version = "14.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + [[package]] name = "rpds-py" version = "0.28.0" @@ -2804,6 +3455,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/bd/4168a751ddbbf43e86544b4de8b5c3b7be8d7167a2a5cb977d274e04f0a1/ruff-0.14.4-py3-none-win_arm64.whl", hash = "sha256:dd09c292479596b0e6fec8cd95c65c3a6dc68e9ad17b8f2382130f87ff6a75bb", size = 12663065, upload-time = "2025-11-06T22:07:42.603Z" }, ] +[[package]] +name = "s3transfer" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/04/74127fc843314818edfa81b5540e26dd537353b123a4edc563109d8f17dd/s3transfer-0.16.0.tar.gz", hash = "sha256:8e990f13268025792229cd52fa10cb7163744bf56e719e0b9cb925ab79abf920", size = 153827, upload-time = "2025-12-01T02:30:59.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/51/727abb13f44c1fcf6d145979e1535a35794db0f6e450a0cb46aa24732fe2/s3transfer-0.16.0-py3-none-any.whl", hash = "sha256:18e25d66fed509e3868dc1572b3f427ff947dd2c56f844a5bf09481ad3f3b2fe", size = 86830, upload-time = "2025-12-01T02:30:57.729Z" }, +] + [[package]] name = "scipy" version = "1.16.2" @@ -2891,6 +3554,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + [[package]] name = "soupsieve" version = "2.8" @@ -2914,6 +3586,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "tblib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/8a/14c15ae154895cc131174f858c707790d416c444fc69f93918adfd8c4c0b/tblib-3.2.2.tar.gz", hash = "sha256:e9a652692d91bf4f743d4a15bc174c0b76afc750fe8c7b6d195cc1c1d6d2ccec", size = 35046, upload-time = "2025-11-12T12:21:16.572Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/be/5d2d47b1fb58943194fb59dcf222f7c4e35122ec0ffe8c36e18b5d728f0b/tblib-3.2.2-py3-none-any.whl", hash = "sha256:26bdccf339bcce6a88b2b5432c988b266ebbe63a4e593f6b578b1d2e723d2b76", size = 12893, upload-time = "2025-11-12T12:21:14.407Z" }, +] + [[package]] name = "terminado" version = "0.18.1" @@ -2940,6 +3630,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, ] +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, +] + [[package]] name = "toolz" version = "1.1.0" @@ -3016,6 +3715,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" }, ] +[[package]] +name = "ujson" +version = "5.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/d9/3f17e3c5773fb4941c68d9a37a47b1a79c9649d6c56aefbed87cc409d18a/ujson-5.11.0.tar.gz", hash = "sha256:e204ae6f909f099ba6b6b942131cee359ddda2b6e4ea39c12eb8b991fe2010e0", size = 7156583, upload-time = "2025-08-20T11:57:02.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/ec/2de9dd371d52c377abc05d2b725645326c4562fc87296a8907c7bcdf2db7/ujson-5.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:109f59885041b14ee9569bf0bb3f98579c3fa0652317b355669939e5fc5ede53", size = 55435, upload-time = "2025-08-20T11:55:50.243Z" }, + { url = "https://files.pythonhosted.org/packages/5b/a4/f611f816eac3a581d8a4372f6967c3ed41eddbae4008d1d77f223f1a4e0a/ujson-5.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a31c6b8004438e8c20fc55ac1c0e07dad42941db24176fe9acf2815971f8e752", size = 53193, upload-time = "2025-08-20T11:55:51.373Z" }, + { url = "https://files.pythonhosted.org/packages/e9/c5/c161940967184de96f5cbbbcce45b562a4bf851d60f4c677704b1770136d/ujson-5.11.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78c684fb21255b9b90320ba7e199780f653e03f6c2528663768965f4126a5b50", size = 57603, upload-time = "2025-08-20T11:55:52.583Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d6/c7b2444238f5b2e2d0e3dab300b9ddc3606e4b1f0e4bed5a48157cebc792/ujson-5.11.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:4c9f5d6a27d035dd90a146f7761c2272cf7103de5127c9ab9c4cd39ea61e878a", size = 59794, upload-time = "2025-08-20T11:55:53.69Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a3/292551f936d3d02d9af148f53e1bc04306b00a7cf1fcbb86fa0d1c887242/ujson-5.11.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:837da4d27fed5fdc1b630bd18f519744b23a0b5ada1bbde1a36ba463f2900c03", size = 57363, upload-time = "2025-08-20T11:55:54.843Z" }, + { url = "https://files.pythonhosted.org/packages/90/a6/82cfa70448831b1a9e73f882225980b5c689bf539ec6400b31656a60ea46/ujson-5.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:787aff4a84da301b7f3bac09bc696e2e5670df829c6f8ecf39916b4e7e24e701", size = 1036311, upload-time = "2025-08-20T11:55:56.197Z" }, + { url = "https://files.pythonhosted.org/packages/84/5c/96e2266be50f21e9b27acaee8ca8f23ea0b85cb998c33d4f53147687839b/ujson-5.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6dd703c3e86dc6f7044c5ac0b3ae079ed96bf297974598116aa5fb7f655c3a60", size = 1195783, upload-time = "2025-08-20T11:55:58.081Z" }, + { url = "https://files.pythonhosted.org/packages/8d/20/78abe3d808cf3bb3e76f71fca46cd208317bf461c905d79f0d26b9df20f1/ujson-5.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3772e4fe6b0c1e025ba3c50841a0ca4786825a4894c8411bf8d3afe3a8061328", size = 1088822, upload-time = "2025-08-20T11:55:59.469Z" }, + { url = "https://files.pythonhosted.org/packages/d8/50/8856e24bec5e2fc7f775d867aeb7a3f137359356200ac44658f1f2c834b2/ujson-5.11.0-cp313-cp313-win32.whl", hash = "sha256:8fa2af7c1459204b7a42e98263b069bd535ea0cd978b4d6982f35af5a04a4241", size = 39753, upload-time = "2025-08-20T11:56:01.345Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d8/1baee0f4179a4d0f5ce086832147b6cc9b7731c24ca08e14a3fdb8d39c32/ujson-5.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:34032aeca4510a7c7102bd5933f59a37f63891f30a0706fb46487ab6f0edf8f0", size = 43866, upload-time = "2025-08-20T11:56:02.552Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8c/6d85ef5be82c6d66adced3ec5ef23353ed710a11f70b0b6a836878396334/ujson-5.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:ce076f2df2e1aa62b685086fbad67f2b1d3048369664b4cdccc50707325401f9", size = 38363, upload-time = "2025-08-20T11:56:03.688Z" }, + { url = "https://files.pythonhosted.org/packages/28/08/4518146f4984d112764b1dfa6fb7bad691c44a401adadaa5e23ccd930053/ujson-5.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:65724738c73645db88f70ba1f2e6fb678f913281804d5da2fd02c8c5839af302", size = 55462, upload-time = "2025-08-20T11:56:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/29/37/2107b9a62168867a692654d8766b81bd2fd1e1ba13e2ec90555861e02b0c/ujson-5.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29113c003ca33ab71b1b480bde952fbab2a0b6b03a4ee4c3d71687cdcbd1a29d", size = 53246, upload-time = "2025-08-20T11:56:06.054Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f8/25583c70f83788edbe3ca62ce6c1b79eff465d78dec5eb2b2b56b3e98b33/ujson-5.11.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c44c703842024d796b4c78542a6fcd5c3cb948b9fc2a73ee65b9c86a22ee3638", size = 57631, upload-time = "2025-08-20T11:56:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ca/19b3a632933a09d696f10dc1b0dfa1d692e65ad507d12340116ce4f67967/ujson-5.11.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:e750c436fb90edf85585f5c62a35b35082502383840962c6983403d1bd96a02c", size = 59877, upload-time = "2025-08-20T11:56:08.534Z" }, + { url = "https://files.pythonhosted.org/packages/55/7a/4572af5324ad4b2bfdd2321e898a527050290147b4ea337a79a0e4e87ec7/ujson-5.11.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f278b31a7c52eb0947b2db55a5133fbc46b6f0ef49972cd1a80843b72e135aba", size = 57363, upload-time = "2025-08-20T11:56:09.758Z" }, + { url = "https://files.pythonhosted.org/packages/7b/71/a2b8c19cf4e1efe53cf439cdf7198ac60ae15471d2f1040b490c1f0f831f/ujson-5.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab2cb8351d976e788669c8281465d44d4e94413718af497b4e7342d7b2f78018", size = 1036394, upload-time = "2025-08-20T11:56:11.168Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3e/7b98668cba3bb3735929c31b999b374ebc02c19dfa98dfebaeeb5c8597ca/ujson-5.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:090b4d11b380ae25453100b722d0609d5051ffe98f80ec52853ccf8249dfd840", size = 1195837, upload-time = "2025-08-20T11:56:12.6Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ea/8870f208c20b43571a5c409ebb2fe9b9dba5f494e9e60f9314ac01ea8f78/ujson-5.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:80017e870d882d5517d28995b62e4e518a894f932f1e242cbc802a2fd64d365c", size = 1088837, upload-time = "2025-08-20T11:56:14.15Z" }, + { url = "https://files.pythonhosted.org/packages/63/b6/c0e6607e37fa47929920a685a968c6b990a802dec65e9c5181e97845985d/ujson-5.11.0-cp314-cp314-win32.whl", hash = "sha256:1d663b96eb34c93392e9caae19c099ec4133ba21654b081956613327f0e973ac", size = 41022, upload-time = "2025-08-20T11:56:15.509Z" }, + { url = "https://files.pythonhosted.org/packages/4e/56/f4fe86b4c9000affd63e9219e59b222dc48b01c534533093e798bf617a7e/ujson-5.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:849e65b696f0d242833f1df4182096cedc50d414215d1371fca85c541fbff629", size = 45111, upload-time = "2025-08-20T11:56:16.597Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f3/669437f0280308db4783b12a6d88c00730b394327d8334cc7a32ef218e64/ujson-5.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:e73df8648c9470af2b6a6bf5250d4744ad2cf3d774dcf8c6e31f018bdd04d764", size = 39682, upload-time = "2025-08-20T11:56:17.763Z" }, + { url = "https://files.pythonhosted.org/packages/6e/cd/e9809b064a89fe5c4184649adeb13c1b98652db3f8518980b04227358574/ujson-5.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:de6e88f62796372fba1de973c11138f197d3e0e1d80bcb2b8aae1e826096d433", size = 55759, upload-time = "2025-08-20T11:56:18.882Z" }, + { url = "https://files.pythonhosted.org/packages/1b/be/ae26a6321179ebbb3a2e2685b9007c71bcda41ad7a77bbbe164005e956fc/ujson-5.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e56ef8066f11b80d620985ae36869a3ff7e4b74c3b6129182ec5d1df0255f3", size = 53634, upload-time = "2025-08-20T11:56:20.012Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/fb4a220ee6939db099f4cfeeae796ecb91e7584ad4d445d4ca7f994a9135/ujson-5.11.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a325fd2c3a056cf6c8e023f74a0c478dd282a93141356ae7f16d5309f5ff823", size = 58547, upload-time = "2025-08-20T11:56:21.175Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f8/fc4b952b8f5fea09ea3397a0bd0ad019e474b204cabcb947cead5d4d1ffc/ujson-5.11.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:a0af6574fc1d9d53f4ff371f58c96673e6d988ed2b5bf666a6143c782fa007e9", size = 60489, upload-time = "2025-08-20T11:56:22.342Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e5/af5491dfda4f8b77e24cf3da68ee0d1552f99a13e5c622f4cef1380925c3/ujson-5.11.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10f29e71ecf4ecd93a6610bd8efa8e7b6467454a363c3d6416db65de883eb076", size = 58035, upload-time = "2025-08-20T11:56:23.92Z" }, + { url = "https://files.pythonhosted.org/packages/c4/09/0945349dd41f25cc8c38d78ace49f14c5052c5bbb7257d2f466fa7bdb533/ujson-5.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a0a9b76a89827a592656fe12e000cf4f12da9692f51a841a4a07aa4c7ecc41c", size = 1037212, upload-time = "2025-08-20T11:56:25.274Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/8e04496acb3d5a1cbee3a54828d9652f67a37523efa3d3b18a347339680a/ujson-5.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b16930f6a0753cdc7d637b33b4e8f10d5e351e1fb83872ba6375f1e87be39746", size = 1196500, upload-time = "2025-08-20T11:56:27.517Z" }, + { url = "https://files.pythonhosted.org/packages/64/ae/4bc825860d679a0f208a19af2f39206dfd804ace2403330fdc3170334a2f/ujson-5.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:04c41afc195fd477a59db3a84d5b83a871bd648ef371cf8c6f43072d89144eef", size = 1089487, upload-time = "2025-08-20T11:56:29.07Z" }, + { url = "https://files.pythonhosted.org/packages/30/ed/5a057199fb0a5deabe0957073a1c1c1c02a3e99476cd03daee98ea21fa57/ujson-5.11.0-cp314-cp314t-win32.whl", hash = "sha256:aa6d7a5e09217ff93234e050e3e380da62b084e26b9f2e277d2606406a2fc2e5", size = 41859, upload-time = "2025-08-20T11:56:30.495Z" }, + { url = "https://files.pythonhosted.org/packages/aa/03/b19c6176bdf1dc13ed84b886e99677a52764861b6cc023d5e7b6ebda249d/ujson-5.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:48055e1061c1bb1f79e75b4ac39e821f3f35a9b82de17fce92c3140149009bec", size = 46183, upload-time = "2025-08-20T11:56:31.574Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ca/a0413a3874b2dc1708b8796ca895bf363292f9c70b2e8ca482b7dbc0259d/ujson-5.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1194b943e951092db611011cb8dbdb6cf94a3b816ed07906e14d3bc6ce0e90ab", size = 40264, upload-time = "2025-08-20T11:56:32.773Z" }, +] + +[[package]] +name = "universal-pathlib" +version = "0.3.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec" }, + { name = "pathlib-abc" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/96/b58b00ce27cbc37fd3c79944438dd8630d2c39f9467c9e73e1a4a3eec1ef/universal_pathlib-0.3.7.tar.gz", hash = "sha256:36331056fa59a7d7cd3b61b4045f3a3418f446f23ec1a01d281c4510814b4b05", size = 253466, upload-time = "2025-12-03T00:06:43.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/77/53c2d3a0413bc55b4c91067a0c41e55451be9b0784d204e4e46ce5abf668/universal_pathlib-0.3.7-py3-none-any.whl", hash = "sha256:fb95117b20b5981f86ef9d887fddbf9c61d3596634ba42cccea444931d87c201", size = 80738, upload-time = "2025-12-03T00:06:41.997Z" }, +] + [[package]] name = "uri-template" version = "1.3.0" @@ -3034,6 +3787,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] +[[package]] +name = "virtualizarr" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numcodecs" }, + { name = "numpy" }, + { name = "obstore" }, + { name = "packaging" }, + { name = "ujson" }, + { name = "universal-pathlib" }, + { name = "xarray" }, + { name = "zarr" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/dc/e595e489335bc0634e26f61daf551f46465db8d1e3e69301a0d1b9ec8a63/virtualizarr-2.2.1.tar.gz", hash = "sha256:f8d837027e80576a8f4240bed3d4d714522f3e0a8bce6ec3d61fa2098d93c3da", size = 227398, upload-time = "2025-11-18T00:07:00.228Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/69/8ff1cbb8dd7c8774aea22189b0c8537882c1fa7935c77b720cde57ca5e48/virtualizarr-2.2.1-py3-none-any.whl", hash = "sha256:e8d5f0f7259f22e6bc88e4a0fbb517bc6aac9a10d0799899ff2b1a570fd848f6", size = 199760, upload-time = "2025-11-18T00:06:58.395Z" }, +] + [[package]] name = "wcwidth" version = "0.2.14" @@ -3070,6 +3842,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, ] +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, +] + [[package]] name = "widgetsnbextension" version = "4.0.14" @@ -3079,6 +3860,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503, upload-time = "2025-04-10T13:01:23.086Z" }, ] +[[package]] +name = "wrapt" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/fe/41af4c46b5e498c90fc87981ab2972fbd9f0bccda597adb99d3d3441b94b/wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9", size = 78132, upload-time = "2025-11-07T00:44:04.628Z" }, + { url = "https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f", size = 61211, upload-time = "2025-11-07T00:44:05.626Z" }, + { url = "https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218", size = 61689, upload-time = "2025-11-07T00:44:06.719Z" }, + { url = "https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9", size = 121502, upload-time = "2025-11-07T00:44:09.557Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c", size = 123110, upload-time = "2025-11-07T00:44:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/e5/08/cdbb965fbe4c02c5233d185d070cabed2ecc1f1e47662854f95d77613f57/wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db", size = 117434, upload-time = "2025-11-07T00:44:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/6aae2ce39db4cb5216302fa2e9577ad74424dfbe315bd6669725569e048c/wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233", size = 121533, upload-time = "2025-11-07T00:44:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/565abf57559fbe0a9155c29879ff43ce8bd28d2ca61033a3a3dd67b70794/wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2", size = 116324, upload-time = "2025-11-07T00:44:13.28Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e0/53ff5e76587822ee33e560ad55876d858e384158272cd9947abdd4ad42ca/wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b", size = 120627, upload-time = "2025-11-07T00:44:14.431Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7b/38df30fd629fbd7612c407643c63e80e1c60bcc982e30ceeae163a9800e7/wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7", size = 58252, upload-time = "2025-11-07T00:44:17.814Z" }, + { url = "https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3", size = 60500, upload-time = "2025-11-07T00:44:15.561Z" }, + { url = "https://files.pythonhosted.org/packages/89/4e/3c8b99ac93527cfab7f116089db120fef16aac96e5f6cdb724ddf286086d/wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8", size = 58993, upload-time = "2025-11-07T00:44:16.65Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f4/eff2b7d711cae20d220780b9300faa05558660afb93f2ff5db61fe725b9a/wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3", size = 82028, upload-time = "2025-11-07T00:44:18.944Z" }, + { url = "https://files.pythonhosted.org/packages/0c/67/cb945563f66fd0f61a999339460d950f4735c69f18f0a87ca586319b1778/wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1", size = 62949, upload-time = "2025-11-07T00:44:20.074Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ca/f63e177f0bbe1e5cf5e8d9b74a286537cd709724384ff20860f8f6065904/wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d", size = 63681, upload-time = "2025-11-07T00:44:21.345Z" }, + { url = "https://files.pythonhosted.org/packages/39/a1/1b88fcd21fd835dca48b556daef750952e917a2794fa20c025489e2e1f0f/wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7", size = 152696, upload-time = "2025-11-07T00:44:24.318Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/d9185500c1960d9f5f77b9c0b890b7fc62282b53af7ad1b6bd779157f714/wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3", size = 158859, upload-time = "2025-11-07T00:44:25.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/60/5d796ed0f481ec003220c7878a1d6894652efe089853a208ea0838c13086/wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b", size = 146068, upload-time = "2025-11-07T00:44:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/04/f8/75282dd72f102ddbfba137e1e15ecba47b40acff32c08ae97edbf53f469e/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10", size = 155724, upload-time = "2025-11-07T00:44:26.634Z" }, + { url = "https://files.pythonhosted.org/packages/5a/27/fe39c51d1b344caebb4a6a9372157bdb8d25b194b3561b52c8ffc40ac7d1/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf", size = 144413, upload-time = "2025-11-07T00:44:27.939Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/9f6b643fe39d4505c7bf926d7c2595b7cb4b607c8c6b500e56c6b36ac238/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e", size = 150325, upload-time = "2025-11-07T00:44:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/bb/b6/20ffcf2558596a7f58a2e69c89597128781f0b88e124bf5a4cadc05b8139/wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c", size = 59943, upload-time = "2025-11-07T00:44:33.211Z" }, + { url = "https://files.pythonhosted.org/packages/87/6a/0e56111cbb3320151eed5d3821ee1373be13e05b376ea0870711f18810c3/wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92", size = 63240, upload-time = "2025-11-07T00:44:30.935Z" }, + { url = "https://files.pythonhosted.org/packages/1d/54/5ab4c53ea1f7f7e5c3e7c1095db92932cc32fd62359d285486d00c2884c3/wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f", size = 60416, upload-time = "2025-11-07T00:44:32.002Z" }, + { url = "https://files.pythonhosted.org/packages/73/81/d08d83c102709258e7730d3cd25befd114c60e43ef3891d7e6877971c514/wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1", size = 78290, upload-time = "2025-11-07T00:44:34.691Z" }, + { url = "https://files.pythonhosted.org/packages/f6/14/393afba2abb65677f313aa680ff0981e829626fed39b6a7e3ec807487790/wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55", size = 61255, upload-time = "2025-11-07T00:44:35.762Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/a4a1f2fba205a9462e36e708ba37e5ac95f4987a0f1f8fd23f0bf1fc3b0f/wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0", size = 61797, upload-time = "2025-11-07T00:44:37.22Z" }, + { url = "https://files.pythonhosted.org/packages/12/db/99ba5c37cf1c4fad35349174f1e38bd8d992340afc1ff27f526729b98986/wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509", size = 120470, upload-time = "2025-11-07T00:44:39.425Z" }, + { url = "https://files.pythonhosted.org/packages/30/3f/a1c8d2411eb826d695fc3395a431757331582907a0ec59afce8fe8712473/wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1", size = 122851, upload-time = "2025-11-07T00:44:40.582Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/72c74a63f201768d6a04a8845c7976f86be6f5ff4d74996c272cefc8dafc/wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970", size = 117433, upload-time = "2025-11-07T00:44:38.313Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5a/df37cf4042cb13b08256f8e27023e2f9b3d471d553376616591bb99bcb31/wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c", size = 121280, upload-time = "2025-11-07T00:44:41.69Z" }, + { url = "https://files.pythonhosted.org/packages/54/34/40d6bc89349f9931e1186ceb3e5fbd61d307fef814f09fbbac98ada6a0c8/wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41", size = 116343, upload-time = "2025-11-07T00:44:43.013Z" }, + { url = "https://files.pythonhosted.org/packages/70/66/81c3461adece09d20781dee17c2366fdf0cb8754738b521d221ca056d596/wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed", size = 119650, upload-time = "2025-11-07T00:44:44.523Z" }, + { url = "https://files.pythonhosted.org/packages/46/3a/d0146db8be8761a9e388cc9cc1c312b36d583950ec91696f19bbbb44af5a/wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0", size = 58701, upload-time = "2025-11-07T00:44:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/1a/38/5359da9af7d64554be63e9046164bd4d8ff289a2dd365677d25ba3342c08/wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c", size = 60947, upload-time = "2025-11-07T00:44:46.086Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3f/96db0619276a833842bf36343685fa04f987dd6e3037f314531a1e00492b/wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e", size = 59359, upload-time = "2025-11-07T00:44:47.164Z" }, + { url = "https://files.pythonhosted.org/packages/71/49/5f5d1e867bf2064bf3933bc6cf36ade23505f3902390e175e392173d36a2/wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b", size = 82031, upload-time = "2025-11-07T00:44:49.4Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/0009a218d88db66ceb83921e5685e820e2c61b59bbbb1324ba65342668bc/wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec", size = 62952, upload-time = "2025-11-07T00:44:50.74Z" }, + { url = "https://files.pythonhosted.org/packages/ae/18/9b968e920dd05d6e44bcc918a046d02afea0fb31b2f1c80ee4020f377cbe/wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa", size = 63688, upload-time = "2025-11-07T00:44:52.248Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7d/78bdcb75826725885d9ea26c49a03071b10c4c92da93edda612910f150e4/wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815", size = 152706, upload-time = "2025-11-07T00:44:54.613Z" }, + { url = "https://files.pythonhosted.org/packages/dd/77/cac1d46f47d32084a703df0d2d29d47e7eb2a7d19fa5cbca0e529ef57659/wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa", size = 158866, upload-time = "2025-11-07T00:44:55.79Z" }, + { url = "https://files.pythonhosted.org/packages/8a/11/b521406daa2421508903bf8d5e8b929216ec2af04839db31c0a2c525eee0/wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef", size = 146148, upload-time = "2025-11-07T00:44:53.388Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c0/340b272bed297baa7c9ce0c98ef7017d9c035a17a6a71dce3184b8382da2/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747", size = 155737, upload-time = "2025-11-07T00:44:56.971Z" }, + { url = "https://files.pythonhosted.org/packages/f3/93/bfcb1fb2bdf186e9c2883a4d1ab45ab099c79cbf8f4e70ea453811fa3ea7/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f", size = 144451, upload-time = "2025-11-07T00:44:58.515Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6b/dca504fb18d971139d232652656180e3bd57120e1193d9a5899c3c0b7cdd/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349", size = 150353, upload-time = "2025-11-07T00:44:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f6/a1de4bd3653afdf91d250ca5c721ee51195df2b61a4603d4b373aa804d1d/wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c", size = 60609, upload-time = "2025-11-07T00:45:03.315Z" }, + { url = "https://files.pythonhosted.org/packages/01/3a/07cd60a9d26fe73efead61c7830af975dfdba8537632d410462672e4432b/wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395", size = 64038, upload-time = "2025-11-07T00:45:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/99/8a06b8e17dddbf321325ae4eb12465804120f699cd1b8a355718300c62da/wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad", size = 60634, upload-time = "2025-11-07T00:45:02.087Z" }, + { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" }, +] + [[package]] name = "xarray" version = "2025.10.1" @@ -3179,3 +4017,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, ] + +[[package]] +name = "zarr" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "donfig" }, + { name = "google-crc32c" }, + { name = "numcodecs" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/76/7fa87f57c112c7b9c82f0a730f8b6f333e792574812872e2cd45ab604199/zarr-3.1.5.tar.gz", hash = "sha256:fbe0c79675a40c996de7ca08e80a1c0a20537bd4a9f43418b6d101395c0bba2b", size = 366825, upload-time = "2025-11-21T14:06:01.492Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/15/bb13b4913ef95ad5448490821eee4671d0e67673342e4d4070854e5fe081/zarr-3.1.5-py3-none-any.whl", hash = "sha256:29cd905afb6235b94c09decda4258c888fcb79bb6c862ef7c0b8fe009b5c8563", size = 284067, upload-time = "2025-11-21T14:05:59.235Z" }, +] + +[[package]] +name = "zict" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/ac/3c494dd7ec5122cff8252c1a209b282c0867af029f805ae9befd73ae37eb/zict-3.0.0.tar.gz", hash = "sha256:e321e263b6a97aafc0790c3cfb3c04656b7066e6738c37fffcca95d803c9fba5", size = 33238, upload-time = "2023-04-17T21:41:16.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl", hash = "sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae", size = 43332, upload-time = "2023-04-17T21:41:13.444Z" }, +] diff --git a/virtualize_with_lithops.py b/virtualize_with_lithops.py new file mode 100644 index 0000000..71c3eed --- /dev/null +++ b/virtualize_with_lithops.py @@ -0,0 +1,240 @@ +import lithops +import icechunk +import ismip6_helper +import obstore +import xarray as xr +import json +from datetime import datetime, timezone + +from virtualizarr import open_virtual_dataset +from virtualizarr.parsers import HDFParser +from virtualizarr.registry import ObjectStoreRegistry +from virtualizarr.writers.icechunk import virtual_dataset_to_icechunk + +import zarr + +def virtualize_file(row: dict): + """Virtualize a single file. Executed as a serverless function. + + Returns: + dict with 'path', 'dataset', and 'url' keys + """ + parser = HDFParser() + bucket = "gs://ismip6" + store = obstore.store.from_url(bucket, skip_signature=True) + registry = ObjectStoreRegistry({bucket: store}) + + path = f'{row["institution"]}_{row["model_name"]}/{row["experiment"]}/{row["variable"]}' # DataTree path + + vds = open_virtual_dataset( + url=row["url"], + parser=parser, + registry=registry, + loadable_variables=['time', 'x', 'y', 'lat', 'lon', 'latitude', 'longitude'], + decode_times=False + ) + vds_fix_time = ismip6_helper.fix_time_encoding(vds) + print(row) + vds_fix_coords = ismip6_helper.correct_grid_coordinates(vds_fix_time, row["variable"]) + + return { + "success": True, + "path": path, + "dataset": vds_fix_coords, + "url": row["url"] + } + +def open_or_create_repo() -> icechunk.Repository: + # Setup Icechunk config + config = icechunk.RepositoryConfig.default() + config.set_virtual_chunk_container( + icechunk.VirtualChunkContainer( + "gs://ismip6/", + store=icechunk.gcs_store() + ) + ) + + # Use None for anonymous/public access to source data + credentials = icechunk.containers_credentials({ + "gs://ismip6/": None + }) + + icechunk_storage = icechunk.gcs_storage(bucket="ismip6-icechunk", prefix="12-07-2025", from_env=True) + + return icechunk.Repository.open_or_create(icechunk_storage, config=config, authorize_virtual_chunk_access=credentials) + +def write_batch_to_icechunk(batch_results: list): + """Write a batch of virtual datasets to Icechunk in a single commit. + + Args: + batch_results: List of dicts with 'path', 'dataset', and 'url' keys + + Returns: + dict with commit_id and list of written paths + """ + repo = open_or_create_repo() + session = repo.writable_session("main") + + # Write all datasets in the batch + written_paths = [] + for result in batch_results: + virtual_dataset_to_icechunk(result["dataset"], session.store, group=result["path"]) + written_paths.append(result["path"]) + + # Single commit for the entire batch + commit_msg = f"Added {len(written_paths)} datasets: {', '.join(written_paths)}" + commit_id = session.commit(commit_msg) + + return { + "commit_id": commit_id, + "paths": written_paths, + "count": len(written_paths) + } + +def safe_virtualize_file(row): + """Wrapper around virtualize_file with error handling.""" + try: + return virtualize_file(row) + except Exception as e: + return { + "success": False, + "error": str(e), + "url": row["url"] + } + +def write_failures_to_bucket(failed_results: list): + """Write failed results to the bucket immediately. + + Args: + failed_results: List of dicts with failure information + """ + if not failed_results: + return + + failure_log_bucket = "gs://ismip6-icechunk" + failure_log_path = f"failures/virtualization_failures_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json" + + try: + failure_store = obstore.store.from_url(failure_log_bucket) + failure_data = json.dumps(failed_results, indent=2).encode('utf-8') + failure_store.put(failure_log_path, failure_data) + print(f" ✓ Logged {len(failed_results)} failures to {failure_log_bucket}/{failure_log_path}") + except Exception as e: + print(f" ✗ Failed to log failures to bucket: {e}") + print(" Failed results:") + print(json.dumps(failed_results, indent=2)) + + +def process_all_files(): + """Process all files using Lithops serverless executor. + + Strategy: + 1. Build file index and group by model and experiment + 2. For each group (batch): + - Parallelize virtualization using Lithops + - Write all successful virtualizations to Icechunk in one commit + 3. Process batches sequentially to avoid Icechunk conflicts + """ + import warnings + # Silence the specific Zarr warning + warnings.filterwarnings('ignore', module='zarr') + + # Step 1: Build file index + print("Step 1/3: Building file index...") + files_df = ismip6_helper.build_file_index() + print(f"Step 1/3 Complete: Built file index with {len(files_df)} files!") + + # Step 2: Group by model and experiment + print("\nStep 2/3: Grouping files by model and experiment...") + grouped = files_df.groupby(['institution', 'model_name', 'experiment']) + # skip groups already in the zarr store + repo = open_or_create_repo() + session = repo.readonly_session(branch="main") + root = zarr.open(session.store, mode='r') + batches = [ + (name, group.to_dict('records')) + for name, group in grouped + if f"{name[0]}_{name[1]}/{name[2]}" not in root + ] + print(f"Step 2/3 Complete: Created {len(batches)} batches") + + # Initialize Lithops executor + fexec = lithops.FunctionExecutor(config_file='lithops.yaml') + + # Step 3: Process each batch sequentially + print("\nStep 3/3: Processing batches...") + total_successful = 0 + total_failed = 0 + + for batch_idx, ((_, model_name, experiment), batch_files) in enumerate(batches, 1): + print(f"\n{'='*80}") + print(f"Batch {batch_idx}/{len(batches)}: {model_name} / {experiment}") + print(f"Files in batch: {len(batch_files)}") + print(f"{'='*80}") + + # Parallelize virtualization for this batch + print(f" Virtualizing {len(batch_files)} files in parallel...") + batch_files_as_row = [{'row': file} for file in batch_files] + futures = fexec.map(safe_virtualize_file, batch_files_as_row) + virtualization_results = fexec.get_result(futures) + + # Separate successful and failed virtualizations + successful_vds = [r for r in virtualization_results if r.get("success")] + failed_vds = [r for r in virtualization_results if not r.get("success")] + + print(f" ✓ Virtualized: {len(successful_vds)}/{len(batch_files)}") + if failed_vds: + print(f" ✗ Failed virtualization: {len(failed_vds)}") + + # Write successful virtualizations to Icechunk + if successful_vds: + try: + print(f" Writing {len(successful_vds)} datasets to Icechunk...") + write_result = write_batch_to_icechunk(successful_vds) + print(f" ✓ Committed {write_result['count']} datasets") + print(f" Commit ID: {write_result['commit_id']}") + total_successful += len(successful_vds) + except Exception as e: + print(f" ✗ Failed to write batch to Icechunk: {e}") + # Treat all successful virtualizations as failed if write fails + for result in successful_vds: + failed_vds.append({ + "success": False, + "url": result["url"], + "error": f"Icechunk write failed: {str(e)}", + "timestamp": datetime.now(timezone.utc).isoformat() + }) + + # Write failures immediately if any occurred + if failed_vds: + batch_failures = [ + { + **result, + "model_name": model_name, + "experiment": experiment, + "timestamp": datetime.now(timezone.utc).isoformat() + } + for result in failed_vds + ] + write_failures_to_bucket(batch_failures) + total_failed += len(failed_vds) + + # Clean up Lithops executor + fexec.clean() + + print(f"\n{'='*80}") + print(f"Step 3/3 Complete!") + print(f"Total successful: {total_successful}") + print(f"Total failed: {total_failed}") + print(f"{'='*80}") + + return { + "total_files": len(files_df), + "total_batches": len(batches), + "successful": total_successful, + "failed": total_failed + } + +if __name__ == "__main__": + result = process_all_files() + print(f"Processing complete: {result}") diff --git a/virtualize_with_lithops_combine_variables.py b/virtualize_with_lithops_combine_variables.py new file mode 100644 index 0000000..1a3b8ab --- /dev/null +++ b/virtualize_with_lithops_combine_variables.py @@ -0,0 +1,283 @@ +import lithops +import icechunk +import ismip6_helper +import obstore +import xarray as xr +import json +from datetime import datetime, timezone + +from virtualizarr import open_virtual_dataset +from virtualizarr.parsers import HDFParser, NetCDF3Parser +from virtualizarr.registry import ObjectStoreRegistry +from virtualizarr.writers.icechunk import virtual_dataset_to_icechunk + +import zarr +from typing import Dict, Tuple, Any, List, Union + +def _parse_variable_from_url(url:str) -> str: + return url.split('/')[-1].split('_')[0] + +def write_vds_to_icechunk(vds: xr.Dataset, path:str): + try: + repo = open_or_create_repo() + session = repo.writable_session("main") + vds.vz.to_icechunk(session.store, group=path) + commit_msg = f"Added {path}" + # retries rebase until successful (https://icechunk.io/en/stable/howto/#commit-with-automatic-rebasing) + commit_id = session.commit(commit_msg, rebase_with=icechunk.ConflictDetector()) + + return { + "success": True, + "commit_id": commit_id, + "path": path, + "repo": repo, + } + except Exception as e: + return { + "success": False, + "error": str(e), + "path": path, + "repo": repo + } + +def virtualize_and_combine_batch(urls: List[str], parser: Union[HDFParser, NetCDF3Parser], registry: ObjectStoreRegistry) -> Dict[str, Any]: + # Take a batch of datasets that belong to a single simulation (same model + experiment) and merge them into + # a single virtual dataset + + # create virtual datasets (can we speed this up in parallel if we group them? Not a prio right now) + loadable_variables = ['time', 'x', 'y', 'lat', 'lon', 'latitude', 'longitude', 'nv4', 'lon_bnds', 'lat_bnds'] + + try: + + # virtualize and append all needed metadata (for now just the variable) + vdatasets = [] + for url in urls: + vds_var = open_virtual_dataset( + url=url, + parser=parser, + registry=registry, + loadable_variables=loadable_variables, + decode_times=False + ) + # appy ismip specific fixer functions + vds_var_fixed_time = ismip6_helper.fix_time_encoding(vds_var) + vds_var_fixed_grid = ismip6_helper.correct_grid_coordinates(vds_var_fixed_time, _parse_variable_from_url(url)) + + # # move all coordinates out of data variables + # # TODO: We could set all coords except the one defined in the dataframe variable + # # Revise that if this does not solve the issue + # vds_preprocessed = vds_var_fixed_grid.set_coords( + # [co for co in loadable_variables if co in vds_var_fixed_grid.data_vars] + # ) + vds_preprocessed = vds_var_fixed_grid + # append the url to the dataset for easier debugging + vds_preprocessed.attrs['url'] = url + vdatasets.append(vds_preprocessed) + + + vds = xr.merge(vdatasets, join='override', compat='override') + + return { + "success": True, + "dataset": vds, + "count": len(urls) + } + except Exception as e: + return { + 'success': False, + "error": str(e), + 'single_datasets': vdatasets, + 'urls': urls + } + +def batch_func(batch: Tuple[Tuple[str], List[Dict[str, Union[str, int]]]]) -> Dict[str, Any]: + """Wrapper around virtualization and writing for batch of files to icechunk""" + try: + # Virtualizing is costly, check if group exists before + repo = open_or_create_repo() + session = repo.readonly_session(branch="main") + if len(list(session.store.list_dir(batch['path']))) != 0: + raise ValueError('Group already exists') + + # virtualize and write in one go + + # There are some NetCDF3 files in the mix. + # TODO: The better way to choese the parser would be to dynamically pick it based on a head request + # But for now this should do. + # I manually confirmed that *all* files of this model fail with the same issue. + parser = NetCDF3Parser() if "SICOPOLIS1" in batch['source_id'] else HDFParser() + bucket = "gs://ismip6" + store = obstore.store.from_url(bucket, skip_signature=True) + registry = ObjectStoreRegistry({bucket: store}) + + virt_results = virtualize_and_combine_batch(batch['urls'], parser, registry) + if not virt_results['success']: + raise ValueError(f"Virtualizing failed with {virt_results['error']}") + + write_results = write_vds_to_icechunk(virt_results['dataset'], batch['path']) + if not write_results['success']: + raise ValueError(f"Writing failed with {virt_results['error']}") + return { + 'success': True, + 'batch': batch, + 'results': { + 'virtualization_results':virt_results, + 'writing_results':write_results, + }, + } + except Exception as e: + return { + "success": False, + "error": str(e), + "batch": batch + } + + +def open_or_create_repo() -> icechunk.Repository: + # Setup Icechunk config + config = icechunk.RepositoryConfig.default() + config.set_virtual_chunk_container( + icechunk.VirtualChunkContainer( + "gs://ismip6/", + store=icechunk.gcs_store() + ) + ) + + # Use None for anonymous/public access to source data + credentials = icechunk.containers_credentials({ + "gs://ismip6/": None + }) + # FOR LOCAL TESTING + # icechunk_storage = icechunk.gcs_storage(bucket="ismip6-icechunk", prefix="combined-variables-2025-12-12", from_env=True) + icechunk_storage = icechunk.local_filesystem_storage("/Users/juliusbusecke/Code/ismip-indexing/test-output/test_icechunk") + return icechunk.Repository.open_or_create(icechunk_storage, config=config, authorize_virtual_chunk_access=credentials) + + +# def write_failures_to_bucket(failed_results: list): +# """Write failed results to the bucket immediately. + +# Args: +# failed_results: List of dicts with failure information +# """ +# if not failed_results: +# return + +# failure_log_bucket = "gs://ismip6-icechunk" +# failure_log_path = f"failures/virtualization_failures_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json" + +# try: +# failure_store = obstore.store.from_url(failure_log_bucket) +# failure_data = json.dumps(failed_results, indent=2).encode('utf-8') +# failure_store.put(failure_log_path, failure_data) +# print(f" ✓ Logged {len(failed_results)} failures to {failure_log_bucket}/{failure_log_path}") +# except Exception as e: +# print(f" ✗ Failed to log failures to bucket: {e}") +# print(" Failed results:") +# print(json.dumps(failed_results, indent=2)) + + + +def process_all_files(): + """Process all files using Lithops serverless executor. + + Strategy: + 1. Build file index and group by model and experiment + 2. For each group (batch): + - Virtualize files (~20) in serial and combine into single xarray dataset + - Write virtual dataset to Icechunk in one commit (with conflict resolution) + 3. Process batches (~440) in parallel using lithops + """ + import warnings + # Silence the specific Zarr warning + warnings.filterwarnings('ignore', module='zarr') + + # Step 1: Build file index + print("Step 1/3: Building file index...") + files_df = ismip6_helper.build_file_index() + print(f"Step 1/3 Complete: Built file index with {len(files_df)} files!") + + # # For TESTING: filter a single model and experiment + # files_df = files_df[files_df['model_name'] == "MALI"] + # files_df = files_df[files_df['experiment'] == "ctrl_proj_std"] + + # Step 2: Group by model and experiment and create + print("\nStep 2/3: Grouping files by model and experiment...") + grouped = files_df.groupby(['institution', 'model_name', 'experiment']) + + # skip groups already in the zarr store + repo = open_or_create_repo() + session = repo.readonly_session(branch="main") + root = zarr.open(session.store, mode='r') + batches_raw = [ + (name, group.to_dict('records')) + for name, group in grouped + if f"{name[0]}_{name[1]}/{name[2]}" not in root + ] + batches = [] + for batch_raw in batches_raw: + # parse batch input + ((institution_id, source_id, experiment_id),batch_files) = batch_raw + urls = [bf['url'] for bf in batch_files] + path = f"{institution_id}_{source_id}/{experiment_id}" + batches.append({ + 'path': path, + 'experiment_id': experiment_id, + 'institution_id': institution_id, + 'source_id': source_id, + 'urls': urls + } + ) + + print(f"Step 2/3 Complete: Created {len(batches)} batches") + + # Initialize Lithops executor + # FOR LOCAL TESTING + config_file = '../lithops_local.yaml' + # config_file = 'lithops.yaml' + fexec = lithops.FunctionExecutor(config_file=config_file) + + # Step 3: Process each batch sequentially + print("\nStep 3/3: Processing batches...") + total_successful = 0 + total_failed = 0 + + # Parallelize virtualization for this batch + print(f" Virtualizing {len(batches)} files in parallel...") + futures = fexec.map(batch_func, [{'batch':b} for b in batches]) + virtualization_results = fexec.get_result(futures) + + # Separate successful and failed virtualizations + successful_results = [r for r in virtualization_results if r.get("success")] + failed_results = [r for r in virtualization_results if not r.get("success")] + + # Clean up Lithops executor + fexec.clean() + + return { + 'successful': successful_results, + 'failed': failed_results + } + +if __name__ == "__main__": + result = process_all_files() + + + # sort results by error type + fails_by_error = {} + for r in result['failed']: + if not r['success']: + err = r['error'] + if err in fails_by_error.keys(): + fails_by_error[err].append(r) + else: + fails_by_error[err] = [r] + + id_by_error = {} + for err, results in fails_by_error.items(): + def get_id_from_batch(result): + b = result['batch'] + return f"{b['institution_id']}_{b['source_id']}/{b['experiment_id']}" + id_by_error[err] = [get_id_from_batch(r) for r in results] + + id_by_error + print(f"Processing complete: {result}")