Skip to content

Conversation

@mzaiss
Copy link

@mzaiss mzaiss commented Sep 8, 2025

This PR makes seq.plot() more flexible for interactive use and debugging.

  1. Added "clear=True" Parameter

The new clear flag defaulting to True ensures behavior as previously, which is that during repeated calls the plots in figure 1 and 2 get overwritten. Now, you can set clear=False to intentionally overlay sequences in the existing plots for direct comparison, which is useful for debugging subtle differences, but also great for educational purposes.

See here for two seqs with slightly different gradients (flat_area and flat_time vs. area and duration) and a corresponding shift in the rf pulse timing in this example.

SEQPLOT
  1. Return Figure and Axes Objects

The function now returns its figure and axes objects (fig1, axes1, fig2, axes2), which allows for post-plot customization (e.g., adding titles, annotations, signal) or extracting axes.

@github-actions
Copy link

github-actions bot commented Sep 8, 2025

Coverage

Coverage Report
FileStmtsMissCoverMissing
/home/runner/.local/lib/python3.12/site-packages/pypulseq
   add_gradients.py1235159%44, 52, 58, 61, 75–86, 92, 120–123, 130–131, 150, 157, 162–241
   add_ramps.py36360%1–89
   align.py35489%41, 45, 69, 73
   calc_duration.py25196%37
   calc_ramp.py2182142%45–353
   calc_rf_bandwidth.py272026%37–59, 63–67
   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.py921386%63, 72–76, 79, 128, 131, 135, 141, 145, 184, 186, 188, 196
   make_adiabatic_pulse.py1293970%196–200, 217–221, 229–230, 253, 259, 328–347, 451–460, 498–506
   make_arbitrary_grad.py37781%68, 71, 74, 77, 81, 83, 103
   make_arbitrary_rf.py665517%83–160
   make_block_pulse.py46393%112–116, 119
   make_delay.py9189%27
   make_digital_output_pulse.py16288%39, 47
   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.py692071%127–131, 134–158, 165, 168
   make_label.py22482%64, 66, 68, 75
   make_sigpy_pulse.py1163173%12–13, 112, 115, 119, 154, 157–161, 165, 168–169, 172–173, 188, 195, 200, 212, 215, 240–250, 264, 267, 297–307
   make_sinc_pulse.py681085%94, 100, 127–131, 135, 138–139, 142–143, 165
   make_soft_delay.py25292%102, 120
   make_trapezoid.py111794%177, 190, 196, 214, 232, 237, 255
   make_trigger.py16288%44, 52
   opts.py66986%78, 83, 102, 142, 166–170
   points_to_waveform.py9189%27
   rotate.py691480%15, 55, 66–69, 85–90, 112, 119–120
   scale_grad.py14471%28–30, 33
   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.py1139813%33–40, 55–62, 89–108, 129–132, 168–212, 242–246, 264–306
/home/runner/.local/lib/python3.12/site-packages/pypulseq/Sequence
   block.py4053791%63, 66, 74, 80, 95, 103, 109, 120, 123, 126, 134, 139, 148, 159, 167, 207, 209, 213, 225, 274, 278, 294, 334–337, 366–367, 433, 439, 472, 541, 577, 583, 610, 648, 727
   calc_grad_spectrum.py81766%68–190
   calc_pns.py403122%45–96
   ext_test_report.py1441292%23, 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.py3196879%42–43, 90, 93, 105, 110, 116, 123, 132, 141, 146, 149, 157–159, 202, 207, 215–264, 294–297, 312–313, 342–359, 422, 425, 460, 468, 542, 584–588
   sequence.py81522672%11–14, 104–114, 135–148, 195, 260–263, 310, 337, 354, 402, 430, 457–462, 499, 515, 606, 628, 669–672, 726, 764, 775–776, 782, 793, 799, 801, 809, 842–850, 994, 996, 999, 1017, 1026, 1042–1043, 1046–1049, 1085–1095, 1104–1106, 1150–1162, 1177–1178, 1194–1212, 1246–1247, 1276, 1282, 1285, 1288, 1325, 1446–1459, 1482, 1510, 1532–1534, 1555, 1618, 1626, 1693, 1704–1717, 1729–1740, 1786–1787, 1796–1814, 1838, 1868–1876, 1908–2018, 2054, 2068–2078, 2082, 2093
   write_seq.py35417650%42, 66, 69–76, 303–526
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils
   cumsum.py14193%17
   safe_pns_prediction.py12611310%50–87, 102–189, 197–214, 222, 244–250, 279–286, 310–336, 344–383, 396–411, 415
   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
TOTAL4719167764% 

Tests Skipped Failures Errors Time
1349 21 💤 0 ❌ 0 🔥 3m 32s ⏱️

@mcencini
Copy link
Contributor

mcencini commented Sep 8, 2025

Hi! I am not a maintainer, but just wanted to point out that v1.5.0_dev branch also has changes to plot.

@mzaiss
Copy link
Author

mzaiss commented Sep 10, 2025

Hi! I am not a maintainer, but just wanted to point out that v1.5.0_dev branch also has changes to plot.

i hope that the same reuse can be done there.
wil try to also make a PR

@mzaiss mzaiss changed the title Extend seq.plot() for reuse ability. Extend seq.plot() for reuse ability. (1.4) Sep 10, 2025
schuenke and others added 3 commits October 29, 2025 11:39
- fix grid display for clear=False
- unify subplot naming and handling
- removed obsolete plot_type param
- fix type annotation
- improve documentation
@schuenke
Copy link
Collaborator

schuenke commented Oct 30, 2025

I did some additional refactoring in 27e3fe1 to improve the general code style and documentation and to fix the issue that the grid was removed in every second function call when using the the clear=False option (grid was toggled, not explicitly swtiched on).

This PR changes the return value of the plot method from None to Tuple[plt.Figure, Tuple[plt.Axes, plt.Axes, plt.Axes], plt.Figure, Tuple[plt.Axes, plt.Axes, plt.Axes]]. IMO, this is not a problem, but something to keep in mind.

Would be great if @btasdelen and/or @FrankZijlstra and/or @mcencini could have a look at it again. I think it wouldn't be best practice if I approve this PR after all my modifications.

@mzaiss could you please confirm that everything is still working for you as expected after my changes

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.

3 participants