@@ -379,10 +379,10 @@ def unepify(trajectory: NDArray, Ns_readouts: int, Ns_transitions: int) -> NDArr
379379
380380
381381def get_gradient_times_to_travel (
382- ks : NDArray | None = None ,
383- ke : NDArray | None = None ,
384- gs : NDArray | None = None ,
385- ge : NDArray | None = None ,
382+ kspace_end_loc : NDArray | None = None ,
383+ kspace_start_loc : NDArray | None = None ,
384+ end_gradients : NDArray | None = None ,
385+ start_gradients : NDArray | None = None ,
386386 gamma : float = Gammas .Hydrogen ,
387387 raster_time : float = DEFAULT_RASTER_TIME ,
388388 gmax : float = DEFAULT_GMAX ,
@@ -400,14 +400,14 @@ def get_gradient_times_to_travel(
400400
401401 Parameters
402402 ----------
403- ks : NDArray
404- Starting k-space positions, shape (nb_shots, nb_dimension).
405- ke : NDArray, default None when it is 0
403+ kspace_end_loc : NDArray
406404 Ending k-space positions, shape (nb_shots, nb_dimension).
407- gs : NDArray, default None when it is 0
408- Starting gradient values , shape (nb_shots, nb_dimension).
409- ge : NDArray, default None when it is 0
405+ kspace_start_loc : NDArray, default None when it is 0
406+ Starting k-space positions , shape (nb_shots, nb_dimension).
407+ end_gradients : NDArray, default None when it is 0
410408 Ending gradient values, shape (nb_shots, nb_dimension).
409+ start_gradients : NDArray, default None when it is 0
410+ Starting gradient values, shape (nb_shots, nb_dimension).
411411 gamma : float, optional
412412 Gyromagnetic ratio in Hz/T. Default is Gammas.Hydrogen.
413413 raster_time : float, optional
@@ -425,19 +425,19 @@ def get_gradient_times_to_travel(
425425 n_plateau: The timing values for the plateau phase.
426426 gi: The intermediate gradient values for trapezoidal or triangular waveforms.
427427 """
428- area_needed = (ke - ks ) / gamma / raster_time
428+ area_needed = (kspace_end_loc - kspace_start_loc ) / gamma / raster_time
429429
430430 # Direct ramp steps
431- n_direct = np .ceil ((ge - gs ) / smax / raster_time ).astype (int )
432- area_direct = 0.5 * n_direct * (ge + gs )
431+ n_direct = np .ceil ((end_gradients - start_gradients ) / smax / raster_time ).astype (int )
432+ area_direct = 0.5 * n_direct * (end_gradients + start_gradients )
433433
434434 i = np .sign (area_direct - area_needed )
435435
436- n_ramp_down = np .ceil ((gmax + i * gs ) / smax / raster_time ).astype (int )
437- n_ramp_up = np .ceil ((gmax + i * ge ) / smax / raster_time ).astype (int )
436+ n_ramp_down = np .ceil ((gmax + i * start_gradients ) / smax / raster_time ).astype (int )
437+ n_ramp_up = np .ceil ((gmax + i * end_gradients ) / smax / raster_time ).astype (int )
438438
439- area_lowest = n_ramp_down * 0.5 * (gs - i * gmax ) + n_ramp_up * 0.5 * (
440- ge - i * gmax
439+ area_lowest = n_ramp_down * 0.5 * (start_gradients - i * gmax ) + n_ramp_up * 0.5 * (
440+ end_gradients - i * gmax
441441 )
442442
443443 gi = np .zeros_like (n_ramp_down , dtype = np .float32 )
@@ -447,8 +447,8 @@ def get_gradient_times_to_travel(
447447 ramp_only_mask = np .abs (area_lowest ) >= np .abs (area_needed )
448448 gi [ramp_only_mask ] = (
449449 2 * area_needed [ramp_only_mask ]
450- - (n_ramp_down [ramp_only_mask ] + 1 ) * gs [ramp_only_mask ]
451- - (n_ramp_up [ramp_only_mask ] - 1 ) * ge [ramp_only_mask ]
450+ - (n_ramp_down [ramp_only_mask ] + 1 ) * start_gradients [ramp_only_mask ]
451+ - (n_ramp_up [ramp_only_mask ] - 1 ) * end_gradients [ramp_only_mask ]
452452 ) / (n_ramp_down [ramp_only_mask ] + n_ramp_up [ramp_only_mask ])
453453
454454 # Else: need plateau
@@ -461,8 +461,8 @@ def get_gradient_times_to_travel(
461461
462462 gi [plateau_mask ] = (
463463 2 * area_needed [plateau_mask ]
464- - (n_ramp_down [plateau_mask ] + 1 ) * gs [plateau_mask ]
465- - (n_ramp_up [plateau_mask ] - 1 ) * ge [plateau_mask ]
464+ - (n_ramp_down [plateau_mask ] + 1 ) * start_gradients [plateau_mask ]
465+ - (n_ramp_up [plateau_mask ] - 1 ) * end_gradients [plateau_mask ]
466466 ) / (
467467 n_ramp_down [plateau_mask ]
468468 + n_ramp_up [plateau_mask ]
@@ -473,11 +473,11 @@ def get_gradient_times_to_travel(
473473
474474
475475def get_gradient_amplitudes_to_travel_for_set_time (
476- ke : NDArray ,
477- ks : NDArray | None = None ,
478- gs : NDArray | None = None ,
479- ge : NDArray | None = None ,
480- N : int | None = None ,
476+ kspace_end_loc : NDArray ,
477+ kspace_start_loc : NDArray | None = None ,
478+ end_gradients : NDArray | None = None ,
479+ start_gradients : NDArray | None = None ,
480+ nb_raster_points : int | None = None ,
481481 gamma : float = Gammas .Hydrogen ,
482482 raster_time : float = DEFAULT_RASTER_TIME ,
483483 gmax : float = DEFAULT_GMAX ,
@@ -495,15 +495,15 @@ def get_gradient_amplitudes_to_travel_for_set_time(
495495
496496 Parameters
497497 ----------
498- ke : NDArray
498+ kspace_end_loc : NDArray
499499 Ending k-space positions, shape (nb_shots, nb_dimension).
500- ks : NDArray, default None when it is 0
500+ kspace_start_loc : NDArray, default None when it is 0
501501 Starting k-space positions, shape (nb_shots, nb_dimension).
502- gs : NDArray, default None when it is 0
503- Starting gradient values, shape (nb_shots, nb_dimension).
504- ge : NDArray, default None when it is 0
502+ end_gradients : NDArray, default None when it is 0
505503 Ending gradient values, shape (nb_shots, nb_dimension).
506- N : int, default None
504+ start_gradients : NDArray, default None when it is 0
505+ Starting gradient values, shape (nb_shots, nb_dimension).
506+ nb_raster_points : int, default None
507507 Number of time steps (samples) for the gradient waveform.
508508 If None, timing is calculated based on the area needed and hardware limits.
509509 gamma : float, optional
@@ -517,7 +517,7 @@ def get_gradient_amplitudes_to_travel_for_set_time(
517517
518518 Returns
519519 -------
520- G : NDArray
520+ NDArray
521521 Gradient waveforms, shape (nb_shots, nb_samples_per_shot, nb_dimension)
522522 , where each entry contains the gradient value at each time step
523523 for each shot and dimension.
@@ -529,46 +529,46 @@ def get_gradient_amplitudes_to_travel_for_set_time(
529529 - The returned gradients are suitable for use in MRI pulse sequence design,
530530 ensuring compliance with specified hardware constraints.
531531 """
532- ke = np .atleast_2d (ke )
533- if ks is None :
534- ks = np .zeros_like (ke )
535- if gs is None :
536- gs = np .zeros_like (ke )
537- if ge is None :
538- ge = np .zeros_like (ke )
539- ks = np .atleast_2d (ks )
540- gs = np .atleast_2d (gs )
541- ge = np .atleast_2d (ge )
532+ kspace_end_loc = np .atleast_2d (kspace_end_loc )
533+ if kspace_start_loc is None :
534+ kspace_start_loc = np .zeros_like (kspace_end_loc )
535+ if start_gradients is None :
536+ start_gradients = np .zeros_like (kspace_end_loc )
537+ if end_gradients is None :
538+ end_gradients = np .zeros_like (kspace_end_loc )
539+ kspace_start_loc = np .atleast_2d (kspace_start_loc )
540+ start_gradients = np .atleast_2d (start_gradients )
541+ end_gradients = np .atleast_2d (end_gradients )
542542
543543 assert (
544- ks .shape == ke .shape == gs .shape == ge .shape
544+ kspace_start_loc .shape == kspace_end_loc .shape == start_gradients .shape == end_gradients .shape
545545 ), "All input arrays must have shape (nb_shots, nb_dimension)"
546- if N is None :
546+ if nb_raster_points is None :
547547 # Calculate the number of time steps based on the area needed
548548 n_ramp_down , n_ramp_up , n_plateau , gi = get_gradient_times_to_travel (
549- ks = ks ,
550- ke = ke ,
551- ge = ge ,
552- gs = gs ,
549+ kspace_end_loc = kspace_end_loc ,
550+ kspace_start_loc = kspace_start_loc ,
551+ end_gradients = end_gradients ,
552+ start_gradients = start_gradients ,
553553 gamma = gamma ,
554554 raster_time = raster_time ,
555555 gmax = gmax ,
556556 smax = smax ,
557557 )
558558 # Extra 2 buffer samples
559- N = np .max (n_ramp_down + n_ramp_up + n_plateau ) + 2
559+ nb_raster_points = np .max (n_ramp_down + n_ramp_up + n_plateau ) + 2
560560
561- area_needed = (ke - ks ) / gamma / raster_time
561+ area_needed = (kspace_end_loc - kspace_start_loc ) / gamma / raster_time
562562 # Intermediate gradient values. This is value of plateau or triangle gradients
563- gi = np .zeros_like (ks , dtype = np .float32 )
563+ gi = np .zeros_like (kspace_start_loc , dtype = np .float32 )
564564
565565 # Get the area for direct and estimate n_ramps
566- area_direct = 0.5 * N * (ge + gs )
566+ area_direct = 0.5 * nb_raster_points * (end_gradients + start_gradients )
567567 i = np .sign (area_direct - area_needed )
568568
569- n_ramp_down = np .ceil ((gmax + i * gs ) / smax / raster_time ).astype (int )
570- n_ramp_up = np .ceil ((gmax + i * ge ) / smax / raster_time ).astype (int )
571- n_plateau = N - n_ramp_up - n_ramp_down
569+ n_ramp_down = np .ceil ((gmax + i * start_gradients ) / smax / raster_time ).astype (int )
570+ n_ramp_up = np .ceil ((gmax + i * end_gradients ) / smax / raster_time ).astype (int )
571+ n_plateau = nb_raster_points - n_ramp_up - n_ramp_down
572572
573573 # Get intermediate gradients for triangle waveform, when n_plateau<0
574574 no_trapazoid = n_plateau <= 0
@@ -577,35 +577,35 @@ def get_gradient_amplitudes_to_travel_for_set_time(
577577 # Initial approximate calculation of gi
578578 gi [no_trapazoid ] = (
579579 2 * area_needed [no_trapazoid ]
580- - N * ge [no_trapazoid ] * smax
581- - ge [no_trapazoid ] * gs [no_trapazoid ]
582- + ge [no_trapazoid ] * smax
583- - gs [no_trapazoid ] * smax
584- + gs [no_trapazoid ] * gs [no_trapazoid ]
585- ) / (N * smax - ge [no_trapazoid ] + gs [no_trapazoid ])
580+ - nb_raster_points * end_gradients [no_trapazoid ] * smax
581+ - end_gradients [no_trapazoid ] * start_gradients [no_trapazoid ]
582+ + end_gradients [no_trapazoid ] * smax
583+ - start_gradients [no_trapazoid ] * smax
584+ + start_gradients [no_trapazoid ] * start_gradients [no_trapazoid ]
585+ ) / (nb_raster_points * smax - end_gradients [no_trapazoid ] + start_gradients [no_trapazoid ])
586586 n_ramp_down [no_trapazoid ] = np .ceil (
587- np .abs (gi [no_trapazoid ] - gs [no_trapazoid ]) / smax
587+ np .abs (gi [no_trapazoid ] - start_gradients [no_trapazoid ]) / smax
588588 )
589- n_ramp_up [no_trapazoid ] = N - n_ramp_down [no_trapazoid ]
589+ n_ramp_up [no_trapazoid ] = nb_raster_points - n_ramp_down [no_trapazoid ]
590590
591591 # Get intermediate gradients for trapazoids
592- gi = (2 * area_needed - (n_ramp_down + 1 ) * gs - (n_ramp_up - 1 ) * ge ) / (
592+ gi = (2 * area_needed - (n_ramp_down + 1 ) * start_gradients - (n_ramp_up - 1 ) * end_gradients ) / (
593593 n_ramp_down + n_ramp_up + 2 * n_plateau
594594 )
595- nb_shots , nb_dimension = ke .shape
596- G = np .zeros ((nb_shots , N , nb_dimension ), dtype = np .float32 )
595+ nb_shots , nb_dimension = kspace_end_loc .shape
596+ G = np .zeros ((nb_shots , nb_raster_points , nb_dimension ), dtype = np .float32 )
597597 for i in range (nb_shots ):
598598 for d in range (nb_dimension ):
599599 start = 0
600600 G [i , : n_ramp_down [i , d ], d ] = np .linspace (
601- gs [i , d ], gi [i , d ], n_ramp_down [i , d ], endpoint = False
601+ start_gradients [i , d ], gi [i , d ], n_ramp_down [i , d ], endpoint = False
602602 )
603603 start += n_ramp_down [i , d ]
604604 if n_plateau [i , d ] > 0 :
605605 G [i , start : start + n_plateau [i , d ], d ] = gi [i , d ]
606606 start += n_plateau [i , d ]
607607 G [i , start : start + n_ramp_up [i , d ], d ] = np .linspace (
608- gi [i , d ], ge [i , d ], n_ramp_up [i , d ], endpoint = False
608+ gi [i , d ], end_gradients [i , d ], n_ramp_up [i , d ], endpoint = False
609609 )
610610 return G
611611
0 commit comments