11"""
2- seqd = DiscreteSequence(Gx, Gy, Gz, B1, Δf, ADC, t, Δt)
2+ seqd = DiscreteSequence(Gx, Gy, Gz, B1, Δf, ψ, ADC, t, Δt)
33
44A sampled version of a Sequence struct, containing vectors for event amplitudes at specified
55times. DiscreteSequence is the struct used for simulation.
@@ -10,6 +10,7 @@ times. DiscreteSequence is the struct used for simulation.
1010- `Gz`: (`::AbstractVector{T<:Real}`, `[T/m]`) z-gradient vector
1111- `B1`: (`::AbstractVector{Complex{T<:Real}}`, `[T]`) RF amplitude vector
1212- `Δf`: (`::AbstractVector{T<:Real}`, `[Hz]`) RF carrier frequency displacement vector
13+ - `ψ`: (`::AbstractVector{T<:Real}`, `[rad]`) RF rotating-frame phase vector
1314- `ADC`: (`::AbstractVector{Bool}`) ADC sample vector
1415- `t`: (`::AbstractVector{T<:Real}`, `[s]`) time vector
1516- `Δt`: (`::AbstractVector{T<:Real}`, `[s]`) delta time vector
@@ -23,6 +24,7 @@ struct DiscreteSequence{T<:Real}
2324 Gz:: AbstractVector{T}
2425 B1:: AbstractVector{Complex{T}}
2526 Δf:: AbstractVector{T}
27+ ψ:: AbstractVector{T}
2628 ADC:: AbstractVector{Bool}
2729 t:: AbstractVector{T}
2830 Δt:: AbstractVector{T}
@@ -35,36 +37,39 @@ Base.getindex(seq::DiscreteSequence, i::Integer) = begin
3537 seq. Gz[i, :],
3638 seq. B1[i, :],
3739 seq. Δf[i, :],
40+ seq. ψ[i, :],
3841 seq. ADC[i, :],
3942 seq. t[i, :],
4043 seq. Δt[i, :])
4144end
4245Base. getindex (seq:: DiscreteSequence , i:: UnitRange ) = begin
43- DiscreteSequence (seq. Gx[i. start: i. stop+ 1 ],
44- seq. Gy[i. start: i. stop+ 1 ],
45- seq. Gz[i. start: i. stop+ 1 ],
46- seq. B1[i. start: i. stop+ 1 ],
47- seq. Δf[i. start: i. stop+ 1 ],
46+ DiscreteSequence (seq. Gx[i],
47+ seq. Gy[i],
48+ seq. Gz[i],
49+ seq. B1[i],
50+ seq. Δf[i],
51+ seq. ψ[i],
4852 seq. ADC[i],
49- seq. t[i. start : i . stop + 1 ],
50- seq. Δt[i])
53+ seq. t[i],
54+ seq. Δt[i. start : i . stop - 1 ])
5155end
5256Base. view (seq:: DiscreteSequence , i:: UnitRange ) = begin
53- @views DiscreteSequence (seq. Gx[i. start: i. stop+ 1 ],
54- seq. Gy[i. start: i. stop+ 1 ],
55- seq. Gz[i. start: i. stop+ 1 ],
56- seq. B1[i. start: i. stop+ 1 ],
57- seq. Δf[i. start: i. stop+ 1 ],
57+ @views DiscreteSequence (seq. Gx[i],
58+ seq. Gy[i],
59+ seq. Gz[i],
60+ seq. B1[i],
61+ seq. Δf[i],
62+ seq. ψ[i],
5863 seq. ADC[i],
59- seq. t[i. start : i . stop + 1 ],
60- seq. Δt[i])
64+ seq. t[i],
65+ seq. Δt[i. start : i . stop - 1 ])
6166end
6267Base. iterate (seq:: DiscreteSequence ) = (seq[1 ], 2 )
6368Base. iterate (seq:: DiscreteSequence , i) = (i <= length (seq)) ? (seq[i], i+ 1 ) : nothing
6469
65- is_GR_on (seq:: DiscreteSequence ) = sum (abs .([seq. Gx[ 1 : end - 1 ] ; seq. Gy[ 1 : end - 1 ] ; seq. Gz[ 1 : end - 1 ] ])) != 0
66- is_RF_on (seq:: DiscreteSequence ) = sum (abs .(seq. B1[ 1 : end - 1 ] )) != 0
67- is_ADC_on (seq:: DiscreteSequence ) = sum (abs .(seq. ADC[ 1 : end - 1 ] )) != 0
70+ is_GR_on (seq:: DiscreteSequence ) = sum (abs .([seq. Gx; seq. Gy; seq. Gz])) != 0
71+ is_RF_on (seq:: DiscreteSequence ) = sum (abs .(seq. B1)) != 0
72+ is_ADC_on (seq:: DiscreteSequence ) = sum (abs .(seq. ADC)) != 0
6873is_GR_off (seq:: DiscreteSequence ) = ! is_GR_on (seq)
6974is_RF_off (seq:: DiscreteSequence ) = ! is_RF_on (seq)
7075is_ADC_off (seq:: DiscreteSequence ) = ! is_ADC_on (seq)
@@ -87,12 +92,12 @@ based on simulation parameters.
8792"""
8893function discretize (seq:: Sequence ; sampling_params= default_sampling_params (), motion= NoMotion ())
8994 t, Δt = get_variable_times (seq; Δt= sampling_params[" Δt" ], Δt_rf= sampling_params[" Δt_rf" ], motion= motion)
90- B1, Δf = get_rfs (seq, t)
95+ B1, Δf, ψ = get_rfs (seq, t)
9196 Gx, Gy, Gz = get_grads (seq, t)
9297 tadc = get_adc_sampling_times (seq)
9398 tadc_set = Set (tadc)
9499 ADCflag = [tt in tadc_set for tt in t] # Displaced 1 dt, sig[i]=S(ti+dt)
95- seqd = DiscreteSequence (Gx, Gy, Gz, complex .(B1), Δf, ADCflag, t, Δt)
100+ seqd = DiscreteSequence (Gx, Gy, Gz, complex .(B1), Δf, ψ, ADCflag, t, Δt)
96101 return seqd
97102end
98103
0 commit comments