Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add cells tutorial - #168

Merged
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial
Aug 18, 2026
Merged

Add cells tutorial#168
LucaMarconato merged 9 commits into
mainfrom
add_cells_tutorial

Conversation

@timtreis

@timtreistimtreis commented Jun 4, 2026

Copy link
Copy Markdown
Member

This notebook describes the creation of the cells dataset which I hope ends up being a more biologically looking dataset that we can use for user-facing testing and small tutorials. Ideally it'd be distributed via SpatialData, if out-of-scope it'll land via Squidpy.

I'm not sure where in the documentation it'd belong, but I feel like it should be public?

timtreisand others added 5 commits May 16, 2026 15:35
Remove local cluster/home paths from cell outputs, drop the
warnings.filterwarnings cell, and untrack pixi.toml so the PR
contains only the create_cells_dataset notebook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

timtreisand others added 2 commits June 5, 2026 04:18
- Register create_cells_dataset.ipynb in the Intermediate gallery section
(fixes the RTD orphan-toctree warning under fail_on_warning)
- Add 3:2 thumbnail for the gallery card
- Localize paths in outputs, dedupe markdown, fix zarr write/read cell
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@LucaMarconato

Copy link
Copy Markdown
Member

The notebook looks very good to me, thanks! I have some comments for minor fixes, let's merge soon then.

Comments:

  • The notebook needs to be tested in spatialdata-integration-testing. If you want to give it a try please go ahead, if instead you prefer not to have to deal with spatialdata-integration-testing, we can do it at some point later (it's a Claude one-shot task once one has the pipeline running (also easy to setup)).
  • The rectangle coordinates are different from the bounding box, I'd make them the same
  • We'll implement a helper function for this at some point
    ny, nx = morph_top.sizes["y"], morph_top.sizes["x"]
    px_per_um_x = nx / (xmax - xmin)
    px_per_um_y = ny / (ymax - ymin)
    
  • typo here (extra space): Lazy, dask-backed points ( length)
  • here we'll provide as cells via SpatialData.datasets., I guess you mean either lowercase spatialdata or squidpy.
  • when talking about non-trivial transformations, I'm not sure what it is meant with the word "baked".

@LucaMarconatoLucaMarconato left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-approving

- Derive red Rectangle from shared bbox_min/bbox_max so it matches the
bounding_box crop (Luca's comment)
- Fix swallowed <Delayed> tag / stray space in dataset summary
- SpatialData.datasets -> spatialdata.datasets (correct casing)
- Replace unclear 'baked' wording with explicit rasterize phrasing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@timtreis

Copy link
Copy Markdown
MemberAuthor

Tried it but then it doesn't serve its purpose anymore because it fully covers the little tissue blob I'm targeting

image

- Preserve H&E channel names (r/g/b) on he_aligned via c_coords
- Anonymise local zarr-store paths in outputs (-> ./cells.zarr)
- Remove blanket warnings.filterwarnings and unused ski/np imports
- Correct table<->region wording (labels via region/instance, cell_id bridge to shapes)
- Revert overview rectangle to the larger context box
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timtreis for this nice notebook. I went through it's current state and it's a very valuable example that illustrates how to visualize, subset and save a xenium 3.0.0 dataset using spatialdata framework.

I downloaded the raw data needed (~38GB) and tried to run it on my linux laptop, but the kernel crashed as the OS ran out of RAM (16GB + 20GB Swap). Here are my observations:

  1. Please link the associated PR on spatialdata.
  2. The cell with imports fails with ModuleNotFoundError: No module named 'spatialdata_io'. Could we add it to the dependencies of this repo?
  3. I think this notebook it too heavy for an average user to run it locally, as it needs the user to download a large amount of raw data (~38GB) and use more than 36GB of RAM to run the notebook (my kernel crashed at the bounding-box query step). One idea is to split it into download.py, to_zarr.py, etc as has been done for other datasets in spatialdata-sandbox to save the subsetted SpatialData object to zarr. This notebook could then start by downloading that zarr from our datasets list, loading it etc. However, I am not very sure about this. @LucaMarconato what do you think here? How would this concern affect testing this notebook on spatialdata-integration-testing?

@timtreis

Copy link
Copy Markdown
MemberAuthor

I think this notebook it too heavy for an average user to run it locally,

I'm loading a very normal Xenium dataset though, it's not even that large 😅 I think typically people just run these things on their HPC and not private laptops. I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

The notebook was more to document how it was created and where it came from.

@LucaMarconato

Copy link
Copy Markdown
Member

Thanks @timtreis and @ajkswamy for the code and review!

Please link the associated PR on spatialdata.

Good point, but luckily no need anymore now that scverse/spatialdata#1149 is merged.

we'll provide as cells via SpatialData.datasets.

I changed the title to spatialdata.datasets since now we ship it also there; I kept both spatialdata.datasets and squidpy.datasets in the test description.

I generally don't think that this is a notebook a user will realistically want to run or even should run, especially since the cells dataset will be distributed via SpatialData eventually.

I agree.

One idea is to split it into download.py

Still, this is very important if we want to ensure that the notebook is tested by us via spatialdata-integration-testing and the cells datasets that we host in S3 is up-to-date (when we will bump the on-disk format). I will keep the current notebook as is, but I will add a comment that the data can also be downloaded via a download.py file available in spatialdata-sandbox (I'm adding it here giovp/spatialdata-sandbox#63). At some point we will hook it up to spatialdata-integration-testing.

@LucaMarconato

Copy link
Copy Markdown
Member

Downloaded the data via the new spatialdata-sandbox downloader. The notebook runs on my machine. I will finish reviewing and we can merge soon.

@LucaMarconato

LucaMarconato commented Aug 18, 2026

Copy link
Copy Markdown
Member

@timtreis are you fine with he_aligned and he_image having different resolutions or would you prefer them to have the same?

Currently we have:

├── Images
│ ├── 'he_aligned': DataTree[cyx] (3, 430, 540), (3, 215, 270)
│ ├── 'he_image': DataTree[cyx] (3, 423, 339), (3, 211, 169)
│ └── 'morphology_focus': DataTree[cyx] (4, 430, 540), (4, 215, 270)

Edit: ah ok it's done on purpose "Non-trivial transformations: he_image still carries its affine+translation Sequence as a lazy coordinate transformation, next to he_aligned, the same image after that transformation has been applied (rasterized) into pixel space, so both coordinate-system and rasterize/alignment code paths are represented.", great!

@LucaMarconato

Copy link
Copy Markdown
Member

Finished reviewing the notebook, looks great to me, ready to merge!

@LucaMarconato
LucaMarconato merged commit ec2143c into mainAug 18, 2026
1 check passed
@LucaMarconato
LucaMarconato deleted the add_cells_tutorial branch August 18, 2026 15:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy