Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Faster DCF based on pipe #629

Draft
wants to merge 57 commits into
base: main
Choose a base branch
from
Draft

Faster DCF based on pipe #629

wants to merge 57 commits into from

Conversation

fzimmermann89
Copy link
Member

@fzimmermann89 fzimmermann89 commented Feb 1, 2025

Not quite pipe/jackson, but would work with any nufft implementation (finuft does not have separate spread kernel)

for a quick draft, I just added it to the direct recon example.

@schuenke, @JoHa0811, @ckolbPTB
do you have any spiral data you could easily test this on and post a result?

closes #82

@fzimmermann89 fzimmermann89 changed the base branch from main to separate_nufft_op February 1, 2025 01:01
Copy link
Contributor

github-actions bot commented Feb 1, 2025

Coverage

Coverage Report
FileStmtsMissCoverMissing
src/mrpro/algorithms/csm
   inati.py24196%44
   walsh.py16194%53
src/mrpro/algorithms/dcf
   dcf_voronoi.py55493%15, 55–56, 89
src/mrpro/algorithms/optimizers
   adam.py20195%101
   pdhg.py79396%177–178, 184
src/mrpro/algorithms/reconstruction
   DirectReconstruction.py281643%59–79, 93
   IterativeSENSEReconstruction.py13192%79
   Reconstruction.py502256%42, 54–56, 80–87, 108–117
   RegularizedIterativeSENSEReconstruction.py411759%97–101, 115–140
src/mrpro/data
   AcqInfo.py128398%26, 169, 207
   CsmData.py29390%15, 84–86
   DcfData.py45882%18, 66, 78–83
   IData.py67987%120, 126, 130, 160–168
   IHeader.py75791%75, 109, 127–131
   KData.py2142588%111–112, 127, 134, 144, 152, 206–207, 245, 250–251, 270–281, 440, 442, 507, 522, 559, 590, 599
   KHeader.py1531789%25, 119–123, 150, 199, 210, 217–218, 221, 228, 260–271
   KNoise.py311552%39–52, 56–61
   KTrajectory.py811285%112–117, 120–122, 207–211
   MoveDataMixin.py1401887%28, 126, 142, 156–158, 220, 336–338, 351, 430, 450–451, 453, 468–469, 471
   QData.py39782%42, 65–73
   Rotation.py6823595%100, 198, 335, 433, 477, 495, 582, 584, 593, 627, 629, 692, 769, 774, 777, 792, 809, 814, 890, 1078, 1083, 1086, 1110, 1114, 1242, 1244, 1252–1253, 1317, 1399, 1702, 1854, 1889, 1893, 2004
   SpatialDimension.py2322191%34, 104, 141, 148, 154, 274–276, 289–291, 325, 343, 356, 369, 382, 395, 404–405, 420, 429
   acq_filters.py12192%47
src/mrpro/data/traj_calculators
   KTrajectoryCalculator.py25292%23, 45
   KTrajectoryIsmrmrd.py13285%41, 50
   KTrajectoryPulseq.py23196%55
src/mrpro/operators
   CartesianSamplingOp.py89397%118, 157, 280
   ConstraintsOp.py60297%46, 48
   EndomorphOperator.py65297%228, 234
   FiniteDifferenceOp.py27293%40, 105
   FourierOp.py73297%241, 246
   Functional.py77988%20–22, 117, 119, 226–228, 242
   GridSamplingOp.py136993%72–73, 82–83, 90–91, 94, 96, 98
   LinearOperator.py2001095%48, 107, 217, 244, 251, 292, 301, 309, 326, 361
   LinearOperatorMatrix.py1621988%82, 119, 152, 161, 166, 175–178, 191–194, 202–203, 208–209, 221, 310, 337, 365
   MultiIdentityOp.py13285%43, 48
   NonUniformFastFourierOp.py171498%98, 373, 423, 428
   Operator.py79297%32, 88
   ProximableFunctionalSeparableSum.py39392%50, 103, 110
   SliceProjectionOp.py174895%45, 62, 64, 70, 206, 227, 260, 300
   WaveletOp.py119596%151, 169, 204, 209, 232
   ZeroPadOp.py16194%30
src/mrpro/utils
   filters.py62297%44, 49
   reshape.py65198%191
   slice_profiles.py47687%21, 37, 116–119, 152
   sliding_window.py34197%34
   split_idx.py10280%43, 47
   summarize_tensorvalues.py11918%20–29
   typing.py211148%8–23
   zero_pad_or_crop.py31681%26, 30, 55, 58, 61, 64
TOTAL512637393% 

Tests Skipped Failures Errors Time
2399 0 💤 0 ❌ 0 🔥 1m 20s ⏱️

Copy link
Contributor

github-actions bot commented Feb 1, 2025

📚 Documentation

📁 Download as zip
🔍 View online

@fzimmermann89 fzimmermann89 changed the title Estimatedcf Faster DCF based on pipe Feb 1, 2025
@fzimmermann89 fzimmermann89 marked this pull request as draft February 3, 2025 00:47
Base automatically changed from separate_nufft_op to main February 4, 2025 09:34
Copy link
Contributor

Coverage

Coverage Report
FileStmtsMissCoverMissing
src/mrpro
   _version.py6267%7–8
