qsm-forward


Nameqsm-forward JSON
Version 0.24 PyPI version JSON
download
home_pagehttps://github.com/astewartau/qsm-forward
SummaryA forward-model simulation for Quantitative Susceptibility Mapping
upload_time2024-10-17 19:47:56
maintainerNone
docs_urlNone
authorAshley Stewart
requires_pythonNone
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # QSM Forward Model

Based on Marques, J. P., et al. (2021). QSM reconstruction challenge 2.0: A realistic in silico head phantom for MRI data simulation and evaluation of susceptibility mapping procedures. Magnetic Resonance in Medicine, 86(1), 526-542. https://doi.org/10.1002/mrm.28716

Includes code for:

 - Field model (forward multiplication with dipole kernel based on chi)
 - Signal model (magnitude and phase simulation based on field/M0/R1/R2star)
 - Phase offset model
 - Noise model
 - Shim field model
 - k-space cropping

## Install

```
pip install qsm-forward
```

## Example using simulated sources

In this example, we simulated susceptibility sources (spheres and rectangles) to generate a BIDS directory:

```python
import qsm_forward

if __name__ == "__main__":
    recon_params = qsm_forward.ReconParams()
    recon_params.subject = "simulated-sources"
    recon_params.peak_snr = 100
    recon_params.random_seed = 42

    tissue_params = qsm_forward.TissueParams(
        chi=qsm_forward.generate_susceptibility_phantom(
            resolution=[100, 100, 100],
            background=0,
            large_cylinder_val=0.005,
            small_cylinder_radii=[4, 4, 4, 7],
            small_cylinder_vals=[0.05, 0.1, 0.2, 0.5]
        )
    )

    qsm_forward.generate_bids(tissue_params, recon_params, "bids")
```

```
bids/
└── sub-simulated-sources
    └── ses-1
        ├── anat
        │   ├── sub-simulated-sources_ses-1_run-1_echo-1_part-mag_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-1_part-mag_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-1_part-phase_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-1_part-phase_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-2_part-mag_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-2_part-mag_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-2_part-phase_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-2_part-phase_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-3_part-mag_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-3_part-mag_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-3_part-phase_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-3_part-phase_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-4_part-mag_MEGRE.json
        │   ├── sub-simulated-sources_ses-1_run-1_echo-4_part-mag_MEGRE.nii
        │   ├── sub-simulated-sources_ses-1_run-1_echo-4_part-phase_MEGRE.json
        │   └── sub-simulated-sources_ses-1_run-1_echo-4_part-phase_MEGRE.nii
        └── extra_data
            ├── sub-simulated-sources_ses-1_run-1_chi.nii
            ├── sub-simulated-sources_ses-1_run-1_mask.nii
            └── sub-simulated-sources_ses-1_run-1_segmentation.nii
```

Some repesentative images including the mask, first and last-echo phase image, and ground truth susceptibility (chi):

