Metadata-Version: 2.4
Name: mrtwo
Version: 0.260510
Summary: MR data handling and image reconstruction.
Author-email: Felix Zimmermann <fzimmermann89@gmail.de>, Christoph Kolbitsch <christoph.kolbitsch@ptb.de>, Patrick Schuenke <patrick.schuenke@ptb.de>, Andreas Kofler <andreas.kofler@ptb.de>
Project-URL: Documentation, https://fzimmermann89.github.io/mr2/
Keywords: MRI,qMRI,medical imaging,physics-informed learning,model-based reconstruction,quantitative,signal models,machine learning,deep learning,reconstruction,processing,Pulseq,PyTorch
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: <3.14,>=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy<3.0,>=1.23
Requires-Dist: torch>=2.3.1
Requires-Dist: torchnd>=0.1.0
Requires-Dist: ismrmrd>=1.14.1
Requires-Dist: einops>=0.7.0
Requires-Dist: pydicom>=3.0.1
Requires-Dist: nibabel>=4.0
Requires-Dist: pypulseq>=1.4.2
Requires-Dist: pytorch-finufft>=0.1.0
Requires-Dist: cufinufft>=2.4.1; platform_system == "Linux"
Requires-Dist: scipy>=1.15
Requires-Dist: ptwt<1.0,>=0.1.8
Requires-Dist: torchvision>=0.18.1
Requires-Dist: tqdm>=4.60.0
Requires-Dist: typing-extensions>=4.12
Requires-Dist: platformdirs>=4.0
Requires-Dist: requests>=2.25
Provides-Extra: tests
Requires-Dist: coverage; extra == "tests"
Requires-Dist: codecov; extra == "tests"
Requires-Dist: pre-commit; extra == "tests"
Requires-Dist: pytest; extra == "tests"
Requires-Dist: pytest-cov; extra == "tests"
Provides-Extra: docs
Requires-Dist: mrtwo[notebooks]; extra == "docs"
Requires-Dist: sphinx<8.2,>=8.1; extra == "docs"
Requires-Dist: sphinx_rtd_theme<3.1,>=3.0; extra == "docs"
Requires-Dist: sphinx-pyproject<0.4,>=0.3; extra == "docs"
Requires-Dist: myst-nb<1.3,>=1.2; extra == "docs"
Requires-Dist: sphinx-mathjax-offline<0.1; extra == "docs"
Requires-Dist: sphinx_github_style<1.3,>=1.2; extra == "docs"
Requires-Dist: sphinx-autodoc-typehints<3.1,>=3; extra == "docs"
Requires-Dist: sphinx-copybutton<0.6,>=0.5; extra == "docs"
Requires-Dist: sphinx-last-updated-by-git<0.4,>=0.3; extra == "docs"
Requires-Dist: snowballstemmer<3.0,>=2.2; extra == "docs"
Provides-Extra: notebooks
Requires-Dist: zenodo_get>=2.0; extra == "notebooks"
Requires-Dist: ipykernel; extra == "notebooks"
Requires-Dist: ipywidgets; extra == "notebooks"
Requires-Dist: jupytext; extra == "notebooks"
Requires-Dist: matplotlib; extra == "notebooks"
Requires-Dist: cmap; extra == "notebooks"
Provides-Extra: dev
Requires-Dist: mrtwo[docs,tests]; extra == "dev"
Dynamic: license-file

<h1 align="center">

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/fzimmermann89/mr2/refs/heads/main/docs/source/_static/logo_white.svg">
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/fzimmermann89/mr2/refs/heads/main/docs/source/_static/logo.svg">
  <img src="https://raw.githubusercontent.com/fzimmermann89/mr2/refs/heads/main/docs/source/_static/logo.svg" alt="MRtwo logo" width="50%">
</picture>

</h1><br>