src/mrpro/algorithms/csm
   inati.py24196%44
   walsh.py16194%53
src/mrpro/algorithms/dcf
   dcf_voronoi.py55493%15, 55–56, 89
src/mrpro/algorithms/optimizers
   adam.py20195%101
   pdhg.py79396%177–178, 184
src/mrpro/algorithms/reconstruction
   DirectReconstruction.py281643%59–79, 93
   IterativeSENSEReconstruction.py13192%79
   Reconstruction.py502256%42, 54–56, 80–87, 108–117
   RegularizedIterativeSENSEReconstruction.py411759%97–101, 115–140
src/mrpro/data
   AcqInfo.py128398%26, 169, 207
   CsmData.py29390%15, 84–86
   DcfData.py45882%18, 66, 78–83
   IData.py60887%129, 142, 171–179
   IHeader.py961189%103, 106, 116, 119, 122, 125, 162–166
   KData.py2142588%111–112, 127, 134, 144, 152, 206–207, 245, 250–251, 270–281, 440, 442, 507, 522, 559, 590, 599
   KHeader.py1531789%25, 119–123, 150, 199, 210, 217–218, 221, 228, 260–271
   KNoise.py311552%39–52, 56–61
   KTrajectory.py811285%112–117, 120–122, 207–211
   MoveDataMixin.py1401887%28, 126, 142, 156–158, 220, 336–338, 351, 430, 450–451, 453, 468–469, 471
   QData.py39782%42, 65–73
   Rotation.py6823595%100, 198, 335, 433, 477, 495, 582, 584, 593, 627, 629, 692, 769, 774, 777, 792, 809, 814, 890, 1078, 1083, 1086, 1110, 1114, 1242, 1244, 1252–1253, 1317, 1399, 1702, 1854, 1889, 1893, 2004
   SpatialDimension.py2322191%34, 104, 141, 148, 154, 274–276, 289–291, 325, 343, 356, 369, 382, 395, 404–405, 420, 429
   acq_filters.py12192%47
src/mrpro/data/traj_calculators
   KTrajectoryCalculator.py25292%23, 45
   KTrajectoryIsmrmrd.py13285%41, 50
   KTrajectoryPulseq.py23196%55
src/mrpro/operators
   CartesianSamplingOp.py89397%118, 157, 280
   ConstraintsOp.py60297%46, 48
   EndomorphOperator.py32294%52, 58
   FiniteDifferenceOp.py27293%40, 105
   FourierOp.py73297%234, 239
   Functional.py77988%20–22, 117, 119, 226–228, 242
   GridSamplingOp.py136993%72–73, 82–83, 90–91, 94, 96, 98
   LinearOperator.py2001095%48, 107, 217, 244, 251, 292, 301, 309, 326, 361
   LinearOperatorMatrix.py1621988%82, 119, 152, 161, 166, 175–178, 191–194, 202–203, 208–209, 221, 310, 337, 364
   MultiIdentityOp.py13285%43, 48
   NonUniformFastFourierOp.py1771094%69, 96, 206, 208, 241, 243, 302, 356, 406, 411
   Operator.py79297%32, 88
   ProximableFunctionalSeparableSum.py39392%50, 103, 110
   SliceProjectionOp.py174895%45, 62, 64, 70, 206, 227, 260, 300
   WaveletOp.py119596%151, 169, 204, 209, 232
   ZeroPadOp.py16194%30
src/mrpro/utils
   filters.py62297%44, 49
   reshape.py75199%239
   slice_profiles.py47687%21, 37, 116–119, 152
   sliding_window.py34197%34
   split_idx.py10280%43, 47
   summarize_tensorvalues.py11918%20–29
   typing.py584522%9–217
   zero_pad_or_crop.py31681%26, 30, 55, 58, 61, 64
TOTAL516841892% 

Tests Skipped Failures Errors Time
2413 0 💤 0 ❌ 0 🔥 1m 11s ⏱️

@Stef-Martin
Copy link
Collaborator

image
image

For my data, it looks like this - way way faster but looks worse

@fzimmermann89
Copy link
Member Author

This is with single iteration?
Does increasing the iterations help?

@Stef-Martin
Copy link
Collaborator

whoops sry didn't even see that default iter of the estimate was set to 0 - just ran the script real quick.
So the one shown above was Jackson, so 0 iter. With pipe it is much better with 1 iteration:
image
By increasing the iterations, it gets worse, this is with 3 iter:
image

@fzimmermann89
Copy link
Member Author

Mhm. Maybe there is something wrong with the iterations then.

The one iteration case looks good though

@fzimmermann89
Copy link
Member Author

Let's have a look tomorrow.
Maybe compare the dcfs calculated by 1 and 3 iterations -- are there some points that get zero/really high?
just a

plt.matshow(dcf_operator2.matrix[0,0],vmax=2) # change vmax
plt.colorbar()

might help to identify issues.

Can you share an example file?

@fzimmermann89
Copy link
Member Author

... and let's check if the images are good enough to create CSMs from them.

@Stef-Martin
Copy link
Collaborator

Update: without .abs() in return weight.abs().squeeze(-4) it works

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Faster density compensation calulation
3 participants