Skip to main content
PyLCModel Logo

PyLCModel

A lightweight Python wrapper for LCModel spectral fitting in MR spectroscopy

PyPI version Python License

PyLCModel is a lightweight Python wrapper that streamlines the use of LCModel for least-squares spectral fitting in MRS. It automates control-file generation, handles flexible data input, manages the LCModel executable for you, and parses the output (with single- and multi-core processing).


Features

  • Zero-setup binaries — the LCModel executable is resolved automatically (download, container image, build from source, or your own path); nothing is bundled in the wheel.
  • Flexible input — NumPy arrays, NIfTI-MRS, jMRUI text, and LCModel .RAW, in time or frequency domain.
  • Automated control files — generated to match your data, or templated from an existing one.
  • Basis conversion (experimental) — jMRUI, FSL-MRS, LCModel .RAW, and Osprey/FID-A basis sets to .basis.
  • Batch fitting — single- or multi-core, with full output parsing (concentrations, CRLBs, QC, fitted series).

Installation

From PyPI

pip install lcmodel-wrapper

From Source

git clone https://github.com/julianmer/PyLCModel.git
cd PyLCModel
pip install -e .

Add --recursive to the clone (or run git submodule update --init) to also fetch the ISMRM 2016 fitting challenge example data used by the tests.


How the LCModel binary is handled

LCModel is not shipped in the wheel. On first use it is found in this order, and the first one that works is cached:

  1. path2exec you pass to PyLCModel,
  2. the community binary for your OS/architecture from schorschinho/LCModel,
  3. the binary built by this repository's CI for the installed version (releases; Linux x86_64/aarch64 and macOS arm64/x86_64, all statically linked),
  4. the container image ghcr.io/julianmer/lcmodel, if Docker or podman is running,
  5. a build from source with gfortran.

Each candidate is run once before it is accepted, so a binary that cannot run on your machine is skipped rather than cached. Useful switches: allow_download, allow_docker, allow_build on PyLCModel, and the LCMODEL_EXEC / LCMODEL_CACHE_DIR environment variables.

With the container, LCModel sees your working directory and your home directory; keep the basis set and any save_path under one of them. The image also works on its own:

docker run --rm -i -v "$PWD:$PWD" -w "$PWD" ghcr.io/julianmer/lcmodel < control.file

Getting Started

from lcmodel_wrapper import PyLCModel

# Initialize the wrapper with your basis set (the LCModel binary is resolved automatically)
lcmodel = PyLCModel(path2basis="/path/to/your/basis_set.basis")

# `data` can be a NumPy array of FIDs (time domain), a NIfTI-MRS path, etc.
concentrations, crlbs = lcmodel(data)

print("Fitted Metabolite Concentrations:", concentrations)
print("CRLBs:", crlbs)

Frequency-domain input or a custom executable:

lcmodel = PyLCModel(
    path2basis="/path/to/basis.basis",
    domain="freq",                 # pass spectra instead of FIDs
    path2exec="/path/to/lcmodel",  # optional: use your own binary
)

Experimental basis conversion (other formats -> .basis):

# Auto-detect the source format (jMRUI/AQSES/QUEST .txt folder, FSL-MRS .json folder,
# LCModel .RAW folder, or Osprey/FID-A .mat):
lcmodel = PyLCModel(path2basis="/path/to/basis_folder", convert_basis=True)

# ...or force a format and supply parameters the source does not carry:
lcmodel = PyLCModel(
    path2basis="/path/to/raw_folder",
    convert_basis=True,
    basis_format="raw",          # "jmrui" | "fsl" | "raw" | "mat"
    bandwidth=4000, central_freq=123.25,
)

# Or convert directly without fitting:
from lcmodel_wrapper import convert_to_basis
convert_to_basis("/path/to/jmrui_folder", out_path="out.basis")

Basis conversion is experimental and not validated. For a dedicated, more complete tool, see the MRS Basis Set Conversion Toolbox.


Licensing

This wrapper (the Python code) is released under the Apache License 2.0 (see LICENSE).

LCModel itself is a separate program by Dr. Stephen Provencher, distributed under the BSD 3-Clause License (see LICENSE.lcmodel). This package does not bundle LCModel; when it downloads, builds, or runs the LCModel executable, that BSD-3-Clause license and the attributions in NOTICE apply. See the LCModel home page for details.


Acknowledgements


Built with ❤️ for the MRS community

Metadata

Release files for lcmodel-wrapper 0.4.0

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

Source distribution (sdist)

Source distribution for lcmodel-wrapper 0.4.0
File Size Uploaded
lcmodel_wrapper-0.4.0.tar.gz 49.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lcmodel-wrapper 0.4.0
File Interpreter ABI Platform
lcmodel_wrapper-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 93.5 kB

Release files / lcmodel_wrapper-0.4.0.tar.gz

Download URL lcmodel_wrapper-0.4.0.tar.gz
Size 49.7 kB
Tags Source
SHA-256 checksum
How to use checksums
db05ace74492d78ff0d896b58c4fe79039cb4e1308ccdfe25ba5b8b23b0eadf8
BLAKE2b-256 checksum
How to use checksums
95aea25cdfb7a88f9c617d201818ea26a2b69e411df259698004b75ba20bb902
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / lcmodel_wrapper-0.4.0-py3-none-any.whl

Download URL lcmodel_wrapper-0.4.0-py3-none-any.whl
Size 43.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0cf9592a31187c03bcc3b2bb5025ed9df74354a9e9dba6afc1f0e0e1087f9c0e
BLAKE2b-256 checksum
How to use checksums
7e6e78cac500afc8bd5bdba702e994fd2c62b28af50e6bd1bafb49fa94483da6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.5.1

2 release files

This release

0.4.0 This release

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

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