[![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://pypi.org/project/mrtwo/)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Coverage Bagde](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/fzimmermann89/f688ae5c6e8daec44ac7f8fc4067e93f/raw/coverage.json)](https://github.com/fzimmermann89/mr2/actions?query=workflow%3A%22%22Report+PyTest%22%22)
[![arXiv](https://img.shields.io/badge/arXiv-2507.23129-b31b1b.svg)](https://arxiv.org/abs/2507.23129)
[![FAIR checklist badge](https://fairsoftwarechecklist.net/badge.svg)](https://fairsoftwarechecklist.net/v0.2?f=31&a=32113&i=21322&r=133)

MR data processing and image reconstruction.

This project is a faster moving continuation/fork of [MRpro](https://github.com/PTB-MR/mrpro/).
Some of the additional features of MRtwo will eventually get backported to MRpro, all new features of MRpro will be included in MRtwo.

In most cases, you can replace `mrpro` by `mr2` in you code and everything works.

- **Source code:** <https://github.com/fzimmermann89/mr2>
- **Documentation:** <https://fzimmermann89.github.io/mr2/>
- **Bug reports:** <https://github.com/fzimmermann89/mr2/issues>
- **Try it out:** [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/fzimmermann89/mr2)

## Main features
- **Data handling** Custom dataclasses for fast data subsetting, sorting, rearranging
- **Neural Network Block** Common blocks and networks used for ML based MRI reconstruction
- **ISMRMRD support** MRtwo supports [ismrmrd-format](https://ismrmrd.readthedocs.io/en/latest/) for MR raw data.
- **PyTorch** All data containers utilize PyTorch tensors to ensure easy integration in PyTorch-based network schemes.
- **Cartesian and non-Cartesian trajectories** MRtwo can reconstruct data obtained with Cartesian and non-Cartesian (e.g. radial, spiral...) sapling schemes. MRtwo automatically detects if FFT or nuFFT is required to reconstruct the k-space data.
- **Pulseq support** If the data acquisition was carried out using a [pulseq-based](http://pulseq.github.io/) sequence, the seq-file can be provided to MRtwo and the used trajectory is automatically calculated.
- **Signal models** A range of different MR signal models are implemented (e.g. T1 recovery, WASABI).
- **Regularized image reconstruction** Regularized image reconstruction algorithms including Wavelet-based compressed sensing or total variation regularized image reconstruction are available.

## Examples

In the following, we show some code snippets to highlight the use of MRtwo. Each code snippet only shows the main steps. A complete working notebook can be found in the provided link.

### Simple reconstruction

Read the data and trajectory and reconstruct an image by applying a density compensation function and then the adjoint of the Fourier operator and the adjoint of the coil sensitivity operator.

```python
# Read the trajectory from the ISMRMRD file
trajectory = mr2.data.traj_calculators.KTrajectoryIsmrmrd()
# Load in the Data from the ISMRMRD file
kdata = mr2.data.KData.from_file(data_file.name, trajectory)
# Perform the reconstruction
reconstruction = mr2.algorithms.reconstruction.DirectReconstruction(kdata)
img = reconstruction(kdata)
```

Full example: <https://github.com/fzimmermann89/mr2/blob/main/examples/scripts/direct_reconstruction.py>

### Estimate quantitative parameters

Quantitative parameter maps can be obtained by creating a functional to be minimized and calling a non-linear solver such as ADAM.

```python
# Define signal model
model = MagnitudeOp() @ InversionRecovery(ti=idata_multi_ti.header.ti)
# Define loss function and combine with signal model
mse = MSE(idata_multi_ti.data.abs())
functional = mse @ model
[...]
# Run optimization
params_result = adam(functional, [m0_start, t1_start], n_iterations=n_iterations, learning_rate=learning_rate)
```

Full example: <https://github.com/fzimmermann89/mr2/blob/main/examples/scripts/qmri_sg_challenge_2024_t1.py>

### Pulseq support

The trajectory can be calculated directly from a provided pulseq-file.

```python
# Read raw data and calculate trajectory using KTrajectoryPulseq
kdata = KData.from_file(data_file.name, KTrajectoryPulseq(seq_path=seq_file.name))
```

Full example: <https://github.com/fzimmermann89/mr2/blob/main/examples/scripts/comparison_trajectory_calculators.py>

## Development
 ``` pip install -e ".[dev]" ```
