This is just a draft PR to keep track of all changes and potential merge conflicts with recent commits...
Hi, sorry I did not open it myself - I wanted to open it after soft delay was completed but then got a bit caught by the ISMRM deadline

Coverage Report
| File | Stmts | Miss | Cover | Missing |
|---|
| /home/runner/.local/lib/python3.12/site-packages/pypulseq |
| add_gradients.py | 137 | 60 | 56% | 44, 52, 58, 61, 75–86, 92, 125–128, 135–136, 155, 162, 167–263 |
| add_ramps.py | 36 | 36 | 0% | 1–92 |
| align.py | 35 | 4 | 89% | 41, 45, 69, 73 |
| calc_duration.py | 25 | 1 | 96% | 37 |
| calc_ramp.py | 220 | 216 | 2% | 48–359 |
| calc_rf_bandwidth.py | 35 | 26 | 26% | 45–78, 82–86 |
| check_timing.py | 96 | 29 | 70% | 78, 82, 107, 180, 199, 232, 239, 249–293 |
| compress_shape.py | 30 | 1 | 97% | 28 |
| convert.py | 40 | 8 | 80% | 42, 48, 66, 72–73, 82, 88–89 |
| event_lib.py | 96 | 15 | 84% | 6–9, 48–51, 70–71, 205–210, 247 |
| make_adc.py | 98 | 14 | 86% | 77, 80, 90–94, 97, 146, 149, 153, 159, 163, 202, 204, 206, 214 |
| make_adiabatic_pulse.py | 132 | 39 | 70% | 202–206, 226–230, 238–239, 262, 268, 337–356, 460–469, 507–515 |
| make_arbitrary_grad.py | 49 | 15 | 69% | 72, 75, 78, 81, 89, 99, 105, 115, 117, 125–129, 138 |
| make_arbitrary_rf.py | 75 | 63 | 16% | 93–179 |
| make_block_pulse.py | 48 | 3 | 94% | 119–123, 126 |
| make_delay.py | 9 | 1 | 89% | 27 |
| make_digital_output_pulse.py | 16 | 2 | 88% | 39, 47 |
| make_extended_trapezoid.py | 56 | 12 | 79% | 67, 70, 76, 82, 85, 88, 91, 94, 116, 134, 136, 139 |
| make_extended_trapezoid_area.py | 93 | 3 | 97% | 52, 227, 230 |
| make_gauss_pulse.py | 72 | 20 | 72% | 136–140, 143–167, 174, 177 |
| make_label.py | 22 | 4 | 82% | 64, 66, 68, 75 |
| make_sigpy_pulse.py | 119 | 30 | 75% | 12–13, 119, 122, 126, 163–167, 171, 174–175, 178–179, 194, 201, 206, 218, 221, 246–256, 270, 273, 303–313 |
| make_sinc_pulse.py | 70 | 10 | 86% | 100, 106, 134–138, 142, 145–146, 149–150, 172 |
| make_soft_delay.py | 25 | 2 | 92% | 102, 120 |
| make_trapezoid.py | 111 | 7 | 94% | 177, 190, 196, 214, 232, 237, 255 |
| make_trigger.py | 16 | 2 | 88% | 44, 52 |
| opts.py | 66 | 9 | 86% | 78, 83, 102, 142, 166–170 |
| points_to_waveform.py | 9 | 1 | 89% | 27 |
| rotate.py | 69 | 14 | 80% | 15, 55, 66–69, 85–90, 112, 119–120 |
| scale_grad.py | 30 | 1 | 97% | 65 |
| sigpy_pulse_opts.py | 26 | 7 | 73% | 34–41 |
| split_gradient.py | 39 | 31 | 21% | 46–103 |
| split_gradient_at.py | 70 | 27 | 61% | 63–90, 110, 114, 118–120, 154–156 |
| traj_to_grad.py | 13 | 9 | 31% | 26–40 |
| /home/runner/.local/lib/python3.12/site-packages/pypulseq/SAR |
| SAR_calc.py | 113 | 98 | 13% | 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.py | 469 | 83 | 82% | 63, 66, 74, 80, 95, 103, 109, 120, 123, 126, 134, 139, 148, 159, 167, 207, 209, 213, 226, 275, 279, 295, 320–346, 383–386, 392, 417–419, 422–430, 437, 467–471, 513, 519, 552, 588–595, 612, 622, 648, 686, 704, 707, 725, 739, 766, 845, 882, 906 |
| calc_grad_spectrum.py | 81 | 76 | 6% | 68–190 |
| calc_pns.py | 40 | 31 | 22% | 45–96 |
| ext_test_report.py | 144 | 12 | 92% | 23, 61, 138, 149–150, 237–243 |
| install.py | 75 | 42 | 44% | 31, 52, 69, 71, 112–131, 148, 181–184, 200–212, 254–278 |
| parula.py | 4 | 2 | 50% | 19–86 |
| read_seq.py | 382 | 132 | 65% | 43–44, 91, 94, 106, 111, 117, 124–125, 129, 138, 146–153, 157–160, 163, 175, 179–181, 213–224, 229, 237–294, 301–316, 331–401, 406–423, 486, 489, 524, 532, 570, 594, 633, 675–679, 794, 805 |
| sequence.py | 696 | 200 | 71% | 10–13, 105–115, 136–149, 196, 261–264, 311, 338, 355, 403, 431, 458–463, 500, 516, 607, 635–644, 656, 678, 719–722, 776, 814, 825–826, 832, 843, 849, 851, 859, 892–900, 1030, 1095, 1101, 1104, 1107, 1144, 1269–1282, 1312, 1340, 1362–1364, 1385, 1448, 1456, 1523, 1534–1547, 1559–1570, 1616–1617, 1628–1646, 1670, 1700–1708, 1740–1866, 1902, 1916–1926, 1930, 1941 |
| write_seq.py | 358 | 176 | 51% | 45, 69, 72–79, 310–533 |
| /home/runner/.local/lib/python3.12/site-packages/pypulseq/utils |
| cumsum.py | 14 | 1 | 93% | 17 |
| paper_plot.py | 57 | 53 | 7% | 45–121 |
| safe_pns_prediction.py | 126 | 113 | 10% | 50–87, 102–189, 197–214, 222, 244–250, 279–286, 310–336, 344–383, 396–411, 415 |
| seq_plot.py | 207 | 75 | 64% | 16, 88–89, 98–103, 106–141, 144–149, 167, 169, 172, 198–199, 202–205, 237, 252–262, 271–273, 291–293, 295–296, 298–299, 332–344, 359–360, 396–397 |
| tracing.py | 16 | 6 | 62% | 33–34, 42, 54–55, 75 |
| /home/runner/.local/lib/python3.12/site-packages/pypulseq/utils/siemens |
| asc_to_hw.py | 58 | 53 | 9% | 21–28, 48–106 |
| readasc.py | 48 | 45 | 6% | 25–100 |
| TOTAL | 5077 | 1920 | 62% | |
| Tests |
Skipped |
Failures |
Errors |
Time |
| 1375 |
21 :zzz: |
13 :x: |
0 :fire: |
3m 28s :stopwatch: |