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

added analytical 2D rad dcf #712

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

mxlutz
Copy link
Collaborator

@mxlutz mxlutz commented Mar 10, 2025

I added an analytical DCF for 2D radial trajectories.

So far, I tried them with the direct_reconstruction example, might make sense to include it somewhere else and also to implement some tests.

Addresses Issue #154

@mxlutz mxlutz requested a review from fzimmermann89 March 10, 2025 12:34
@mxlutz mxlutz linked an issue Mar 10, 2025 that may be closed by this pull request
Copy link
Contributor

github-actions bot commented Mar 10, 2025

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_radial.py25292%45, 86
   dcf_voronoi.py58297%15, 95
src/mrpro/algorithms/optimizers
   adam.py22195%104
   pdhg.py81396%178–179, 185
   pgd.py53492%107, 152–155
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.py145597%42, 121–122, 124, 233
   CsmData.py29390%15, 84–86
   DcfData.py45882%18, 66, 78–83
   EncodingLimits.py73396%33, 123, 126
   IData.py59886%118, 132, 159–167
   IHeader.py1361291%69–72, 253, 257, 261, 265, 299–303
   KData.py2012986%113–114, 129, 136, 147–157, 166, 174, 183, 217, 239–241, 277–278, 333–344, 473, 475, 545
   KHeader.py1412185%24, 109–115, 142, 190, 197–198, 201, 208, 225–232, 240–251
   KNoise.py311552%39–52, 56–61
   KTrajectory.py108397%166, 168, 188
   MoveDataMixin.py1401887%28, 126, 142, 156–158, 220, 336–338, 351, 430, 450–451, 453, 468–469, 471
   QData.py39782%42, 65–73
   Rotation.py7193595%101, 199, 336, 434, 478, 496, 583, 585, 594, 628, 630, 693, 770, 775, 778, 793, 810, 815, 891, 1079, 1084, 1087, 1111, 1115, 1243, 1245, 1253–1254, 1318, 1400, 1703, 1855, 1890, 1894, 2084
   SpatialDimension.py2322091%34, 104, 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.py27196%84
   KTrajectoryIsmrmrd.py19195%57
src/mrpro/operators
   CartesianSamplingOp.py96496%124, 163, 238, 305
   ConstraintsOp.py60297%46, 48
   EndomorphOperator.py32294%52, 58
   FiniteDifferenceOp.py27293%40, 105
   FourierOp.py90397%185, 257, 262
   Functional.py77988%20–22, 117, 119, 226–228, 242
   GridSamplingOp.py136993%71–72, 81–82, 89–90, 93, 95, 97
   LinearOperator.py201896%107, 217, 244, 251, 292, 301, 309, 326
   LinearOperatorMatrix.py1621988%82, 119, 152, 161, 166, 175–178, 191–194, 202–203, 208–209, 221, 310, 337, 364
   MultiIdentityOp.py13285%43, 48
   NonUniformFastFourierOp.py1881095%69, 96, 206, 208, 241, 243, 319, 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/phantoms
   brainweb.py2753189%325–335, 371, 427–430, 452–453, 458–459, 461–462, 466, 474, 481–482, 520, 586–587, 606–609, 620, 622, 657–658, 671
src/mrpro/utils
   filters.py62297%44, 49
   indexing.py170199%331
   reshape.py95298%110, 301
   slice_profiles.py47687%21, 37, 116–119, 152
   sliding_window.py34197%34
   split_idx.py10280%43, 47
   summarize_tensorvalues.py12375%23, 25, 27
   typing.py695520%9–235
   unit_conversion.py601477%32, 40, 42, 49, 51, 58, 60, 69, 80, 82, 101, 103, 124, 126
   zero_pad_or_crop.py31681%26, 30, 55, 58, 61, 64
TOTAL594047492% 

Tests Skipped Failures Errors Time
2753 0 💤 0 ❌ 0 🔥 1m 49s ⏱️

Copy link
Contributor

github-actions bot commented Mar 10, 2025

📚 Documentation

📁 Download as zip
🔍 View online

@fzimmermann89
Copy link
Member

I would leave the examples as-is.

The function should not be in dcf_voronoi, but in dcf_radial.py
you can import the dcf1d from voronoi.

Please also consider if the comments are really useful.
By default, try to have code that is self explanatory and avoid comments that describe what you are doing, such as
"# Compute the angle using atan2(vy, vx) instead of arccos"
instead, describe in a short sentence what the basic idea of the function is (either in docstring or as comment) and then only add comments to explain why you do things in a certain way if it is not obvious.

Can if not isinstance(center_idx, int): ever be false?

it would be great to write some unit tests, see tests for some examples

@mxlutz
Copy link
Collaborator Author

mxlutz commented Mar 11, 2025

Thanks for the feedback Felix, I changed everything accordingly and implemented a simple test comparing the results to a 2D rad equidistant dcf

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.

Feature Request/Discussion: analytical DCF
2 participants