DeepRF / demo / SLR_exc_full_simul.m
SLR_exc_full_simul.m
Raw
function m = Pulse_step_22_sar(RF_pulse,b1_range,off_range,gamma,time_step,rf_len,iter_num,sar_weight)

    % This script is for sparse reward,
    % with interpolation and symmetry property
    % Outputs
    % rew_arr: reward array, size is RF_pulse
    % num: sorting number for asynchronous parallel exec.    

    num = iter_num;
    
    RF_pulse_new = RF_pulse;

%     if rf_len ~= 0
%         RF_pulse_new = zeros((rf_len/2),2); % increase sampling rate x 2
%         RF_pulse_new(:,1) = interp1(1:size(RF_pulse,1),RF_pulse(:,1),linspace(1,size(RF_pulse,1),rf_len/2),'linear');
%         RF_pulse_new(:,2) = interp1(1:size(RF_pulse,1),RF_pulse(:,2),linspace(1,size(RF_pulse,1),rf_len/2),'linear');
%     end    
%     RF_pulse_new = [RF_pulse_new; flipud(RF_pulse_new)]; % symmetric porperty
    
    max_rf_amp = max(RF_pulse_new(:,1)) / (2*pi*42.577*1e+6*time_step*1e-4);
    rr = 42.577; % MHz/T
    Gz =  40; % mT/m (fixed)
    pos = abs(off_range(1) / rr / Gz); % mm
    m = zeros(size(b1_range,1),size(off_range,1),3);
    
    for jj=1:size(b1_range,1)
        pulse = [[b1_range(jj)*RF_pulse_new(:,1)./max(RF_pulse_new(:,1))*max_rf_amp; 0],[RF_pulse_new(:,2)./pi*180; 0]]';
        gg = ones(size(RF_pulse_new,1),1) * Gz;
        gg = [gg; -Gz * size(RF_pulse_new,1) / 2]';
        [Mx, My, Mz] = Bloch_simul(zeros(size(off_range,1),1),zeros(size(off_range,1),1),ones(size(off_range,1),1),1e+10,1e+10,pulse,gg,time_step*1e+3,pos*1e-3,size(off_range,1));
        m(jj,:,1) = Mx(:,end);
        m(jj,:,2) = My(:,end);
        m(jj,:,3) = Mz(:,end);
    end
    
%     max_rad = 2*pi*42.577*1e+6*time_step*0.2*1e-4; % 0.0280
%     max_sar = max_rad^2*rf_len; % maximum allowed SAR = 0.0280 x 256 = 7.1567
%     cur_sar = sum(RF_pulse_new(:,1).^2);
    
%     temp = mean(m,'all') * ones(1,size(RF_pulse,1));
%     mz_arr = temp(1) * ones(1,size(RF_pulse,1));
%     rew_arr = ((1 - temp(1)) + sar_weight * (1 - (cur_sar / max_sar))) * ones(1,size(RF_pulse,1));

end