Skip to main content

Code style: black

SPRM - Spatial Process & Relationship Modeling

Ted Zhang, Haoran Chen, Matt Ruffalo, and Robert F. Murphy
Ray and Stephanie Lane Computational Biology Department
School of Computer Science, Carnegie Mellon University
V2.0.3 December 23, 2025

Description

SPRM is a statistical modeling program that is used in the HuBMAP project to calculate a range of metrics, descriptors/features and models from multichannel tissue images. It requires at a minimum a multichannel tissue image and a corresponding indexed image containing cell segmentations. The metrics measure the quality of the provided images and the quality of the provided cell segmentation. The descriptors are used for clustering of cells using various approaches and are saved for use in comparison with other tissue images and for content-based image search.

SPRM can be used standalone with any type of multichannel 2D or 3D image (e.g., CODEX, IMC) for which a cell segmentation is available.

Inputs

Primary: Two OMETIFF files -

  1. a 3D or 4D multichannel intensity Image (2D or 3D for multiple channels)
  2. a corresponding 3D or 4D Indexed Image containing one channel for each component of cell segmentation (“cells”, “nucleus”, “cell membrane” and “nuclear membrane”).

Execution

The modular API allows you to run individual components of SPRM independently.

Module Structure

SPRM is organized into 7 modules:

  1. Preprocessing (Required) - Load images, extract ROIs, quality control
  2. Segmentation Evaluation (Optional) - Assess segmentation quality
  3. Shape Analysis (Optional) - Extract cell shape features
  4. Spatial Graphs (Cell Neighborhood Graphs) (Optional) - Compute spatial relationships
  5. Image Analysis (Pixel Level Analysis) (Optional) - NMF, superpixels, channel PCA
  6. Cell Features (Required for clustering) - Intensity & texture features
  7. Clustering (Analysis) - Multiple clustering methods

Dependency Graph

Preprocessing (Module 1) ✓ Always required
    ├─→ Segmentation Eval (Module 2) [standalone]
    ├─→ Shape Analysis (Module 3)
    ├─→ Spatial Graphs (Module 4)
    ├─→ Image Analysis (Module 5)
    └─→ Cell Features (Module 6) ✓ Required for clustering
         └─→ Clustering (Module 7)

Critical path: Preprocessing → Cell Features → Clustering
Optional branches: Modules 2, 3, 4, 5 enhance analysis but aren't required

For example,

from sprm import modules

# Run only what you need
core = modules.preprocessing.run(
    img_file="image.ome.tiff",
    mask_file="mask.ome.tiff",
    output_dir="sprm_outputs"
    options="sprm/options.txt"  # Pass path to options file
)

features = modules.cell_features.run(
    core_data=core,
    output_dir="sprm_outputs",
    compute_texture=False  # Skip texture for speed
)

clusters = modules.clustering.run(
    core_data=core,
    cell_features=features,
    output_dir="sprm_outputs"
)

Benefits:

  • Run only the analyses you need
  • Resume from checkpoints (save computation time)
  • Re-run parts with different parameters
  • Better for debugging and development

See Modular API Documentation and demo/ for more details.

Option 2: Legacy Command-Line Interface

For backward compatibility, the original CLI still works:

[python_path] SPRM.py --img-dir [img_dir_path] --mask-dir [mask_dir_path] --optional-img-dir [optional_img_dir_path] --output-dir [output_dir_path] --options-file [options_file_path] --celltype-labels [labels_file] --processes [number_of_processes_to_use]

Memory usage (--min-memory)

If you are running out of RAM, you can pass --min-memory to keep large image arrays on disk where possible (SPRM will stream planes from the OME-TIFF instead of loading the full image into memory).

[python_path] SPRM.py --img-dir [img_dir_path] --mask-dir [mask_dir_path] --output-dir [output_dir_path] --options-file [options_file_path] --processes 4 --min-memory
  • Tradeoff: lower peak RAM, but typically slower due to increased disk I/O.
  • Important limitations:
    • Image “bias” normalization for negative-valued pixels is not supported in min-memory mode (inputs should already be non-negative / normalized).
    • Segmentation evaluation metrics in min-memory mode currently require a single Z slice (i.e., effectively 2D / Z==1, and only one bestz).

Outputs

