diff --git a/src/all_building_blocks/spoilt_slice_selects.jl b/src/all_building_blocks/spoilt_slice_selects.jl index 1a2f4380f51997f9c7099762f7a7e7acab8cdabc..2210b0ad09b969c22f2bb0e7d4eb08febe972492 100644 --- a/src/all_building_blocks/spoilt_slice_selects.jl +++ b/src/all_building_blocks/spoilt_slice_selects.jl @@ -75,20 +75,15 @@ end duration_trap1(spoilt::SpoiltSliceSelect) = 2 * spoilt.rise_time1 + spoilt.flat_time1 - spoilt.diff_time duration_trap2(spoilt::SpoiltSliceSelect) = 2 * spoilt.fall_time2 + spoilt.flat_time2 - spoilt.diff_time -function waveform_sequence(spoilt::SpoiltSliceSelect) - slew = slew_rate(spoilt) - (grad1, grad2, grad3) = [g for g in all_gradient_strengths(spoilt)] - return [ - ChangingGradient(0., slew, rise_time(spoilt)[1], spoilt.rotate, nothing), - ConstantGradient(grad1, flat_time(spoilt)[1], spoilt.rotate, nothing), - ChangingGradient(grad1, -slew, fall_time(spoilt)[1], spoilt.rotate, nothing), - ConstantGradient(grad2, duration(spoilt.pulse), spoilt.rotate, nothing), - ChangingGradient(grad2, slew, rise_time(spoilt)[2], spoilt.rotate, nothing), - ConstantGradient(grad3, flat_time(spoilt)[2], spoilt.rotate, nothing), - ChangingGradient(grad3, -slew, fall_time(spoilt)[2], spoilt.rotate, nothing), - ] -end -interruptions(spoilt::SpoiltSliceSelect) = [(index=4, time=effective_time(spoilt.pulse), object=spoilt.pulse)] +Base.keys(::SpoiltSliceSelect) = Val.(:rise1, :flat1, :fall1, :flat_pulse, :pulse, :rise2, :flat2, :fall2) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:rise1}) = ChangingGradient(0., slew_rate(spoilt), rise_time(spoilt)[1]) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:flat1}) = ConstantGradient(slew_rate(spoilt) * rise_time(spoilt)[1], flat_time(spoilt)[1]) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:fall1}) = ChangingGradient(slew_rate(spoilt) * rise_time(spoilt)[1], -slew_rate(spoilt), fall_time(spoilt)[1]) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:flat_pulse}) = ConstantGradient(slew_rate(spoilt) * spoilt.diff_time, duration(spoilt.pulse)) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:pulse}) = spoilt.pulse +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:rise2}) = ChangingGradient(slew_rate(spoilt) * spoilt.diff_time, slew_rate(spoilt), rise_time(spoilt)[2]) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:flat2}) = ConstantGradient(slew_rate(spoilt) * fall_time(spoilt)[2], flat_time(spoilt)[2]) +Base.getindex(spoilt::SpoiltSliceSelect, ::Val{:fall2}) = ConstantGradient(slew_rate(spoilt) * fall_time(spoilt)[2], -slew_rate(spoilt) fall_time(spoilt)[2]) rise_time(spoilt::SpoiltSliceSelect) = (spoilt.rise_time1, spoilt.fall_time2 - spoilt.diff_time) flat_time(spoilt::SpoiltSliceSelect) = (spoilt.flat_time1, spoilt.flat_time2) @@ -96,6 +91,7 @@ fall_time(spoilt::SpoiltSliceSelect) = (spoilt.rise_time1 - spoilt.diff_time, sp duration(spoilt::SpoiltSliceSelect) = sum(rise_time(spoilt)) + sum(flat_time(spoilt)) + sum(flat_time(spoilt)) + duration(spoilt.pulse) slew_rate(spoilt::SpoiltSliceSelect) = spoilt.slew_rate inverse_slice_thickness(spoilt::SpoiltSliceSelect) = spoilt.slew_rate * spoilt.diff_time * duration(spoilt.pulse) * 1e3 +gradient_strength(spoilt::SpoiltSliceSelect) = slew_rate(spoilt) * max(spoilt.rise_time1, spoilt.fall_time2) function all_gradient_strengths(spoilt::SpoiltSliceSelect) grad1 = spoilt.slew_rate * rise_time(spoilt)[1] grad2 = grad1 - spoilt.slew_rate * flat_time(spoilt)[1]