Skip to content

[v1.5.x] Implemented rotate3D#302

Open
mcencini wants to merge 27 commits intoimr-framework:masterfrom
mcencini:rotate3D
Open

[v1.5.x] Implemented rotate3D#302
mcencini wants to merge 27 commits intoimr-framework:masterfrom
mcencini:rotate3D

Conversation

@mcencini
Copy link
Collaborator

@schuenke @FrankZijlstra this PR re-open #244, which was closed because apparently @BenWilhelmUniklinikFreiburg GitHub profile does not exists anymore.

@github-actions
Copy link

github-actions bot commented Jul 31, 2025

Coverage

Coverage Report
FileStmtsMissCoverMissing
/home/runner/.local/lib/python3.12/site-packages/pypulseq
   add_gradients.py1372979%44, 52, 61, 85, 92, 125–128, 135–136, 155, 162, 177, 187–190, 194–225, 230, 261
   add_ramps.py36360%1–92
   align.py35489%41, 45, 69, 73
   calc_duration.py25196%37
   calc_ramp.py2202162%48–359
   calc_rf_bandwidth.py372824%45–81, 85–89
   check_timing.py962970%78, 82, 107, 180, 199, 232, 239, 249–293
   compress_shape.py30197%28
   convert.py40880%42, 48, 66, 72–73, 82, 88–89
   event_lib.py961485%6–9, 48–51, 70–71, 205–210
   make_adc.py981486%77, 80, 90–94, 97, 146, 149, 153, 159, 163, 202, 204, 206, 214
   make_adiabatic_pulse.py1323970%204–208, 228–232, 240–241, 264, 270, 339–358, 462–471, 509–517
   make_arbitrary_grad.py531572%71, 74, 77, 80, 96–98, 107, 109, 117–121, 130
   make_arbitrary_rf.py756316%95–179
   make_block_pulse.py48394%121–125, 128
   make_delay.py9189%27
   make_digital_output_pulse.py16288%42, 50
   make_extended_trapezoid.py561279%67, 70, 76, 82, 85, 88, 91, 94, 116, 134, 136, 139
   make_extended_trapezoid_area.py93397%52, 227, 230
   make_gauss_pulse.py732073%139–143, 146–170, 177, 180
   make_label.py22482%64, 66, 68, 75
   make_sigpy_pulse.py1193075%12–13, 121, 124, 128, 165–169, 173, 176–177, 180–181, 196, 203, 208, 220, 223, 248–258, 272, 275, 305–315
   make_sinc_pulse.py701086%102, 108, 136–140, 144, 147–148, 151–152, 174
   make_soft_delay.py26292%107, 125
   make_trapezoid.py111794%177, 190, 196, 214, 232, 237, 255
   make_trigger.py16288%47, 55
   opts.py66986%78, 83, 102, 142, 166–170
   points_to_waveform.py9189%27
   rotate3D.py54689%44, 54, 57, 59, 93–94
   rotate.py76593%59, 83, 126, 133–134
   scale_grad.py30197%65
   sigpy_pulse_opts.py26773%34–41
   split_gradient.py393121%46–103
   split_gradient_at.py702761%63–90, 110, 114, 118–120, 154–156
   traj_to_grad.py13931%26–40
/home/runner/.local/lib/python3.12/site-packages/pypulseq/SAR
   SAR_calc.py5180%9
/home/runner/.local/lib/python3.12/site-packages/pypulseq/Sequence
   block.py4697983%63, 66, 74, 80, 95, 103, 109, 120, 123, 126, 134, 139, 148, 159, 167, 207, 209, 213, 225, 274, 278, 294, 319–345, 382–385, 421–429, 436, 466–470, 512, 518, 551, 587–594, 611, 621, 647, 685, 703, 706, 724, 738, 765, 844, 881, 905
   calc_grad_spectrum.py81766%68–190
   calc_pns.py403122%45–96
   ext_test_report.py1441192%61, 138, 149–150, 237–243
   install.py754244%31, 52, 69, 71, 112–131, 148, 181–184, 200–212, 254–278
   parula.py4250%19–86
   read_seq.py4003990%44–45, 110, 117, 130, 133–134, 138, 184, 228, 401, 422–439, 502, 505, 590, 614, 654, 685, 701–705, 712, 823, 834
   sequence.py63112880%10–13, 105–115, 136–149, 196, 261–264, 311, 355, 431, 458–463, 500, 528–531, 622, 650–659, 671, 693, 734–737, 791, 829, 840–841, 847, 858, 864, 866, 874, 907–915, 1045, 1135, 1141, 1144, 1147, 1184, 1309–1322, 1380, 1402–1404, 1425, 1488, 1496, 1563, 1574–1587, 1656–1657, 1668–1686, 1710, 1740–1748, 1784, 1798–1808
   write_seq.py362798%45, 77–79, 313, 347–349, 499
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils
   cumsum.py14193%17
   paper_plot.py63588%47–130
   safe_pns_prediction.py12611310%50–87, 102–189, 197–214, 222, 244–250, 279–286, 310–336, 344–383, 396–411, 415
   seq_plot.py38919051%20, 98, 130–131, 150, 167–169, 174–216, 226–233, 240–305, 309–315, 319–327, 349, 351, 354, 379–401, 446–447, 450–453, 476–485, 497, 512–522, 531–533, 551–553, 555–556, 558–559, 592–604, 619–620, 636–653, 694–698
   tracing.py16662%33–34, 42, 54–55, 75
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils/siemens
   asc_to_hw.py58539%21–28, 48–106
   readasc.py48456%25–100
TOTAL5184157170% 

Tests Skipped Failures Errors Time
1480 24 💤 0 ❌ 0 🔥 2m 16s ⏱️

@mcencini mcencini mentioned this pull request Jan 12, 2026
8 tasks
@mcencini mcencini changed the title [Reopen] Implemented rotate3D [v1.5.1] Implemented rotate3D Jan 14, 2026
@mcencini
Copy link
Collaborator Author

This is just a friendly reminder about this issue - apologies if it is already under the radar. I just wanted to point out that this feature would be required both by rotation extension (e.g., for plotting) and new 1.5.1 FOV (e.g., here) - unless we want to write custom rotation functions for both applications, which would probably harder to maintain. It would be great if someone wants to review this when they have time.

@mcencini mcencini changed the title [v1.5.1] Implemented rotate3D [v1.5.x] Implemented rotate3D Jan 14, 2026
@mcencini
Copy link
Collaborator Author

mcencini commented Feb 25, 2026

@m-a-x-i-m-z I think the initial BenWilhelmUniklinikFreiburg commits were done before license change - did Ben Wilhelm work with you and do you have any way to ask him if it is ok to keep his changes under MIT license? Or being the changes a port of your MATLAB code, does that fall under MATLAB pulseq copyright anyway (MIT)?

@m-a-x-i-m-z
Copy link

Hi Matteo,

as mentioned before, we have another version of rotate3D in our lab, which we will push in the coming days. It then will not be affected by the GLP problem as well.

Best regards,
Maxim

@mcencini
Copy link
Collaborator Author

mcencini commented Mar 4, 2026

@m-a-x-i-m-z sweet, thank you so much! I am keeping this open for the moment as it contains some commits I did which may be useful for the tests and we may cherry pick if needed.

@fzimmermann89
Copy link
Collaborator

I have also a similair function here under MIT.
https://gist.github.com/fzimmermann89/6c27a2a4bf27354857e8451274e8b23b
without tests, and using scipy Rotation instead of a naked numpy array for the rotation matrix

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.

4 participants