The following sets of files are placed in the folder specified by the “output_dir” argument. They are

  • OME-TIFFs showing pixel level results (remapping of channels) [3 per input image]
  • CSV containing interpolated cell outlines & polygons [2 per input image]
  • CSVs containing features for each cell [4 per image]
  • CSVs containing features for subcellular components segmentation [12 per image]
  • CSV containing clustering results for each cell (row) for different methods (column) [1 per input image]
  • CSVs containing mean values of “markers” for each cluster for each clustering method [5 per input image]
  • PNGs showing each cell colored by cluster for each clustering method [7 per input image]
  • CSV containing the signal to noise ratios of the image per channel [1 per input image]
  • CSV containing PCA and Silhouette analysis of the image [2 per input image]
  • JSON containing all features and cluster assignments

The jupyter notebook “visualizeSPRMoutput.ipynb” can be used to visualize the important results files.

Simple illustration

The demo folder contains two simple ways to run SPRM from the terminal. For both, begin by installing SPRM, either using the install script from this repo or by manually creating an environment containing it using the sprmpkg package from PyPI

bash install_sprm.sh

or

conda create -name SPRM python==3.11 -y
conda activate SPRM
conda install numba
pip install sprmpkg

Even though the PyPI name is sprmpkg, the Python import name remains sprm (i.e., load using import sprm).

Then download the demo image files from this link into the img and mask folders

bash downloaddemofiles.sh

Then you can use one of the following approaches:

  • Use the shell script run_sprm.sh which will just run SPRM using the downloaded demo image files. It will place the outputs in the folder sprm_demo_outputs and write a log of the messages from SPRM into the file sprm_demo_outputs/sprm_demo_outputs.log. You can use “visualizeSPRMoutput.ipynb” to display the important results.
  • Activate the SPRM environment (e.g., "conda activate SPRM") and then start jupyter notebook ("jupyter notebook"). Open the sprm_demo.ipynb notebook which will run SRPM on the demo files and then display the outputs in the notebook.
  • Use one of the python scripts (demo*.py) that use the individual SPRM modules. Activate the SPRM environment (e.g., "conda activate SPRM") and run an example script (e.g., `python demo_features_only.py'). The scripts will put the outputs into the "sprm_demo_outputs" folder

Prerequisites

  • Python 3.8 or newer
  • AICSImageIO
  • h5py (for checkpoint system)
  • Matplotlib
  • Numba
  • NumPy
  • Pandas
  • Pillow
  • Pint
  • scikit-learn
  • SciPy
  • Shapely

Documentation

For more information on specific analytical tools and outputs of SPRM:

Documentation

Development information

The notes below are provided in case you wish to make code changes and submit them to the SPRM github repository via a pull request.

Code in this repository is formatted with black and isort.

A pre-commit hook configuration is provided, which runs black and isort before committing. Run pre-commit install in each clone of this repository which you will use for development (after pip install pre-commit into an appropriate Python environment, if necessary).

Contact

Robert F. Murphy - murphy@cmu.edu
Ted (Ce) Zhang - tedz@andrew.cmu.edu
Matt Ruffalo - mruffalo@cs.cmu.edu

Metadata

Release files for sprmpkg 2.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sprmpkg 2.0.3
File Size Uploaded
sprmpkg-2.0.3.tar.gz 103.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sprmpkg 2.0.3
File Interpreter ABI Platform
sprmpkg-2.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 215.2 kB

Release files / sprmpkg-2.0.3.tar.gz

Download URL sprmpkg-2.0.3.tar.gz
Size 103.5 kB
Tags Source
SHA-256 checksum
How to use checksums
8f68fe4df080813cab6b1565f8f18a65d4185781b23c4f6e27eb6caceca7563d
BLAKE2b-256 checksum
How to use checksums
449174f23da718d72beb914ae1e175eff54b3d09e4761ff172903eca4722ab1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.13

Release files / sprmpkg-2.0.3-py3-none-any.whl

Download URL sprmpkg-2.0.3-py3-none-any.whl
Size 111.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cf12e916497dae890bbcbd4cd308c62ea002d28b390fccf5aac2d8c26c3611ab
BLAKE2b-256 checksum
How to use checksums
2309938a80e36c82066bc8791730f9078a62174dc10814e22ce4d436eb0f2401
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.13

Release history Release notifications | RSS feed

This release

2.0.3 This release

2 release files

2.0.1

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page