function varargout = FEA_Ve(varargin)
global zeng zeng2
if nargin==0
action='initial';
else
action=varargin{1};
end
switch action
case 'initial'
Parent_Size=get(varargin{2},'position');
FG_Size=[Parent_Size(1) Parent_Size(2)-400-30 560 400];
ScreenSize=get(0,'ScreenSize');
if FG_Size(2)<100;
FG_Size(2)=Parent_Size(2)+Parent_Size(4)+45;
end
temp=findobj('type','figure','Name','FEA_Ve');
zeng2.options.vestim=2; %1=calculated, 2=imported
zexst('change options','vestim',2);
if ~isempty(temp)
set(temp,'position',FG_Size);
figure(temp)
else
%------------------------------------
FEAVe.Simple_mode=0; %0 = complicated, 1 = simple
%------------------------------------
FEAVe.Path=[];
FEAVe.setting=[];
FEAVe.Group=[];
%------------------------------------
%identify the axon selected in GUI
FEAVe.Axon_i =[]; %[var_number, group_number, axon_number].
%------------------------------------
FEAVe.settingdefault.Filename=[];
FEAVe.settingdefault.Group=[];
FEAVe.settingdefault.FEA=[];
FEAVe.settingdefault.mirror_ve=[];
FEAVe.settingdefault.yz=[];
FEAVe.settingdefault.number_Sites=[];
%------------------------------------
FEAVe.Groupdefault.Filename=[];
FEAVe.Groupdefault.Axon_Filename=[];
FEAVe.Groupdefault.Axon_Path=[];
FEAVe.Groupdefault.ID=[];
FEAVe.Groupdefault.axons=[];
FEAVe.Groupdefault.number_Axons=[];
FEAVe.Groupdefault.nseg=[];
FEAVe.Groupdefault.L=[];
FEAVe.Groupdefault.vestim=[];
FEAVe.Groupdefault.vestim_Real=[];
FEAVe.Groupdefault.vestim_Group=[];
FEAVe.Groupdefault.vestim_Group_Real=[];
FEAVe.Groupdefault.xyzd=[];
FEAVe.Groupdefault.fired=[];
FEAVe.Groupdefault.Iamp=[];
FEAVe.Groupdefault.Iamp_Real=[];
FEAVe.Groupdefault.FEA_Mul=[];
FEAVe.Groupdefault.FEA_fired=[];
%------------------------------------
FEAVe.figure = figure('Color',[0.8 0.8 0.8], ...
'MenuBar','none',...
'Name','FEA_Ve',...
'NumberTitle','off',...
'Position',FG_Size, ...
'ResizeFcn','FEA_Ve(''ResizeFcn'');',...
'tag','ZengAnalysis',...
'ToolBar','none');
set(FEAVe.figure,'position',FG_Size)
uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','FEA_Ve(''Load FEA'')',...
'ListboxTop',0, ...
'Position',[10 195 80 25], ...
'String','Load Ve', ...
'Tag','Pushbutton');
FEAVe.text.FEA=uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[10 165 130 25], ...
'String','Ve file', ...
'style','text');
uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'HorizontalAlignment','left',...
'ListboxTop',0, ...
'Position',[10 125 60 25], ...
'String','Xo(um) =', ...
'style','text');
FEAVe.edit.x=uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'HorizontalAlignment','center',...
'ListboxTop',0, ...
'Position',[60 125 80 25], ...
'String','0', ...
'style','edit');
FEAVe.opt.offset=uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[10 95 130 25], ...
'String','Substract the Ve with ', ...
'Tag','Pushbutton',...
'value',1,...
'style','check');
uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'HorizontalAlignment','lef',...
'ListboxTop',0, ...
'Position',[30 70 130 25], ...
'String','the Ve offset on the edges', ...
'style','text');
uicontrol('Parent',FEAVe.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','FEA_Ve(''Select Axon'')',...
'ListboxTop',0, ...
'Position',[10 30 80 25], ...
'String','Select Axon', ...
'Tag','Pushbutton');
FEAVe.axes=axes('Parent',FEAVe.figure, ...
'Units','pixel', ...
'Position',[185 40 FG_Size(3)-200 FG_Size(4)-50],...
'tag','axes');
set(FEAVe.figure,'userdata',FEAVe)
end
case 'Load FEA'
FEAVe=get(gcbf,'userdata');
%[Filename Path]=uigetfile([zeng2.cd zeng2.FILESEP 'FEA' zeng2.FILESEP '*.fea']);
[Filename Path]=uigetfile('*.fea');
if ~strcmp('0',num2str(Filename)) & ~strcmp('0',num2str(Path));
else
return
end
FEAVe.Path=Path;
FEAVe.Axon_i =[]; %[var_number, group_number, axon_number].
if isempty(FEAVe.setting) | FEAVe.Simple_mode
Group_number=1;
Group_decision=1;
FEAVe.setting=FEAVe.settingdefault;
FEAVe.setting.Filename=Filename;
FEAVe.setting.Group=1;
FEAVe.setting.mirror_ve=0;
FEAVe.Group=FEAVe.Groupdefault;
FEAVe.Group.Filename=Filename;
FEAVe.Group.ID=[1];
else
disp(['--------------------------------------'])
disp(['New file = ' Filename])
Group_decision=input(['What to do with this file? \n 1=Replace \n 2=Joy Group \n 3=Joy Group with mirror Ve \n []=Cancel \n = ']);
%Group_decision==1 is also used again later for YZ assignment
if Group_decision==1 %1=Replace
Group_number=1;
FEAVe.setting=FEAVe.settingdefault;
FEAVe.setting.Filename=Filename;
FEAVe.setting.Group=1;
FEAVe.setting.mirror_ve=0;
FEAVe.Group=FEAVe.Groupdefault;
FEAVe.Group.Filename=Filename;
FEAVe.Group.ID=[1];
elseif isempty(Group_decision) | Group_decision>3
return
else
Group_length=length(FEAVe.Group);
for i=1:length(FEAVe.setting)
if strcmp(Filename,FEAVe.setting(i).Filename)
zexst('err','You already have this file.');
return
end
end
Setting_number=length(FEAVe.setting)+1;
Group_number=1;
FEAVe.setting(Setting_number).Filename=Filename;
FEAVe.setting(Setting_number).Group=Group_number;
FEAVe.Group(Group_number).ID=[FEAVe.Group(Group_number).ID Setting_number];
if Group_decision==2 %2=Joy Group
FEAVe.setting(Setting_number).mirror_ve=0;
elseif Group_decision==3 %2=Joy Group with mirror Ve
FEAVe.setting(Setting_number).mirror_ve=1;
else
zexst('err','Bad.');
return
end
end
end %if isempty(FEAVe.setting) | FEAVe.Simple_mode
%-----------------------------------------
Setting_number=length(FEAVe.setting);
[FEAVe.setting(Setting_number).FEA FEAVe.setting(Setting_number).yz FEAVe.setting(Setting_number).number_Sites]=FEA_Ve('Import FEA',[Path Filename]);
if size(FEAVe.setting(Setting_number).FEA,2)~=4
zexst('err','Bad file')
return
end
if Group_decision==1
FEAVe.Group.yz=FEAVe.setting.yz;
end
dot=find(Filename=='.');
if isempty(dot)
else
Filename=Filename(1:(dot-1));
end
set(FEAVe.text.FEA ,'String',Filename);
set(FEAVe.figure,'userdata',FEAVe)
FEA_Ve('draw axons',FEAVe.axes)
case 'Import FEA'
%in1= [Path Filename]
%out1=FEA
%out2=yz
%out3=number_Sites
temp=dlmread([varargin{2}]);
temp(:,[1:3])=round(temp(:,[1:3]));
varargout{1}=temp;
%Find yz---------------------------------------------
minmax=[min(varargout{1}(:,1)) max(varargout{1}(:,1))];
xmax=find(varargout{1}(:,1)==minmax(2));
xmin=find(varargout{1}(:,1)==minmax(1));
% xmean=mean(minmax);
xmean=0;
temp=min(abs(varargout{1}(:,1)-xmean));
xmean=find(abs(varargout{1}(:,1)-xmean)==temp(1));
if length(xmin)==length(xmax)==length(xmean)
mychoice=xmin;
else
lengthmax=max([length(xmin) length(xmax) length(xmean)]);
if length(xmin)==lengthmax
mychoice=xmin;
elseif length(xmax)==lengthmax
mychoice=xmax;
else
mychoice=xmean;
end
end
%/Find yz---------------------------------------------
varargout{2}=varargout{1}(mychoice,[2 3]);
varargout{3}=length(varargout{2}(:,1));
%Find the offset from the FEA
if 0
%for future
veoffset=zeros(varargout{3},1);
for i=1:varargout{3}
index=find(varargout{1}(:,2)==varargout{2}(i,1) & varargout{1}(:,3)==varargout{2}(i,2));
if isempty(index)
zexst('err','Bad FEA file.')
varargout{1}=[];
varargout{2}=[];
varargout{3}=[];
varargout{4}=[];
return
else
[temp xmini]=min(varargout{1}(index,1));
[temp xmaxi]=max(varargout{1}(index,1));
if abs(varargout{1}(index(xmaxi),4))>abs(varargout{1}(index(xmini),4))
veoffset(i)=varargout{1}(index(xmini),4);
else
veoffset(i)=varargout{1}(index(xmaxi),4);
end
end
end
varargout{4}=veoffset;
end
%/Find the offset from the FEA
case 'Select Axon'
FEAVe=get(gcbf,'userdata');
if isempty(FEAVe.Group)
zexst('err','You need to "Load Ve" first.')
return
end
axes(FEAVe.axes)
yz=ginput(1);
% for tempzeng=1:length(zeng2.varlist)
% feval('global',zeng2.varlist{tempzeng})
% end
if length(zeng2.var)>1
disp('Variable List')
for i=1:length(zeng2.var)
disp([num2str(i) '=' zeng2.var{i}.name])
end
var_num = round(input(['What varialbe (1-' num2str(length(zeng2.var)) ') = ']));
if var_num>length(zeng2.var) | var_num<1
disp(['No variable selected.'])
return
end
else
var_num = 1;
end
for i=1:length(FEAVe.Group)
[ymin(1) ymin(2)]=min(abs(FEAVe.Group(i).yz(:,1)-yz(1)));
[zmin(1) zmin(2)]=min(abs(FEAVe.Group(i).yz(:,2)-yz(2)));
temp=find(FEAVe.Group(i).yz(:,1)==FEAVe.Group(i).yz(ymin(2),1) & FEAVe.Group(i).yz(:,2)==FEAVe.Group(i).yz(zmin(2),2));
if ~isempty(temp)
set(FEAVe.Group.axons,'MarkerFaceColor','None')
set(FEAVe.Group.axons(temp),'MarkerFaceColor',[1 0 0])
%----------------------------------------
%this first version supports only one axon in the model.
FEAVe.Axon_i=[var_num i temp];
break
%----------------------------------------
end
end
set(FEAVe.figure,'userdata',FEAVe)
case 'assign Ve'
%This function is called at the beginning of zexst('calculation')
FEAVe=get(varargin{2},'userdata');
xcenter=str2num(get(FEAVe.edit.x,'string'));
if isempty(xcenter) | ~isnumeric(xcenter)
zexst('err',['X center-node has to be a number.'])
zeng2.notreadytorun=1;
return
end
if isempty(FEAVe.Axon_i)
zexst('err',['With FEA_Ve, You need to "Load Ve" and "Select Axon".'])
zeng2.notreadytorun=1;
return
end
for tempzeng=1:length(zeng2.varlist)
feval('global',zeng2.varlist{tempzeng})
end
eval(['Tempvar=' zeng2.var{FEAVe.Axon_i(1)}.name ';'])
if Tempvar.Lmode==1
xyz=setxyz([1 0 0],[0 0 0],Tempvar.L,Tempvar.nseg);
elseif Tempvar.Lmode==2
xyz=setxyz([1 0 0],[0 0 0],Tempvar.Linter_D*Tempvar.dia*Tempvar.nseg,Tempvar.nseg);
else
zexst('err',['The ' zeng2.var{var_num}.name '.Lmode is bad.'])
zeng2.notreadytorun=1;
return
end
xyz(:,1)=xyz(:,1)+xcenter;
[vestim]=FEA_Ve('Ve from FEA',varargin{2},xyz(:,1));
eval([zeng2.var{FEAVe.Axon_i(1)}.name '.vestim=vestim;'])
case 'Ve from FEA'
FEAVe=get(varargin{2},'userdata');
x=varargin{3};
vestim=[];
for i=1:length(FEAVe.setting)
xmin=min(FEAVe.setting(i).FEA(:,1));
xmax=max(FEAVe.setting(i).FEA(:,1));
xpos=find(x>=xmin & x<=xmax);
if isempty(xpos)
else
index=find(FEAVe.setting(i).FEA(:,2)==FEAVe.Group.yz(FEAVe.Axon_i(3),1) & FEAVe.setting(i).FEA(:,3)==FEAVe.Group.yz(FEAVe.Axon_i(3),2));
temp=spline(FEAVe.setting(i).FEA(index,1),FEAVe.setting(i).FEA(index,4),x(xpos));
if get(FEAVe.opt.offset,'value')
temp=temp-temp(1);
%/Remove the offset from the FEA result
end
vestim=[vestim temp];
end
if FEAVe.setting(i).mirror_ve
xmin=min(-FEAVe.setting(i).FEA(:,1));
xmax=max(-FEAVe.setting(i).FEA(:,1));
xpos=find(x>=xmin & x<=xmax);
if isempty(xpos)
else
index=find(FEAVe.setting(i).FEA(:,2)==FEAVe.Group.yz(FEAVe.Axon_i(3),1) & FEAVe.setting(i).FEA(:,3)==FEAVe.Group.yz(FEAVe.Axon_i(3),2));
temp=spline(-FEAVe.setting(i).FEA(index,1),FEAVe.setting(i).FEA(index,4),x(xpos));
if get(FEAVe.opt.offset,'value')
temp=temp-temp(1);
%/Remove the offset from the FEA result
end
vestim=[vestim temp];
end
end
end
varargout{1}=vestim;
case 'ResizeFcn'
FEAVe=findobj('type','figure','tag','ZengAnalysis','Name','FEA_Ve');
FG_Size=get(FEAVe,'position');
FG_Size(3:4)=[max(FG_Size(3),250) max(FG_Size(4),250)];
FEAaxes=findobj(FEAVe,'type','axes','tag','axes');
set(FEAaxes,'position',[185 40 FG_Size(3)-200 FG_Size(4)-50]);
case 'draw axons'
FEAVe=get(findobj('type','figure','tag','ZengAnalysis','Name','FEA_Ve'),'userdata');
axes_current=varargin{2};
axes(axes_current);
delete(findobj(gca','tag','axon positions'))
xlabel('Y (um)');
ylabel('Z (um)');
xlim=[];
ylim=[];
for k=1:length(FEAVe.Group)
FEAVe.Group(k).axons=[];
if ~isempty(FEAVe.Group(k).xyzd)
FEAVe.Group(k).axons=zeros(1,FEAVe.Group(k).number_Axons);
if isempty(xlim)
xlim=[min(FEAVe.Group(k).xyzd(:,2)) max(FEAVe.Group(k).xyzd(:,2))];
ylim=[min(FEAVe.Group(k).xyzd(:,3)) max(FEAVe.Group(k).xyzd(:,3))];
else
xlim=[min(xlim(1),min(FEAVe.Group(k).xyzd(:,2))) max(xlim(2),max(FEAVe.Group(k).xyzd(:,2)))];
ylim=[min(ylim(1),min(FEAVe.Group(k).xyzd(:,3))) max(ylim(2),max(FEAVe.Group(k).xyzd(:,3)))];
end
color_map=colormap;
color_map_l=length(color_map);
marker_size=6+4*(FEAVe.Group(k).xyzd(:,4)-FEAVe.Dmmr(1))/FEAVe.Dmmr(3);
for i=1:FEAVe.Group(k).number_Axons
c=color_map(1+round((color_map_l-1)*(FEAVe.Group(k).xyzd(i,4)-FEAVe.Dmmr(1))/FEAVe.Dmmr(3)),:);
FEAVe.Group(k).axons(i)=patch(FEAVe.Group(k).xyzd(i,2),FEAVe.Group(k).xyzd(i,3),c,...
'marker','o',...
'LineWidth',1,...
'MarkerEdgeColor',c,...
'MarkerFaceColor','none',...% 'MarkerSize',8,... %'tag','patch axon');
'MarkerSize',marker_size(i),... %'tag','patch axon');
'tag','axon positions');
end
FEAVe.colorbar=colorbar;
YTickLabel=str2num(get(FEAVe.colorbar,'YTickLabel'));
set(FEAVe.colorbar,'YTickLabel',round(10*(FEAVe.Dmmr(3)*YTickLabel+FEAVe.Dmmr(1)))/10);
elseif ~isempty(FEAVe.setting(FEAVe.Group(k).ID(1)).yz)
FEAVe.Group(k).axons=zeros(1,FEAVe.setting(FEAVe.Group(k).ID(1)).number_Sites);
if isempty(xlim)
xlim=[min(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,1)) max(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,1))];
ylim=[min(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,2)) max(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,2))];
else
xlim=[min(xlim(1),min(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,1))) max(xlim(2),max(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,1)))];
ylim=[min(ylim(1),min(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,2))) max(ylim(2),max(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(:,2)))];
end
for i=1:FEAVe.setting(FEAVe.Group(k).ID(1)).number_Sites
FEAVe.Group(k).axons(i)=patch(FEAVe.setting(FEAVe.Group(k).ID(1)).yz(i,1),FEAVe.setting(FEAVe.Group(k).ID(1)).yz(i,2),'b',...
'marker','o',...
'LineWidth',1.25,...
'MarkerEdgeColor','b',...
'MarkerFaceColor','none',...
'MarkerSize',6,... %'tag','patch axon');
'tag','axon positions');
end
else
zexst('err','Something wrong at FEA_Ve')
return
end
end
set(FEAVe.figure,'userdata',FEAVe);
xlim=xlim + [-20 20];
ylim=ylim + [-20 20];
set(axes_current,'xlim',xlim,'ylim',ylim)
case 'plot hist'
figure
FEAVe=get(get(findobj('type','figure','tag','ZengAnalysis','Name','FEA_Ve'),'userdata'),'userdata');
hist((FEAVe.xyzd_fired),FEAVe.Plot_range_all);
set(gca,'xlim',[FEAVe.Plot_range(1)-1 FEAVe.Plot_range(2)]);
YLIM=get(gca,'ylim');
text(mean(FEAVe.Plot_range),YLIM(2)*0.9,['# = ' num2str(sum(FEAVe.Dfired ))])
end