Here are several simulated examples for the detectability of a single object. Simulations are shown below for detectability analysis in 2D and 3D (sim_2D_params.m, sim_Det_3D.m) beside GREIT parameters for a single object in 2D
function [DET, greit_para]= sim_2D_params %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % sim_2D_params calculates detectability values and GREIT measures % for a single object moving from center to edge of the tank %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (C) 2011 Mamatjan Yasheng. License: GPL v2 or v3 XPos = [0:0.2:0.8]; idx=0; for ctrx= XPos; idx=idx+1; ctry = 0.0; brad = 0.1; extra={'ball',sprintf(['solid ball = cylinder(', ... '%f,%f,0;%f,%f,1;%f) and orthobrick(-1,-1,0;1,1,0.05) -maxh=0.10;'], ... ctrx, ctry, ctrx, ctry, brad) }; [fmdl, img] = create_2D_model(extra); ctr = interp_mesh(fmdl); ctr=(ctr(:,1)-ctrx).^2 + (ctr(:,2)-ctry).^2; % calculate detectability value DET(idx) = calc_detect_val(img, brad, ctr); % calculate simulated voltages and reconstruct images img.elem_data = 1 + 0.01*(ctr < brad^2); imgr(idx) = calc_volts_inv(img) end % imgr(1).elem_data = [imgr(:).elem_data]; figure; show_slices(imgr(1)); %% calculate and plot GREIT parameters figure YPos=zeros(1,idx); ZPos=zeros(1,idx); xyzr_pt = [XPos;YPos;ZPos;ones(1,idx)*brad]; greit_para = calc_greit_para(imgr, xyzr_pt, XPos); %% plot the detectability parameters figure plot(XPos, DET/max(DET),'linewidth',2); ylabel('Normalized Distinguishability {\it z}'); xlabel('Radius'); end function [fmdl, img] = create_2D_model(extra) % create 2D model fmdl= ng_mk_cyl_models(0,[16],[0.1,0,0.02],extra); img= mk_image(fmdl,1); [stim,meas_sel] = mk_stim_patterns(16,1,[0,1],[0,1],{'no_meas_current'},1); img.fwd_model.stimulation= stim; end function greit_para = calc_greit_para(imgr,xyzr_pt,XPos) % calculate and plot the GREIT PARAMETERS greit_para = eval_GREIT_fig_merit(imgr(1), xyzr_pt); p_names = {'AR','PE','RES','SD','RNG'}; for i=1:5; subplot(5,1,i); plot(XPos,greit_para(i,:)); ylabel(p_names{i}); if i<5; set(gca,'XTickLabel',[]);end end xlabel('Radius fraction'); end function DET = calc_detect_val(img, brad, ctr) % calculate the detectability parameters vol= get_elem_volume(img.fwd_model); contr = 1e-2; indx = zeros(size(vol)); indx(ctr < brad^2)=+ contr; J = calc_jacobian( img ); Jr = J*indx; DET = 1e6*sqrt( Jr'*Jr ); end function imgr = calc_volts_inv(img) % calculate simulated voltages and reconstruct images imgh= img; imgh.elem_data(:) = 1; % calculate voltages vi = fwd_solve(img); vh = fwd_solve(imgh); imdl= mk_common_model('c2c2',16); [stim,meas_sel] = mk_stim_patterns(16,1,[0,1],[0,1],{'no_meas_current'},1); imdl.fwd_model.stimulation = stim; imdl.fwd_model.meas_select = meas_sel; imdl.hyperparameter.value = .001; imgr = inv_solve(imdl,vh,vi); end
GREIT analysis includes the figures of merit based on the GREIT algorithm (Adler et al 2009) such as (1) amplitude response (AR), (2) position error (PE), (3) resolution (RES), (4) spatial distortion (SD) and (5) ringing (RNG).
% 3D Simulatulation example of system evaluation % (C) 2011 Mamatjan Yasheng. License: GPL v2 or v3 function [DET] = sim_Det_3D in_plane_Def=0; % in plane or off-plane Nelec= 16; Dims = 3; nrings = 1; opt = {'no_meas_current'}; sp = 1; mp= 1; % stimulation, measurement [img, vol, boxidx] = calc_fwd_cube( Dims, Nelec,in_plane_Def); stim = mk_stim_patterns(Nelec, nrings, [0,sp], [0,mp], opt, 1); DET = distinguishability_calc( img, stim, boxidx, vol); plott(DET); end function SNR = distinguishability_calc( img, stim, boxidx, vol) img.fwd_model.stimulation = stim; J = calc_jacobian( img ); for ri = 1:length(boxidx); idx = boxidx{ri}; Jr = J*idx; SNR(ri) = 1e6*sqrt( Jr'*Jr ); end end function [img, vol, boxidx] = calc_fwd_cube(Dims, Nelec,in_plane_Def) % cube moved to 7 position if in_plane_Def %% in plane extra={'boxes', ... ['solid box1= orthobrick(-0.1,-0.85,0.9; 0.1,-0.65,1.1) -maxh=0.05;' ... 'solid box2= orthobrick(-0.1, -0.6,0.9; 0.1, -0.4,1.1) -maxh=0.05;' ... 'solid box3= orthobrick(-0.1, -0.35,0.9; 0.1,-0.15,1.1) -maxh=0.05;' ... 'solid box4= orthobrick(-0.1,-0.1,0.9; 0.1,0.1,1.1) -maxh=0.05;' ... 'solid box5= orthobrick(-0.1, 0.15,0.9; 0.1,0.35,1.1) -maxh=0.05;' ... 'solid box6= orthobrick(-0.1, 0.4,0.9; 0.1,0.6,1.1) -maxh=0.05;' ... 'solid box7= orthobrick(-0.1, 0.65,0.9; 0.1,0.85,1.1) -maxh=0.05;' ... 'solid boxes = box1 or box2 or box3 or box4 or box5 or box6 or box7;']}; else %% off plane extra={'boxes', ... ['solid box1= orthobrick(-0.1,-0.85,1.4; 0.1,-0.65,1.6) -maxh=0.05;' ... 'solid box2= orthobrick(-0.1, -0.6,1.4; 0.1, -0.4,1.6) -maxh=0.05;' ... 'solid box3= orthobrick(-0.1, -0.35,1.4; 0.1,-0.15,1.6) -maxh=0.05;' ... 'solid box4= orthobrick(-0.1,-0.1,1.4; 0.1,0.1,1.6) -maxh=0.05;' ... 'solid box5= orthobrick(-0.1, 0.15,1.4; 0.1,0.35,1.6) -maxh=0.05;' ... 'solid box6= orthobrick(-0.1, 0.4,1.4; 0.1,0.6,1.6) -maxh=0.05;' ... 'solid box7= orthobrick(-0.1, 0.65,1.4; 0.1,0.85,1.6) -maxh=0.05;' ... 'solid boxes = box1 or box2 or box3 or box4 or box5 or box6 or box7;']}; end switch Dims; % dims = 2 (2D) or 3 (3d) case 3; fmdl= ng_mk_cyl_models(2,[Nelec,1],[0.1,0,0.03],extra); %show_fem(fmdl, [1 1 0]) case 2; fmdl= ng_mk_cyl_models(0,Nelec,[0.1,0,0.01],extra); otherwise; error('huh?'); end img= mk_image(fmdl,1); idx = fmdl.mat_idx{2}; vol= get_elem_volume(fmdl); ctrs = interp_mesh(fmdl); ctrs = ctrs( idx,: ); rctrs = sqrt(ctrs(:,1).^2 + ctrs(:,2).^2) ; x= ctrs(:,1); y= ctrs(:,2); z= ctrs(:,3); contr = 5*1e-3; area0 = sum(vol(idx)); indx = zeros(size(vol)); list = idx(y < -0.625); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{1} = indx.*vol; % img.elem_data = boxidx{1}; % show_slices(img,1) indx = zeros(size(vol)); list = idx( y < -0.375 & y > -0.625); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{2} = indx.*vol; indx = zeros(size(vol)); list = idx( y < -0.125 & y > -0.375); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{3} = indx.*vol; indx = zeros(size(vol)); list = idx(y > -0.125 & y < 0.125); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{4} = indx.*vol; indx = zeros(size(vol)); list = idx( y > 0.125 & y < 0.375); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{5} = indx.*vol; indx = zeros(size(vol)); list = idx( y > 0.375 & y < 0.625); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{6} = indx.*vol; indx = zeros(size(vol)); list = idx( y > 0.625); area1 = sum(vol(list)); indx(list)=+ contr*area0/area1; boxidx{7} = indx.*vol; end function plott(DET) ax = [-0.75, -0.5, -0.2, 0, 0.2, 0.5, 0.75]; plot(ax, DET/max(DET),'linewidth',4) ylabel('Normalized Detectability {\it z}'); xlabel('Radius'); end
Last Modified: $Date: 2017-02-28 13:12:08 -0500 (Tue, 28 Feb 2017) $ by $Author: aadler $