# CG-SENSE HOME
<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->
## W.I.P Tasks
Contributions to the below tasks are highly appreciated!
- [ ] Document the standardization of the raw h5-file, otherwise
`read_data()` has to be modified every time a deviation in h5-file is
encountered.
- [ ] Refactor, simplify, modularize the gridding reconstructions.
Currently, it is difficult to understand, especially for new learner.
- [x] Add `save_intermediate` flag in gradient descent or conjugate
gradient optimization functions to store intermediate reconstruction
in each iteration.
- [ ] Add theoretical descriptions on MRI, MRI recons, and gradient
Descent, and gonjugate gradient algorithms.
## Homepage
This tutorial <https://hdocmsu.github.io/cgsense2023/> was written by
Hung Do based on the
[RRSG_Challenge_01](https://github.com/ISMRM/rrsg_challenge_01) github
repository.
## How to Cite
[![](https://zenodo.org/badge/DOI/10.5281/zenodo.10547817.svg)](https://doi.org/10.5281/zenodo.10547817)
> APA style:
>
> *Do, H. (2024). CG-SENSE Tutorial version 0.0.3 (0.0.3). Zenodo.
> https://doi.org/10.5281/zenodo.10547817*
> IEEE style:
>
> *H. Do, “CG-SENSE Tutorial version 0.0.3”. Zenodo, Jan. 21, 2024. doi:
> 10.5281/zenodo.10547817.*
## pip install
The [cgsense2023](https://pypi.org/project/cgsense2023/) package was
uploaded to [PyPI](https://pypi.org/) and can be easily installed using
the below command.
`pip install cgsense2023`
## How to use
### Plot Module
``` python
from cgsense2023.plot import *
import numpy as np
```
``` python
# Sequential - full - spoke radial trajectory
traj_full = gen_radial_traj(golden=False, full_spoke=True)
show_trajectory(traj_full, golden=True, figsize=(10,8))
```
![](index_files/figure-commonmark/cell-3-output-1.png)
``` python
# golden - full - spoke radial trajectory
traj_full_golden = gen_radial_traj(golden=True, full_spoke=True)
show_trajectory(traj_full_golden, golden=True, figsize=(10,8))
```
![](index_files/figure-commonmark/cell-4-output-1.png)
``` python
Nim, Nx, Ny = 12, 128, 256
x1 = np.random.randn(Nim, Nx, Ny)
x2 = np.random.randn(1, Nx, Ny)
```
``` python
show_image_grid(x1)
```
Warning: number of images (12) is larger than number of panels (2x5)!
![](index_files/figure-commonmark/cell-6-output-2.png)
``` python
show_image_grid(x2)
```
![](index_files/figure-commonmark/cell-7-output-1.png)
### Metrics Module
``` python
from cgsense2023.metrics import *
import numpy as np
```
``` python
# same dimensions
Nim, Nx, Ny = 11, 128, 256
x1 = np.random.randn(1, Nx, Ny)
x2 = np.random.randn(1, Nx, Ny)
print_metrics(x1, x2)
```
+---------+-----------+
| Metrics | Values |
+---------+-----------+
| MSE | 1.999e+00 |
| NMSE | 2.000e+00 |
| RMSE | 1.414e+00 |
| NRMSE | 1.414e+00 |
| PSNR | 14.981 |
| SSIM | 0.0092604 |
+---------+-----------+
### Gridding Reconstruction
``` python
from cgsense2023.math import *
from cgsense2023.io import *
import cgsense2023 as cgs2003
from cgsense2023.mri import *
from cgsense2023.optimizer import *
import h5py
import numpy as np
import matplotlib.pyplot as plt
```
#### Data Paths
``` python
# path to the data file
fpath = '../testdata/rawdata_brain.h5'
# path to the reference results
rpath = '../testdata/CG_reco_inscale_True_denscor_True_reduction_1.h5'
```
``` python
with h5py.File(rpath, 'r') as rf:
print(list(rf.keys()))
ref_cg = np.squeeze(rf['CG_reco'][()][-1])
ref_grid = np.squeeze(rf['Coil_images'][()])
```
['CG_reco', 'Coil_images']
``` python
ref_cg.shape, ref_grid.shape
```
((300, 300), (12, 300, 300))
#### Setup Parameters
``` python
# one stop shop for all Parameters and Data
params = setup_params(fpath, R=1)
```
['Coils', 'InScale', 'rawdata', 'trajectory']
#### Setup MRI Operator
``` python
# Set up MRI operator
mrimodel = MriImagingModel(params)
mriop = MriOperator(data_par=params["Data"],optimizer_par=params["Optimizer"])
mriop.set_operator(mrimodel)
# Single Coil images after FFT
my_grid = mriop.operator.NuFFT.adjoint(params['Data']['rawdata_density_cor'])
```
``` python
my_grid.shape, ref_grid.shape
```
((12, 300, 300), (12, 300, 300))
``` python
# test gridding recon results
np.allclose(ref_grid, my_grid)
```
True
``` python
# test gridding recon results
np.array_equal(ref_grid, my_grid)
```
False
``` python
print_metrics(np.abs(ref_grid[0]), np.abs(my_grid[0]))
```
+---------+-----------+
| Metrics | Values |
+---------+-----------+
| MSE | 1.472e-24 |
| NMSE | 5.905e-15 |
| RMSE | 1.213e-12 |
| NRMSE | 7.684e-08 |
| PSNR | 154.87 |
| SSIM | 1.0 |
+---------+-----------+
``` python
show_image_grid(my_grid, figsize=(10,10), rows=3, cols=4)
```
![](index_files/figure-commonmark/cell-20-output-1.png)
``` python
show_image_grid(rss_rec(my_grid), figsize=(10,10))
```
![](index_files/figure-commonmark/cell-21-output-1.png)
### Gradient Descent
``` python
guess = np.zeros((params['Data']['image_dim'],params['Data']['image_dim']))
SD_result, SD_residuals, SD_ref_res = steepest_descent(mriop, guess,
params['Data']['rawdata_density_cor'],
iters=50,
ref=ref_cg)
```
Residuum at iter 50 : 6.553379e-06
``` python
show_compared_images(np.abs(ref_cg), np.abs(SD_result), diff_fac=10,
labels=['Reference', 'Steepest Descent', 'diff'])
```
![](index_files/figure-commonmark/cell-23-output-1.png)
``` python
np.allclose(ref_cg, SD_result)
```
False
``` python
print_metrics(np.abs(ref_cg), np.abs(SD_result))
```
+---------+-----------+
| Metrics | Values |
+---------+-----------+
| MSE | 5.633e-14 |
| NMSE | 7.888e-05 |
| RMSE | 2.373e-07 |
| NRMSE | 8.882e-03 |
| PSNR | 55.242 |
| SSIM | 0.9988 |
+---------+-----------+
### CG’s Semi-Convergence Behavior
``` python
CG_result, CG_residuals, CG_ref_res = conjugate_gradient(mriop, guess,
params['Data']['rawdata_density_cor'],
iters=50,
ref=ref_cg)
```
Residuum at iter 50 : 2.993229e-06
``` python
plt.plot(np.log10(SD_ref_res),'*--', label='SD reference_norms');
plt.plot(np.log10(SD_residuals),'*--', label='SD residual_norms');
plt.plot(np.log10(CG_ref_res),'*--', label='CG reference_norms');
plt.plot(np.log10(CG_residuals),'*--', label='CG residual_norms');
plt.grid();
plt.xlabel("# iteration")
plt.ylabel("residuals (log10)")
plt.legend();
```
![](index_files/figure-commonmark/cell-27-output-1.png)
### Conjugate Gradient vs. REF
Based on the “semi-convergence” plot above, the optimal number of
iterations for CG and SD are around 10 and 28, respectively.
``` python
CG_result_vs_REF, _, _ = conjugate_gradient(mriop, guess,
params['Data']['rawdata_density_cor'],
iters=10,
ref=ref_cg)
```
Residuum at iter 10 : 1.826174e-05
``` python
show_compared_images(np.abs(ref_cg), np.abs(CG_result_vs_REF), diff_fac=200000,
labels=['Reference', 'Conjugate Gradient', 'diff'])
```
![](index_files/figure-commonmark/cell-29-output-1.png)
``` python
np.allclose(ref_cg, CG_result_vs_REF)
```
True
``` python
print_metrics(np.abs(ref_cg), np.abs(CG_result_vs_REF))
```
+---------+-----------+
| Metrics | Values |
+---------+-----------+
| MSE | 1.196e-22 |
| NMSE | 1.675e-13 |
| RMSE | 1.094e-11 |
| NRMSE | 4.093e-07 |
| PSNR | 141.97 |
| SSIM | 1.0 |
+---------+-----------+
## Developer install
If you want to develop `cgsense2023` yourself, please use an editable
installation of `cgsense2023`.
`git clone https://github.com/hdocmsu/cgsense2023.git`
`pip install -e "cgsense2023[dev]"`
You also need to use an editable installation of
[nbdev](https://github.com/fastai/nbdev),
[fastcore](https://github.com/fastai/fastcore), and
[execnb](https://github.com/fastai/execnb).
Happy Coding!!!
## References
This template was created based on the below references. The list is not
exhaustive so if you notice any missing references, please [report an
issue](https://github.com/hdocmsu/cgsense2023/issues/new). I will
promptly correct it.
- [RRSG_Challenge_01](https://github.com/ISMRM/rrsg_challenge_01) github
repository
- [fastMRI](https://github.com/facebookresearch/fastMRI) github
repository
- [Original CG-SENSE Paper by Pruessmann et. al.,
2001](https://onlinelibrary.wiley.com/doi/10.1002/mrm.1241)
- [CG-SENSE revisited: Results from the first ISMRM reproducibility
challenge](https://onlinelibrary.wiley.com/doi/10.1002/mrm.28569)
- [Dwight Nishimura, (Published Jan 10, 2010), “Principles of Magnetic
Resonance Imaging,” Stanford University, Palo Alto,
CA](https://www.lulu.com/shop/dwight-nishimura/principles-of-magnetic-resonance-imaging/hardcover/product-1gvnv7yn.html?page=1&pageSize=4)
- [Prof. James V. Burke’s Lecture on “The Conjugate Gradient
Algorithm”](https://sites.math.washington.edu/~burke/crs/408/lectures/L14-CG.pdf)
- [Magnetic Resonance Image Reconstruction: Theory, Methods, and
Applications,
(2022)](https://shop.elsevier.com/books/magnetic-resonance-image-reconstruction/akcakaya/978-0-12-822726-8)
- [sigPy github repo](https://github.com/mikgroup/sigpy)
## Invitation to Contributions
If you would like to contribute to improve this repository please feel
free [to propose
here](https://github.com/hdocmsu/cgsense2023/issues/new).
## License
MIT License as seen from the [Original Repo’s
License](https://github.com/ISMRM/rrsg_challenge_01/blob/master/LICENSE)
> MIT License
>
> Copyright (c) 2020 ISMRM Reproducible Research Study Group
>
> Permission is hereby granted, free of charge, to any person obtaining
> a copy of this software and associated documentation files (the
> “Software”), to deal in the Software without restriction, including
> without limitation the rights to use, copy, modify, merge, publish,
> distribute, sublicense, and/or sell copies of the Software, and to
> permit persons to whom the Software is furnished to do so, subject to
> the following conditions:
>
> The above copyright notice and this permission notice shall be
> included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Raw data
{
"_id": null,
"home_page": "https://github.com/hdocmsu/cgsense2023/",
"name": "cgsense2023",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "nbdev",
"author": "Hung Do, PhD",
"author_email": "clinicalcollaborations@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/18/db/a9ec713570588ea27e03c1152a28cc0c987c368c0daa897230ac778c074b/cgsense2023-0.0.5.tar.gz",
"platform": null,
"description": "# CG-SENSE HOME\n\n\n<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->\n\n## W.I.P Tasks\n\nContributions to the below tasks are highly appreciated!\n\n- [ ] Document the standardization of the raw h5-file, otherwise\n `read_data()` has to be modified every time a deviation in h5-file is\n encountered.\n\n- [ ] Refactor, simplify, modularize the gridding reconstructions.\n Currently, it is difficult to understand, especially for new learner.\n\n- [x] Add `save_intermediate` flag in gradient descent or conjugate\n gradient optimization functions to store intermediate reconstruction\n in each iteration.\n\n- [ ] Add theoretical descriptions on MRI, MRI recons, and gradient\n Descent, and gonjugate gradient algorithms.\n\n## Homepage\n\nThis tutorial <https://hdocmsu.github.io/cgsense2023/> was written by\nHung Do based on the\n[RRSG_Challenge_01](https://github.com/ISMRM/rrsg_challenge_01) github\nrepository.\n\n## How to Cite\n\n[![](https://zenodo.org/badge/DOI/10.5281/zenodo.10547817.svg)](https://doi.org/10.5281/zenodo.10547817)\n\n> APA style:\n>\n> *Do, H. (2024). CG-SENSE Tutorial version 0.0.3 (0.0.3). Zenodo.\n> https://doi.org/10.5281/zenodo.10547817*\n\n> IEEE style:\n>\n> *H. Do, \u201cCG-SENSE Tutorial version 0.0.3\u201d. Zenodo, Jan.\u00a021, 2024. doi:\n> 10.5281/zenodo.10547817.*\n\n## pip install\n\nThe [cgsense2023](https://pypi.org/project/cgsense2023/) package was\nuploaded to [PyPI](https://pypi.org/) and can be easily installed using\nthe below command.\n\n`pip install cgsense2023`\n\n## How to use\n\n### Plot Module\n\n``` python\nfrom cgsense2023.plot import *\nimport numpy as np\n```\n\n``` python\n# Sequential - full - spoke radial trajectory\ntraj_full = gen_radial_traj(golden=False, full_spoke=True)\nshow_trajectory(traj_full, golden=True, figsize=(10,8))\n```\n\n![](index_files/figure-commonmark/cell-3-output-1.png)\n\n``` python\n# golden - full - spoke radial trajectory\ntraj_full_golden = gen_radial_traj(golden=True, full_spoke=True)\nshow_trajectory(traj_full_golden, golden=True, figsize=(10,8))\n```\n\n![](index_files/figure-commonmark/cell-4-output-1.png)\n\n``` python\nNim, Nx, Ny = 12, 128, 256\nx1 = np.random.randn(Nim, Nx, Ny)\nx2 = np.random.randn(1, Nx, Ny)\n```\n\n``` python\nshow_image_grid(x1)\n```\n\n Warning: number of images (12) is larger than number of panels (2x5)!\n\n![](index_files/figure-commonmark/cell-6-output-2.png)\n\n``` python\nshow_image_grid(x2)\n```\n\n![](index_files/figure-commonmark/cell-7-output-1.png)\n\n### Metrics Module\n\n``` python\nfrom cgsense2023.metrics import *\nimport numpy as np\n```\n\n``` python\n# same dimensions\nNim, Nx, Ny = 11, 128, 256\nx1 = np.random.randn(1, Nx, Ny)\nx2 = np.random.randn(1, Nx, Ny)\nprint_metrics(x1, x2)\n```\n\n +---------+-----------+\n | Metrics | Values |\n +---------+-----------+\n | MSE | 1.999e+00 |\n | NMSE | 2.000e+00 |\n | RMSE | 1.414e+00 |\n | NRMSE | 1.414e+00 |\n | PSNR | 14.981 |\n | SSIM | 0.0092604 |\n +---------+-----------+\n\n### Gridding Reconstruction\n\n``` python\nfrom cgsense2023.math import *\nfrom cgsense2023.io import *\nimport cgsense2023 as cgs2003\nfrom cgsense2023.mri import *\nfrom cgsense2023.optimizer import *\nimport h5py\nimport numpy as np\nimport matplotlib.pyplot as plt\n```\n\n#### Data Paths\n\n``` python\n# path to the data file\nfpath = '../testdata/rawdata_brain.h5'\n# path to the reference results\nrpath = '../testdata/CG_reco_inscale_True_denscor_True_reduction_1.h5'\n```\n\n``` python\nwith h5py.File(rpath, 'r') as rf:\n print(list(rf.keys()))\n ref_cg = np.squeeze(rf['CG_reco'][()][-1])\n ref_grid = np.squeeze(rf['Coil_images'][()])\n```\n\n ['CG_reco', 'Coil_images']\n\n``` python\nref_cg.shape, ref_grid.shape\n```\n\n ((300, 300), (12, 300, 300))\n\n#### Setup Parameters\n\n``` python\n# one stop shop for all Parameters and Data\nparams = setup_params(fpath, R=1)\n```\n\n ['Coils', 'InScale', 'rawdata', 'trajectory']\n\n#### Setup MRI Operator\n\n``` python\n# Set up MRI operator\nmrimodel = MriImagingModel(params)\nmriop = MriOperator(data_par=params[\"Data\"],optimizer_par=params[\"Optimizer\"])\nmriop.set_operator(mrimodel)\n# Single Coil images after FFT\nmy_grid = mriop.operator.NuFFT.adjoint(params['Data']['rawdata_density_cor'])\n```\n\n``` python\nmy_grid.shape, ref_grid.shape\n```\n\n ((12, 300, 300), (12, 300, 300))\n\n``` python\n# test gridding recon results\nnp.allclose(ref_grid, my_grid)\n```\n\n True\n\n``` python\n# test gridding recon results\nnp.array_equal(ref_grid, my_grid)\n```\n\n False\n\n``` python\nprint_metrics(np.abs(ref_grid[0]), np.abs(my_grid[0]))\n```\n\n +---------+-----------+\n | Metrics | Values |\n +---------+-----------+\n | MSE | 1.472e-24 |\n | NMSE | 5.905e-15 |\n | RMSE | 1.213e-12 |\n | NRMSE | 7.684e-08 |\n | PSNR | 154.87 |\n | SSIM | 1.0 |\n +---------+-----------+\n\n``` python\nshow_image_grid(my_grid, figsize=(10,10), rows=3, cols=4)\n```\n\n![](index_files/figure-commonmark/cell-20-output-1.png)\n\n``` python\nshow_image_grid(rss_rec(my_grid), figsize=(10,10))\n```\n\n![](index_files/figure-commonmark/cell-21-output-1.png)\n\n### Gradient Descent\n\n``` python\nguess = np.zeros((params['Data']['image_dim'],params['Data']['image_dim']))\nSD_result, SD_residuals, SD_ref_res = steepest_descent(mriop, guess, \n params['Data']['rawdata_density_cor'], \n iters=50,\n ref=ref_cg)\n```\n\n Residuum at iter 50 : 6.553379e-06\n\n``` python\nshow_compared_images(np.abs(ref_cg), np.abs(SD_result), diff_fac=10, \n labels=['Reference', 'Steepest Descent', 'diff'])\n```\n\n![](index_files/figure-commonmark/cell-23-output-1.png)\n\n``` python\nnp.allclose(ref_cg, SD_result)\n```\n\n False\n\n``` python\nprint_metrics(np.abs(ref_cg), np.abs(SD_result))\n```\n\n +---------+-----------+\n | Metrics | Values |\n +---------+-----------+\n | MSE | 5.633e-14 |\n | NMSE | 7.888e-05 |\n | RMSE | 2.373e-07 |\n | NRMSE | 8.882e-03 |\n | PSNR | 55.242 |\n | SSIM | 0.9988 |\n +---------+-----------+\n\n### CG\u2019s Semi-Convergence Behavior\n\n``` python\nCG_result, CG_residuals, CG_ref_res = conjugate_gradient(mriop, guess, \n params['Data']['rawdata_density_cor'], \n iters=50,\n ref=ref_cg)\n```\n\n Residuum at iter 50 : 2.993229e-06\n\n``` python\nplt.plot(np.log10(SD_ref_res),'*--', label='SD reference_norms');\nplt.plot(np.log10(SD_residuals),'*--', label='SD residual_norms');\nplt.plot(np.log10(CG_ref_res),'*--', label='CG reference_norms');\nplt.plot(np.log10(CG_residuals),'*--', label='CG residual_norms');\nplt.grid();\nplt.xlabel(\"# iteration\")\nplt.ylabel(\"residuals (log10)\")\nplt.legend();\n```\n\n![](index_files/figure-commonmark/cell-27-output-1.png)\n\n### Conjugate Gradient vs.\u00a0REF\n\nBased on the \u201csemi-convergence\u201d plot above, the optimal number of\niterations for CG and SD are around 10 and 28, respectively.\n\n``` python\nCG_result_vs_REF, _, _ = conjugate_gradient(mriop, guess, \n params['Data']['rawdata_density_cor'], \n iters=10,\n ref=ref_cg)\n```\n\n Residuum at iter 10 : 1.826174e-05\n\n``` python\nshow_compared_images(np.abs(ref_cg), np.abs(CG_result_vs_REF), diff_fac=200000, \n labels=['Reference', 'Conjugate Gradient', 'diff'])\n```\n\n![](index_files/figure-commonmark/cell-29-output-1.png)\n\n``` python\nnp.allclose(ref_cg, CG_result_vs_REF)\n```\n\n True\n\n``` python\nprint_metrics(np.abs(ref_cg), np.abs(CG_result_vs_REF))\n```\n\n +---------+-----------+\n | Metrics | Values |\n +---------+-----------+\n | MSE | 1.196e-22 |\n | NMSE | 1.675e-13 |\n | RMSE | 1.094e-11 |\n | NRMSE | 4.093e-07 |\n | PSNR | 141.97 |\n | SSIM | 1.0 |\n +---------+-----------+\n\n## Developer install\n\nIf you want to develop `cgsense2023` yourself, please use an editable\ninstallation of `cgsense2023`.\n\n`git clone https://github.com/hdocmsu/cgsense2023.git`\n\n`pip install -e \"cgsense2023[dev]\"`\n\nYou also need to use an editable installation of\n[nbdev](https://github.com/fastai/nbdev),\n[fastcore](https://github.com/fastai/fastcore), and\n[execnb](https://github.com/fastai/execnb).\n\nHappy Coding!!!\n\n## References\n\nThis template was created based on the below references. The list is not\nexhaustive so if you notice any missing references, please [report an\nissue](https://github.com/hdocmsu/cgsense2023/issues/new). I will\npromptly correct it.\n\n- [RRSG_Challenge_01](https://github.com/ISMRM/rrsg_challenge_01) github\n repository\n\n- [fastMRI](https://github.com/facebookresearch/fastMRI) github\n repository\n\n- [Original CG-SENSE Paper by Pruessmann et. al.,\n 2001](https://onlinelibrary.wiley.com/doi/10.1002/mrm.1241)\n\n- [CG-SENSE revisited: Results from the first ISMRM reproducibility\n challenge](https://onlinelibrary.wiley.com/doi/10.1002/mrm.28569)\n\n- [Dwight Nishimura, (Published Jan 10, 2010), \u201cPrinciples of Magnetic\n Resonance Imaging,\u201d Stanford University, Palo Alto,\n CA](https://www.lulu.com/shop/dwight-nishimura/principles-of-magnetic-resonance-imaging/hardcover/product-1gvnv7yn.html?page=1&pageSize=4)\n\n- [Prof.\u00a0James V. Burke\u2019s Lecture on \u201cThe Conjugate Gradient\n Algorithm\u201d](https://sites.math.washington.edu/~burke/crs/408/lectures/L14-CG.pdf)\n\n- [Magnetic Resonance Image Reconstruction: Theory, Methods, and\n Applications,\n (2022)](https://shop.elsevier.com/books/magnetic-resonance-image-reconstruction/akcakaya/978-0-12-822726-8)\n\n- [sigPy github repo](https://github.com/mikgroup/sigpy)\n\n## Invitation to Contributions\n\nIf you would like to contribute to improve this repository please feel\nfree [to propose\nhere](https://github.com/hdocmsu/cgsense2023/issues/new).\n\n## License\n\nMIT License as seen from the [Original Repo\u2019s\nLicense](https://github.com/ISMRM/rrsg_challenge_01/blob/master/LICENSE)\n\n> MIT License\n>\n> Copyright (c) 2020 ISMRM Reproducible Research Study Group\n>\n> Permission is hereby granted, free of charge, to any person obtaining\n> a copy of this software and associated documentation files (the\n> \u201cSoftware\u201d), to deal in the Software without restriction, including\n> without limitation the rights to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software, and to\n> permit persons to whom the Software is furnished to do so, subject to\n> the following conditions:\n>\n> The above copyright notice and this permission notice shall be\n> included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Conjugate Gradient SENSE (CG-SENSE) MRI Reconstruction",
"version": "0.0.5",
"project_urls": {
"Homepage": "https://github.com/hdocmsu/cgsense2023/"
},
"split_keywords": [
"nbdev"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "69cd2f3bfd1f6bda1f00320b4660a02040a21aea65eff3a4158c78a7e3b06710",
"md5": "ac858d29eedf9b9f848a6d2b304a8f70",
"sha256": "e0e74b35f7db20223cd9645cfba59571edc5823072350dc87118528e4354aa56"
},
"downloads": -1,
"filename": "cgsense2023-0.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ac858d29eedf9b9f848a6d2b304a8f70",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 21042,
"upload_time": "2024-03-14T22:55:30",
"upload_time_iso_8601": "2024-03-14T22:55:30.494831Z",
"url": "https://files.pythonhosted.org/packages/69/cd/2f3bfd1f6bda1f00320b4660a02040a21aea65eff3a4158c78a7e3b06710/cgsense2023-0.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "18dba9ec713570588ea27e03c1152a28cc0c987c368c0daa897230ac778c074b",
"md5": "e86ddf1afaf63c294382048bc8cfaa75",
"sha256": "99da0a40bef127764f026718c0203bb3f55dcdbf882209041b0b371578d549aa"
},
"downloads": -1,
"filename": "cgsense2023-0.0.5.tar.gz",
"has_sig": false,
"md5_digest": "e86ddf1afaf63c294382048bc8cfaa75",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 22234,
"upload_time": "2024-03-14T22:55:32",
"upload_time_iso_8601": "2024-03-14T22:55:32.067531Z",
"url": "https://files.pythonhosted.org/packages/18/db/a9ec713570588ea27e03c1152a28cc0c987c368c0daa897230ac778c074b/cgsense2023-0.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-14 22:55:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "hdocmsu",
"github_project": "cgsense2023",
"github_not_found": true,
"lcname": "cgsense2023"
}