![Image](https://i.imgur.com/3zpKbP0.png)

## Example using head phantom data

In this example, we generate a BIDS-compliant dataset based on the [realistic in-silico head phantom](https://doi.org/10.34973/m20r-jt17). If you have access to the head phantom, you need to retain the `data` directory which provides relevant tissue parameters:

```python
import qsm_forward
import numpy as np

if __name__ == "__main__":
    tissue_params = qsm_forward.TissueParams(root_dir="~/data")
    
    recon_params_all = [
        qsm_forward.ReconParams(voxel_size=voxel_size, peak_snr=100, random_seed=42, session=session)
        for (voxel_size, session) in [
            (np.array([0.8, 0.8, 0.8]), "0p8"),
            (np.array([1.0, 1.0, 1.0]), "1p0"),
            (np.array([1.2, 1.2, 1.2]), "1p2")
        ]
    ]

    for recon_params in recon_params_all:    
        qsm_forward.generate_bids(tissue_params=tissue_params, recon_params=recon_params, bids_dir="bids")
```

```
bids/
└── sub-1
    ├── ses-0p8
    │   ├── anat
    │   │   ├── sub-1_ses-0p8_run-1_echo-1_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-1_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-1_part-phase_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-1_part-phase_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-2_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-2_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-2_part-phase_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-2_part-phase_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-3_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-3_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-3_part-phase_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-3_part-phase_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-4_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-0p8_run-1_echo-4_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-0p8_run-1_echo-4_part-phase_MEGRE.json
    │   │   └── sub-1_ses-0p8_run-1_echo-4_part-phase_MEGRE.nii
    │   └── extra_data
    │       ├── sub-1_ses-0p8_run-1_chi.nii
    │       ├── sub-1_ses-0p8_run-1_mask.nii
    │       └── sub-1_ses-0p8_run-1_segmentation.nii
    ├── ses-1p0
    │   ├── anat
    │   │   ├── sub-1_ses-1p0_run-1_echo-1_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-1_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-1_part-phase_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-1_part-phase_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-2_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-2_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-2_part-phase_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-2_part-phase_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-3_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-3_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-3_part-phase_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-3_part-phase_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-4_part-mag_MEGRE.json
    │   │   ├── sub-1_ses-1p0_run-1_echo-4_part-mag_MEGRE.nii
    │   │   ├── sub-1_ses-1p0_run-1_echo-4_part-phase_MEGRE.json
    │   │   └── sub-1_ses-1p0_run-1_echo-4_part-phase_MEGRE.nii
    │   └── extra_data
    │       ├── sub-1_ses-1p0_run-1_chi.nii
    │       ├── sub-1_ses-1p0_run-1_mask.nii
    │       └── sub-1_ses-1p0_run-1_segmentation.nii
    └── ses-1p2
        ├── anat
        │   ├── sub-1_ses-1p2_run-1_echo-1_part-mag_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-1_part-mag_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-1_part-phase_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-1_part-phase_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-2_part-mag_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-2_part-mag_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-2_part-phase_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-2_part-phase_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-3_part-mag_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-3_part-mag_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-3_part-phase_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-3_part-phase_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-4_part-mag_MEGRE.json
        │   ├── sub-1_ses-1p2_run-1_echo-4_part-mag_MEGRE.nii
        │   ├── sub-1_ses-1p2_run-1_echo-4_part-phase_MEGRE.json
        │   └── sub-1_ses-1p2_run-1_echo-4_part-phase_MEGRE.nii
        └── extra_data
            ├── sub-1_ses-1p2_run-1_chi.nii
            ├── sub-1_ses-1p2_run-1_mask.nii
            └── sub-1_ses-1p2_run-1_segmentation.nii
```

Some repesentative images including the ground truth chi map, first-echo magnitude image, and first and last-echo phase images:

![Image](https://i.imgur.com/cE1cQ3U.png)

## Example including T1-weighted images

```python
import qsm_forward
import numpy as np

if __name__ == "__main__":
    tissue_params = qsm_forward.TissueParams(root_dir="~/data", chi="ChiModelMIX.nii.gz")
    
    recon_params_all = [
        qsm_forward.ReconParams(voxel_size=voxel_size, session=session, TEs=TEs, TR=TR, flip_angle=flip_angle, random_seed=42, suffix=suffix, save_phase=save_phase)
        for (voxel_size, session, TEs, TR, flip_angle, suffix, save_phase) in [
            (np.array([0.64, 0.64, 0.64]), "0p64", np.array([3.5e-3]), 7.5e-3, 40, "T1w", False),
            (np.array([0.64, 0.64, 0.64]), "0p64", np.array([0.004, 0.012, 0.02, 0.028]), 0.05, 15, "T2starw", True),
        ]
    ]

    for recon_params in recon_params_all:    
        qsm_forward.generate_bids(tissue_params=tissue_params, recon_params=recon_params, bids_dir="bids")
```

```
bids/
└── sub-1
    └── ses-0p64
        ├── anat
        │   ├── sub-1_ses-0p64_run-1_echo-1_part-mag_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-1_part-mag_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-1_part-phase_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-1_part-phase_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-2_part-mag_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-2_part-mag_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-2_part-phase_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-2_part-phase_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-3_part-mag_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-3_part-mag_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-3_part-phase_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-3_part-phase_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-4_part-mag_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-4_part-mag_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_echo-4_part-phase_MEGRE.json
        │   ├── sub-1_ses-0p64_run-1_echo-4_part-phase_MEGRE.nii
        │   ├── sub-1_ses-0p64_run-1_T1w.json
        │   └── sub-1_ses-0p64_run-1_T1w.nii
        └── extra_data
            ├── sub-1_ses-0p64_run-1_chi.nii
            ├── sub-1_ses-0p64_run-1_mask.nii
            └── sub-1_ses-0p64_run-1_segmentation.nii
```

Some repesentative images including the T2starw and T1w magnitude images:

![Image](https://i.imgur.com/RVzdhRz.png)

## Example simulating oblique acquisition

In this [example](qsm_forward/examples/simulated_sources_oblique.py), we simulated spherical susceptibility sources to generate a BIDS directory with a range of B0 directions:

![Image](https://i.imgur.com/8GDsqiN.png)

On the left is the phase image with the two sources with an axial B0 direction. On the right is a phase image with the two sources with a B0 direction rotated 30 degrees about the x axis.


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/astewartau/qsm-forward",
    "name": "qsm-forward",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": null,
    "author": "Ashley Stewart",
    "author_email": "a.stewart.au@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/59/9c/3d87601b10bd4146354c14d236e3ccbd764c6419c952dab619853002137f/qsm_forward-0.24.tar.gz",
    "platform": null,
    "description": "# QSM Forward Model\n\nBased on Marques, J. P., et al. (2021). QSM reconstruction challenge 2.0: A realistic in silico head phantom for MRI data simulation and evaluation of susceptibility mapping procedures. Magnetic Resonance in Medicine, 86(1), 526-542. https://doi.org/10.1002/mrm.28716\n\nIncludes code for:\n\n - Field model (forward multiplication with dipole kernel based on chi)\n - Signal model (magnitude and phase simulation based on field/M0/R1/R2star)\n - Phase offset model\n - Noise model\n - Shim field model\n - k-space cropping\n\n## Install\n\n```\npip install qsm-forward\n```\n\n## Example using simulated sources\n\nIn this example, we simulated susceptibility sources (spheres and rectangles) to generate a BIDS directory:\n\n```python\nimport qsm_forward\n\nif __name__ == \"__main__\":\n    recon_params = qsm_forward.ReconParams()\n    recon_params.subject = \"simulated-sources\"\n    recon_params.peak_snr = 100\n    recon_params.random_seed = 42\n\n    tissue_params = qsm_forward.TissueParams(\n        chi=qsm_forward.generate_susceptibility_phantom(\n            resolution=[100, 100, 100],\n            background=0,\n            large_cylinder_val=0.005,\n            small_cylinder_radii=[4, 4, 4, 7],\n            small_cylinder_vals=[0.05, 0.1, 0.2, 0.5]\n        )\n    )\n\n    qsm_forward.generate_bids(tissue_params, recon_params, \"bids\")\n```\n\n```\nbids/\n\u2514\u2500\u2500 sub-simulated-sources\n    \u2514\u2500\u2500 ses-1\n        \u251c\u2500\u2500 anat\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-1_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-1_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-1_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-1_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-2_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-2_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-2_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-2_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-3_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-3_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-3_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-3_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-4_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-4_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-4_part-phase_MEGRE.json\n        \u2502   \u2514\u2500\u2500 sub-simulated-sources_ses-1_run-1_echo-4_part-phase_MEGRE.nii\n        \u2514\u2500\u2500 extra_data\n            \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_chi.nii\n            \u251c\u2500\u2500 sub-simulated-sources_ses-1_run-1_mask.nii\n            \u2514\u2500\u2500 sub-simulated-sources_ses-1_run-1_segmentation.nii\n```\n\nSome repesentative images including the mask, first and last-echo phase image, and ground truth susceptibility (chi):\n\n![Image](https://i.imgur.com/3zpKbP0.png)\n\n## Example using head phantom data\n\nIn this example, we generate a BIDS-compliant dataset based on the [realistic in-silico head phantom](https://doi.org/10.34973/m20r-jt17). If you have access to the head phantom, you need to retain the `data` directory which provides relevant tissue parameters:\n\n```python\nimport qsm_forward\nimport numpy as np\n\nif __name__ == \"__main__\":\n    tissue_params = qsm_forward.TissueParams(root_dir=\"~/data\")\n    \n    recon_params_all = [\n        qsm_forward.ReconParams(voxel_size=voxel_size, peak_snr=100, random_seed=42, session=session)\n        for (voxel_size, session) in [\n            (np.array([0.8, 0.8, 0.8]), \"0p8\"),\n            (np.array([1.0, 1.0, 1.0]), \"1p0\"),\n            (np.array([1.2, 1.2, 1.2]), \"1p2\")\n        ]\n    ]\n\n    for recon_params in recon_params_all:    \n        qsm_forward.generate_bids(tissue_params=tissue_params, recon_params=recon_params, bids_dir=\"bids\")\n```\n\n```\nbids/\n\u2514\u2500\u2500 sub-1\n    \u251c\u2500\u2500 ses-0p8\n    \u2502   \u251c\u2500\u2500 anat\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-1_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-1_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-1_part-phase_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-1_part-phase_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-2_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-2_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-2_part-phase_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-2_part-phase_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-3_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-3_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-3_part-phase_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-3_part-phase_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-4_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-4_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-0p8_run-1_echo-4_part-phase_MEGRE.json\n    \u2502   \u2502   \u2514\u2500\u2500 sub-1_ses-0p8_run-1_echo-4_part-phase_MEGRE.nii\n    \u2502   \u2514\u2500\u2500 extra_data\n    \u2502       \u251c\u2500\u2500 sub-1_ses-0p8_run-1_chi.nii\n    \u2502       \u251c\u2500\u2500 sub-1_ses-0p8_run-1_mask.nii\n    \u2502       \u2514\u2500\u2500 sub-1_ses-0p8_run-1_segmentation.nii\n    \u251c\u2500\u2500 ses-1p0\n    \u2502   \u251c\u2500\u2500 anat\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-1_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-1_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-1_part-phase_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-1_part-phase_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-2_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-2_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-2_part-phase_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-2_part-phase_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-3_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-3_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-3_part-phase_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-3_part-phase_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-4_part-mag_MEGRE.json\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-4_part-mag_MEGRE.nii\n    \u2502   \u2502   \u251c\u2500\u2500 sub-1_ses-1p0_run-1_echo-4_part-phase_MEGRE.json\n    \u2502   \u2502   \u2514\u2500\u2500 sub-1_ses-1p0_run-1_echo-4_part-phase_MEGRE.nii\n    \u2502   \u2514\u2500\u2500 extra_data\n    \u2502       \u251c\u2500\u2500 sub-1_ses-1p0_run-1_chi.nii\n    \u2502       \u251c\u2500\u2500 sub-1_ses-1p0_run-1_mask.nii\n    \u2502       \u2514\u2500\u2500 sub-1_ses-1p0_run-1_segmentation.nii\n    \u2514\u2500\u2500 ses-1p2\n        \u251c\u2500\u2500 anat\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-1_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-1_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-1_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-1_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-2_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-2_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-2_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-2_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-3_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-3_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-3_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-3_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-4_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-4_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-1p2_run-1_echo-4_part-phase_MEGRE.json\n        \u2502   \u2514\u2500\u2500 sub-1_ses-1p2_run-1_echo-4_part-phase_MEGRE.nii\n        \u2514\u2500\u2500 extra_data\n            \u251c\u2500\u2500 sub-1_ses-1p2_run-1_chi.nii\n            \u251c\u2500\u2500 sub-1_ses-1p2_run-1_mask.nii\n            \u2514\u2500\u2500 sub-1_ses-1p2_run-1_segmentation.nii\n```\n\nSome repesentative images including the ground truth chi map, first-echo magnitude image, and first and last-echo phase images:\n\n![Image](https://i.imgur.com/cE1cQ3U.png)\n\n## Example including T1-weighted images\n\n```python\nimport qsm_forward\nimport numpy as np\n\nif __name__ == \"__main__\":\n    tissue_params = qsm_forward.TissueParams(root_dir=\"~/data\", chi=\"ChiModelMIX.nii.gz\")\n    \n    recon_params_all = [\n        qsm_forward.ReconParams(voxel_size=voxel_size, session=session, TEs=TEs, TR=TR, flip_angle=flip_angle, random_seed=42, suffix=suffix, save_phase=save_phase)\n        for (voxel_size, session, TEs, TR, flip_angle, suffix, save_phase) in [\n            (np.array([0.64, 0.64, 0.64]), \"0p64\", np.array([3.5e-3]), 7.5e-3, 40, \"T1w\", False),\n            (np.array([0.64, 0.64, 0.64]), \"0p64\", np.array([0.004, 0.012, 0.02, 0.028]), 0.05, 15, \"T2starw\", True),\n        ]\n    ]\n\n    for recon_params in recon_params_all:    \n        qsm_forward.generate_bids(tissue_params=tissue_params, recon_params=recon_params, bids_dir=\"bids\")\n```\n\n```\nbids/\n\u2514\u2500\u2500 sub-1\n    \u2514\u2500\u2500 ses-0p64\n        \u251c\u2500\u2500 anat\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-1_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-1_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-1_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-1_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-2_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-2_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-2_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-2_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-3_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-3_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-3_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-3_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-4_part-mag_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-4_part-mag_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-4_part-phase_MEGRE.json\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_echo-4_part-phase_MEGRE.nii\n        \u2502   \u251c\u2500\u2500 sub-1_ses-0p64_run-1_T1w.json\n        \u2502   \u2514\u2500\u2500 sub-1_ses-0p64_run-1_T1w.nii\n        \u2514\u2500\u2500 extra_data\n            \u251c\u2500\u2500 sub-1_ses-0p64_run-1_chi.nii\n            \u251c\u2500\u2500 sub-1_ses-0p64_run-1_mask.nii\n            \u2514\u2500\u2500 sub-1_ses-0p64_run-1_segmentation.nii\n```\n\nSome repesentative images including the T2starw and T1w magnitude images:\n\n![Image](https://i.imgur.com/RVzdhRz.png)\n\n## Example simulating oblique acquisition\n\nIn this [example](qsm_forward/examples/simulated_sources_oblique.py), we simulated spherical susceptibility sources to generate a BIDS directory with a range of B0 directions:\n\n![Image](https://i.imgur.com/8GDsqiN.png)\n\nOn the left is the phase image with the two sources with an axial B0 direction. On the right is a phase image with the two sources with a B0 direction rotated 30 degrees about the x axis.\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A forward-model simulation for Quantitative Susceptibility Mapping",
    "version": "0.24",
    "project_urls": {
        "Homepage": "https://github.com/astewartau/qsm-forward"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d691192dd3cc2f177ed61f1fb95d03c193be83edc2bab40efedaf74dba86d1ad",
                "md5": "2557785ac02db3e171371b442bf06148",
                "sha256": "8b6ae92815677766f03956c0c0cc8482f44b5f05eb9e5d7548c930683e87662d"
            },
            "downloads": -1,
            "filename": "qsm_forward-0.24-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "2557785ac02db3e171371b442bf06148",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 28082,
            "upload_time": "2024-10-17T19:47:54",
            "upload_time_iso_8601": "2024-10-17T19:47:54.768843Z",
            "url": "https://files.pythonhosted.org/packages/d6/91/192dd3cc2f177ed61f1fb95d03c193be83edc2bab40efedaf74dba86d1ad/qsm_forward-0.24-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "599c3d87601b10bd4146354c14d236e3ccbd764c6419c952dab619853002137f",
                "md5": "42ce849548f73fc3cd30e5f84131407c",
                "sha256": "acc3230e85687ccee78b8aaff7901a1f932bb8f42e44f83d99a9e2d10c2e4f61"
            },
            "downloads": -1,
            "filename": "qsm_forward-0.24.tar.gz",
            "has_sig": false,
            "md5_digest": "42ce849548f73fc3cd30e5f84131407c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 29574,
            "upload_time": "2024-10-17T19:47:56",
            "upload_time_iso_8601": "2024-10-17T19:47:56.770400Z",
            "url": "https://files.pythonhosted.org/packages/59/9c/3d87601b10bd4146354c14d236e3ccbd764c6419c952dab619853002137f/qsm_forward-0.24.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-17 19:47:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "astewartau",
    "github_project": "qsm-forward",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "qsm-forward"
}
        
Elapsed time: 0.60411s