Skip to content

Conversation

btasdelen
Copy link
Collaborator

Fixes the issue at #254.

Copy link

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.py872769%72, 76, 101, 194, 201, 211–255
   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.py19384%36, 41, 43
   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_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.py3683291%59, 62, 70, 76, 91, 99, 105, 116, 119, 122, 130, 135, 144, 196, 245, 249, 265, 305–308, 337–338, 404, 410, 430, 499, 535, 541, 568, 606, 640
   calc_grad_spectrum.py81766%68–190
   calc_pns.py403122%45–96
   ext_test_report.py1401192%23, 58, 61, 135, 227–233
   install.py754244%31, 52, 69, 71, 112–131, 148, 181–184, 200–212, 254–278
   parula.py4250%19–86
   read_seq.py3166878%42–43, 94, 97, 109, 114, 120, 127, 136, 145, 150, 153, 161–163, 196, 201, 209–258, 288–291, 306–307, 336–353, 416, 419, 454, 462, 536, 578–582
   sequence.py73722470%11–14, 101–111, 132–145, 183, 248–251, 298, 325, 342, 390, 418, 445–450, 487, 503, 594, 616, 657–660, 714, 752, 763–764, 770, 781, 787, 789, 797, 830–838, 859–881, 924, 926, 929, 955–956, 959–962, 998–1008, 1017–1019, 1063–1075, 1090–1091, 1127–1128, 1154, 1160, 1163, 1200, 1321–1334, 1357, 1385, 1407–1409, 1430, 1461, 1472–1485, 1497–1508, 1554–1555, 1564–1582, 1606, 1636–1644, 1676–1786, 1815, 1829–1839, 1851
   write_seq.py172895%41, 65, 68–75
/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
TOTAL4376149666% 

Tests Skipped Failures Errors Time
1285 18 💤 0 ❌ 0 🔥 2m 59s ⏱️

@btasdelen btasdelen mentioned this pull request Jul 31, 2025
11 tasks
@FrankZijlstra
Copy link
Collaborator

FrankZijlstra commented Jul 31, 2025

Question: Why are system parameters read from the sequence file in the first place? While it is useful to know what system parameters were used to write the file, shouldn't the principle of Pulseq be that a .seq file can be shared and run on a different system? That is, system parameters should not be overwritten in the first place?

For example, if I have a hypothetical system with a 1 us gradient raster, I should have no problems reading a sequence with a 10 us gradient raster, but the sequence checks should still be done with with the user-specified system parameters.

It would make more sense to me to give a warning if the specified system parameters do not match with the ones in the file, to hint that the systems may be incompatible.

In addition, I think the system variable in Sequence is a reference, so I think this PR may end up making unexpected modifications, e.g.:

system = pp.Opts();
seq = pp.Sequence(system=system);
seq.read('test.seq')
print(system.grad_raster_time); # <-- May be changed?

@btasdelen
Copy link
Collaborator Author

@FrankZijlstra That is a good question. I think this behavior is consistent with what Matlab Pulseq does. Gradient raster times for extended trapezoids are used in plotting, and incorrect raster time causes weird looking waveforms. See #254.

I also found it confusing that, during object creation, we set self.grad_raster_time = self.system.grad_raster_time (and other system parameter), and use self.grad_raster_time internally when needed, but a couple of places we are inconsistent and use self.system.grad_raster_time instead, so now those two may not be the same if changed halfway. This PR attempted to fix that, but maybe I am misunderstanding the whole deal.

My questions are what do we expect when the user changes the Sequence.system after initialization, and what is the purpose of setting self.grad_raster_time, just a shortcut or to "fix" these definitions in a sense? If the latter, isn't it more confusing that even though the user changes parameters, most of the internal functions use old ones?

These are the functions I see that are using self.system.grad_raster_time, rest are using self.grad_raster_time:

dt = obj.system.grad_raster_time # time raster

raster = seq.system.grad_raster_time

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.

2 participants