Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyze high-resolution spatial platforms like Slide-seq, Stereo-seq, and Visium HD. Use when working with subcellular resolution or high-density spatial data.
.claude/skills/bio-spatial-transcriptomics-spatial-multiomics/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-20 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-06 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
Reference examples tested with: Cellpose 3.0+, matplotlib 3.8+, numpy 1.26+, scanpy 1.10+, scipy 1.12+, spatialdata 0.1+, squidpy 1.3+
Before using code patterns, verify installed versions match. If versions differ:
pip show <package> then help(module.function) to check signaturesIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
"Analyze my high-resolution spatial data" → Process subcellular-resolution spatial platforms (Xenium, MERFISH, Slide-seq, Stereo-seq) including cell segmentation, binning strategies, and multi-modal integration.
spatialdata + squidpy for unified multi-platform analysis| Platform | Resolution | Spots/Beads | Coverage | |----------|------------|-------------|----------| | Visium | 55 µm | ~5,000 | Tissue-wide | | Visium HD | 2 µm | ~11M | Subcellular | | Slide-seq | 10 µm | ~100,000 | High-density | | Stereo-seq | 0.5 µm | >200M | Subcellular | | MERFISH | Single-molecule | N/A | Targeted genes |
Goal: Run standard spatial analyses (autocorrelation, neighborhood enrichment, ligand-receptor) on high-resolution spatial data.
Approach: Adjust neighbor graph density for high-resolution platforms, then apply standard Squidpy workflows.
pythonimport squidpy as sq import scanpy as sc # Load spatial data adata = sc.read_h5ad('spatial_multiomics.h5ad') # Spatial neighbors (for high-resolution, adjust n_neighs based on density) sq.gr.spatial_neighbors(adata, coord_type='generic', n_neighs=10, spatial_key='spatial') # Spatial autocorrelation (Moran's I) sq.gr.spatial_autocorr(adata, mode='moran', genes=adata.var_names[:100]) # Neighborhood enrichment analysis sq.gr.nhood_enrichment(adata, cluster_key='cell_type') sq.pl.nhood_enrichment(adata, cluster_key='cell_type') # Ligand-receptor analysis sq.gr.ligrec(adata, n_perms=100, cluster_key='cell_type')
Goal: Load and query multi-modal spatial data using the SpatialData unified representation.
Approach: Use spatialdata-io readers per platform, then access images, points, shapes, and tables through a single object with spatial queries.
pythonimport spatialdata as sd from spatialdata_io import read_visium, read_xenium # Read Visium data sdata = read_visium('visium_output/') # Read Xenium data (10x Genomics subcellular) sdata = read_xenium('xenium_output/') # Read from Zarr sdata = sd.read_zarr('experiment.zarr') # Access different elements images = sdata.images['morphology'] points = sdata.points['transcripts'] shapes = sdata.shapes['cell_boundaries'] table = sdata.tables['adata'] # Query by region from spatialdata import bounding_box_query roi = bounding_box_query(sdata, min_coordinate=[0, 0], max_coordinate=[1000, 1000], axes=['x', 'y'])
python# For high-density data, bin spots into hexagonal grids import numpy as np # Create hexagonal bins def hexbin_data(adata, gridsize=50): coords = adata.obsm['spatial'] from matplotlib.pyplot import hexbin hb = hexbin(coords[:, 0], coords[:, 1], C=None, gridsize=gridsize, reduce_C_function=np.sum) return hb # Squidpy visualization with hex binning sq.pl.spatial_scatter(adata, shape='hex', size=50, color='cluster') # Grid-based spatial neighbors for regular patterns sq.gr.spatial_neighbors(adata, coord_type='grid', n_rings=1)
Goal: Perform transcript-level and subcellular compartment analysis for single-molecule platforms.
Approach: Segment cells with Cellpose, then assign individual transcripts to cells based on mask coordinates.
python# Transcript-level analysis # Assign transcripts to compartments sq.gr.co_occurrence(adata, cluster_key='compartment', spatial_key='spatial') # Cell segmentation integration from cellpose import models model = models.Cellpose(model_type='cyto2') masks, flows, styles, diams = model.eval(image, diameter=30, channels=[0, 0]) # Map transcripts to cells def assign_transcripts_to_cells(transcripts_df, masks): x, y = transcripts_df['x'].values.astype(int), transcripts_df['y'].values.astype(int) transcripts_df['cell_id'] = masks[y, x] return transcripts_df[transcripts_df['cell_id'] > 0]
Goal: Combine spatial gene expression with histological image features for integrated analysis.
Approach: Process and segment tissue images, extract image features, then correlate with gene expression.
python# Combine spatial transcriptomics with histology sq.im.process(adata, layer='image', method='smooth', sigma=2) sq.im.segment(adata, layer='image', method='watershed', thresh=0.1) # Extract image features sq.im.calculate_image_features( adata, layer='image', features=['texture', 'summary'], key_added='img_features', n_jobs=4 ) # Correlate image features with gene expression from scipy.stats import pearsonr for gene in ['marker1', 'marker2']: r, p = pearsonr(adata.obs['img_feature'], adata[:, gene].X.flatten()) print(f'{gene}: r={r:.3f}, p={p:.3e}')
python# Visium HD produces bin files at multiple resolutions # Load 8µm binned data (recommended starting point) adata = sc.read_h5ad('visium_hd_8um.h5ad') # Downsample to 16µm if needed for initial analysis # Original 2µm data available for detailed analysis
| Metric | Visium | High-Resolution | |--------|--------|-----------------| | Genes/spot | >2000 | >500 | | UMI/spot | >5000 | >1000 | | Spatial coverage | >80% | >50% |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.