function varargout = neuroFEM(varargin)
global zeng zeng2
switch varargin{1}
case 'initial'
Parent_Size=get(varargin{2},'position');
FG_Size=[Parent_Size(1) Parent_Size(2)-400-50 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','tag','ZengAnalysis_NeuroFEM');
if ~isempty(temp)
set(temp,'position',FG_Size);
figure(temp)
else
%model setup-----------------------------------------------------
zexst('open model file','FEA_Iext_axon_with_myelin.m');
%/model setup-----------------------------------------------------
zeng2.options.vestim=2; %1=calculated, 2=imported
zexst('change options','vestim',2);
zexst('DeleteFcn')
%------------------------------------
zeng.dtmode=1;
zeng.dt=0.5;
%------------------------------------
ZengFEM.Sim_i=1:10;
ZengFEM.Ierr=20; %0-30%
ZengFEM.Bin_Size=1;
ZengFEM.Simple_mode=0; %0 = complicated, 1 = simple
%------------------------------------
ZengFEM.Axon_Fired=[];
ZengFEM.Axon_Total=[];
ZengFEM.Iamp_Fired=[];
%------------------------------------
ZengFEM.Path=[];
ZengFEM.Linter_D=0;
ZengFEM.multiple=1;
ZengFEM.Dfired=[];
ZengFEM.xyzd_fired=[];
ZengFEM.setting=[];
ZengFEM.Group=[];
%------------------------------------
ZengFEM.settingdefault.Filename=[];
ZengFEM.settingdefault.Group=[];
ZengFEM.settingdefault.FEM=[];
ZengFEM.settingdefault.yz=[];
ZengFEM.settingdefault.number_Sites=[];
%------------------------------------
ZengFEM.Groupdefault.Filename=[];
ZengFEM.Groupdefault.Axon_Filename=[];
ZengFEM.Groupdefault.Axon_Path=[];
ZengFEM.Groupdefault.ID=[];
ZengFEM.Groupdefault.axons=[];
ZengFEM.Groupdefault.number_Axons=[];
ZengFEM.Groupdefault.nseg=[];
ZengFEM.Groupdefault.L=[];
ZengFEM.Groupdefault.vestim=[];
ZengFEM.Groupdefault.vestim_Real=[];
ZengFEM.Groupdefault.vestim_Group=[];
ZengFEM.Groupdefault.vestim_Group_Real=[];
ZengFEM.Groupdefault.xyzd=[];
ZengFEM.Groupdefault.fired=[];
ZengFEM.Groupdefault.Iamp=[];
ZengFEM.Groupdefault.Iamp_Real=[];
ZengFEM.Groupdefault.FEM_Mul=[];
ZengFEM.Groupdefault.FEM_fired=[];
%------------------------------------
ZengFEM.Dmmr=zeros(1,3);
ZengFEM.ZLimfire=[-90 100];
ZengFEM.ZLimnotfire=[-90 0];
%------------------------------------
ZengFEM.figure = figure('Color',[0.8 0.8 0.8], ...
'MenuBar','none',...
'Name','NeuroFEA',...
'NumberTitle','off',...
'Position',FG_Size, ...
'ResizeFcn','neuroFEM(''ResizeFcn'');',...
'tag','ZengAnalysis_NeuroFEM',...
'ToolBar','none');
set(ZengFEM.figure,'position',FG_Size)
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','neuroFEM(''Load FEM'')',...
'ListboxTop',0, ...
'Position',[10 360 60 25], ...
'String','Load FEM', ...
'Tag','Pushbutton');
ZengFEM.text.FEM=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 360 80 25], ...
'String','FEM file', ...
'style','text');
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','neuroFEM(''Load Axon'')',...
'ListboxTop',0, ...
'Position',[10 325 60 25], ...
'String','Load Axon', ...
'Tag','Pushbutton');
ZengFEM.text.Axon=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 325 80 25], ...
'String','Axon file', ...
'style','text');
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[10 290 60 25], ...
'String','Multiple', ...
'style','text');
ZengFEM.edit.mul=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 290 80 25], ...
'String',num2str(ZengFEM.multiple), ...
'style','edit');
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[10 220 60 25], ...
'String','Step(us)', ...
'style','text');
ZengFEM.edit.dt=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 220 80 25], ...
'String',num2str(zeng.dt), ...
'style','edit');
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[10 185 60 25], ...
'String','Start (us)', ...
'style','text');
ZengFEM.edit.start=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 185 80 25], ...
'String',num2str(50), ...
'style','edit');
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[10 150 60 25], ...
'String','Stop (us)', ...
'style','text');
ZengFEM.edit.stop=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 150 80 25], ...
'String',num2str(300), ...
'style','edit');
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[10 115 60 25], ...
'String','Threshold (mV)', ...
'style','text');
ZengFEM.edit.Threshold=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 115 80 25], ...
'String',num2str(75), ...
'style','edit');
ZengFEM.pop.target=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[15 80 60 25], ...
'String',{'None';'#Axons';'Mul Amp'}, ...
'style','pop',...
'value',1);
ZengFEM.edit.target=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[1 1 1], ...
'ListboxTop',0, ...
'Position',[75 80 80 25], ...
'String','0', ...
'style','edit');
ZengFEM.check.history=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[15 45 80 25], ...
'String','Keep history', ...
'style','check',...
'value',1);
ZengFEM.check.see_result=uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[100 45 80 25], ...
'String','See results', ...
'style','check',...
'value',0);
uicontrol('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','neuroFEM(''Apply'')',...
'ListboxTop',0, ...
'Position',[50 10 60 25], ...
'String','Apply', ...
'Tag','Pushbutton');
ZengFEM.axes=axes('Parent',ZengFEM.figure, ...
'Units','pixel', ...
'Position',[185 20 FG_Size(3)-200 FG_Size(4)-30],...
'tag','axes');
temp=uimenu('parent',ZengFEM.figure,'label','File');
uimenu(temp,'callback','neuroFEM(''fired axons'')','label','Save fired axons');
uimenu('parent',ZengFEM.figure,'label','Analysis','callback','neuroFEM_ana(''initial'',gcf)');
set(ZengFEM.figure,'userdata',ZengFEM)
end
case 'fired axons'
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
if isempty(ZengFEM.Dfired)
zexst('err','You have not run the simulation yet')
return
end
if nargin==1
Default_Name=get(ZengFEM.text.FEM ,'String');
if iscell(Default_Name)
Default_Name=Default_Name{1};
end
[Filename Path]=uiputfile([ZengFEM.Path Default_Name '.fir']);
else
Filename=varargin{2};
Path=varargin{3};
end
if ~strcmp('0',num2str(Filename)) & ~strcmp('0',num2str(Path));
Have_dot=find(Filename=='.');
if isempty(Have_dot)
Filename=[Filename '.fir'];
end
dlmwrite([Path Filename],'');
FID=fopen([Path Filename],'w');
fprintf(FID,'%d \t %d\n',[ [ZengFEM.Plot_range_all];ZengFEM.Dfired]);
Status=fclose(FID);
end
case 'ResizeFcn'
FEMfigure=findobj('type','figure','tag','ZengAnalysis_NeuroFEM');
FG_Size=get(FEMfigure,'position');
FG_Size(3:4)=[max(FG_Size(3),250) max(FG_Size(4),250)];
FEMaxes=findobj(FEMfigure,'type','axes','tag','axes');
temp=findobj(FEMfigure,'type','axes','tag','Colorbar');
if isempty(temp)
set(FEMaxes,'position',[185 20 FG_Size(3)-200 FG_Size(4)-30]);
else
set(FEMaxes,'position',[185 20 FG_Size(3)-250 FG_Size(4)-30]);
end
case 'Load FEM'
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
[Filename Path]=uigetfile([zeng2.cd zeng2.FILESEP 'FEM' zeng2.FILESEP '*.fea']);
if ~strcmp('0',num2str(Filename)) & ~strcmp('0',num2str(Path));
else
return
end
ZengFEM.Path=Path;
ZengFEM.Dfired=[];
if isempty(ZengFEM.setting) | ZengFEM.Simple_mode
Group_number=1;
Group_decision=1;
ZengFEM.setting=ZengFEM.settingdefault;
ZengFEM.setting.Filename=Filename;
ZengFEM.setting.Group=1;
ZengFEM.Group=ZengFEM.Groupdefault;
ZengFEM.Group.Filename=Filename;
ZengFEM.Group.ID=[1];
if ZengFEM.Simple_mode
ZengFEM.Group.Iamp=1;
else
Iamp=input('Iamp [-1 +1] = ');
ZengFEM.Group.Iamp=Iamp;
end
else
disp(['--------------------------------------'])
disp(['New file = ' Filename])
Group_decision=input(['What to do with this file? \n 1=Replace \n 2=New Group \n 3=Joy Group \n []=Cancel \n = ']);
if Group_decision==1 %1=Replace
Group_number=1;
ZengFEM.setting=ZengFEM.settingdefault;
ZengFEM.setting.Filename=Filename;
ZengFEM.setting.Group=1;
ZengFEM.Group=ZengFEM.Groupdefault;
ZengFEM.Group.Filename=Filename;
ZengFEM.Group.ID=[1];
Iamp=input('Iamp [-1 +1] = ');
ZengFEM.Group.Iamp=Iamp;
ZengFEM.Dmmr=zeros(1,3);
elseif isempty(Group_decision) | Group_decision>3
return
else
Group_length=length(ZengFEM.Group);
for i=1:length(ZengFEM.setting)
if strcmp(Filename,ZengFEM.setting(i).Filename)
zexst('err','You already have this file.');
return
end
end
Setting_number=length(ZengFEM.setting)+1;
ZengFEM.setting(Setting_number).Filename=Filename;
if Group_decision==2 %2=New Group
Group_number=Group_length+1;
ZengFEM.setting(Setting_number).Group=Group_number;
ZengFEM.Group(Group_number).Filename=Filename;
ZengFEM.Group(Group_number).ID=[Setting_number];
Iamp=input('Iamp [-1 +1] = ');
ZengFEM.Group(Group_number).Iamp=Iamp;
elseif Group_decision==3 %3=Group
for i=1:Group_length
disp([num2str(i) '=' ZengFEM.Group(i).Filename]);
end
Group_number=input('Which one do you want = ');
if isempty(Group_number) | Group_number>Group_length
return
else
ZengFEM.setting(Setting_number).Group=Group_number;
ZengFEM.Group(Group_number).ID=[ZengFEM.Group(Group_number).ID Setting_number];
Iamp=input('Iamp [-1 +1] = ');
ZengFEM.Group(Group_number).Iamp=[ZengFEM.Group(Group_number).Iamp Iamp];
end
end
end
end%if isempty(ZengFEM.setting)
Setting_number=length(ZengFEM.setting);
%-----------------------------------------
[ZengFEM.setting(Setting_number).FEM ZengFEM.setting(Setting_number).yz ZengFEM.setting(Setting_number).number_Sites]=neuroFEM('Import FEM',[Path Filename]);
%-----------------------------------------
if size(ZengFEM.setting(Setting_number).FEM,2)~=4
zexst('err','Bad file')
return
end
dot=find(Filename=='.');
if isempty(dot)
else
Filename=Filename(1:(dot-1));
end
set(ZengFEM.text.FEM ,'String',Filename);
set(ZengFEM.figure,'userdata',ZengFEM)
if Group_decision~=3
neuroFEM('draw axons',ZengFEM.axes)
else
% figure
% Temp=axes;
% neuroFEM('draw axons',Temp)
end
case 'Import FEM'
%in1= [Path Filename]
%out1=FEM
%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);
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));
case 'Load Axon'
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
if isempty(ZengFEM.Group)
zexst('err',['You need to load the Load FEM first.']);
else %isempty(ZengFEM.Group)
if nargin==1
[Filename Path]=uigetfile([zeng2.cd '\AxonDist\*.m']);
if strcmp('0',num2str(Filename)) | strcmp('0',num2str(Path));
return
end
if length(ZengFEM.Group)==1
group_chosen=1;
else
for i=1:length(ZengFEM.Group)
disp([num2str(i) ': ' ZengFEM.Group(i).Filename])
end
group_chosen = input(['What FEA file (1-' num2str(length(ZengFEM.Group)) ') = ']);
if group_chosen < 1 | group_chosen > length(ZengFEM.Group)
return
end
end
else
group_chosen=varargin{2};
Filename=ZengFEM.Group(group_chosen).Axon_Filename;
Path=ZengFEM.Group(group_chosen).Axon_Path;
end
if isempty(group_chosen)
return
else
[ZengFEM.Group(group_chosen).xyzd ZengFEM.Group(group_chosen).number_Axons ZengFEM.Bin_Size]=axon_dist([Path Filename],ZengFEM.setting(ZengFEM.Group(group_chosen).ID(1)).yz);
end
if ZengFEM.Group(group_chosen).number_Axons==0
zexst('err','Bad "Axon distribution" file')
return
end
dot=find(Filename=='.');
ZengFEM.Group(group_chosen).Axon_Filename=Filename;
ZengFEM.Group(group_chosen).Axon_Path=Path;
set(ZengFEM.text.Axon ,'String',[Filename]);
ZengFEM.Group(group_chosen).fired=[];%needed for windows-result
ZengFEM.Group(group_chosen).vestim=[];
ZengFEM.Group(group_chosen).FEM_Mul=[];
ZengFEM.Group(group_chosen).FEM_fired=[];
ZengFEM.Dmmr(1)=min(ZengFEM.Dmmr(1),min(ZengFEM.Group(group_chosen).xyzd(:,4)));
ZengFEM.Dmmr(2)=max(ZengFEM.Dmmr(2),max(ZengFEM.Group(group_chosen).xyzd(:,4)));;%[min max range]
ZengFEM.Dmmr(3)=diff(ZengFEM.Dmmr(1:2));
set(ZengFEM.figure,'userdata',ZengFEM)
neuroFEM('draw axons',ZengFEM.axes)
end
case 'Generate Voltage distribution'
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
Group_chosen=varargin{2};
ID_chosen=ZengFEM.Group(Group_chosen).ID;
ZengFEM.Group(Group_chosen).FEM_Mul=[];
ZengFEM.Group(Group_chosen).FEM_fired=[];
ScreenSize=get(0,'ScreenSize');
hWaitZengFEM = dialog('Color',[0.8 0.8 0.8], ...
'name','Please wait',...
'NumberTitle','off',...
'PaperUnits','points', ...
'Position',[(ScreenSize(3)-202)/2 (ScreenSize(4)-192)/2 202 192], ...
'Tag','Fig1', ...
'ToolBar','none');
uicontrol('Parent',hWaitZengFEM , ...
'Units','pixels', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[1 70 200 60], ...
'String','Please wait while assigning voltages to each node.', ...
'Style','text');
drawnow
Xmin=min(ZengFEM.setting(ID_chosen(1)).FEM(:,1));
Xmax=max(ZengFEM.setting(ID_chosen(1)).FEM(:,1));
Linter=(ZengFEM.Linter_D)*ZengFEM.Group(Group_chosen).xyzd(:,4);
Lintermin=min(Linter);
NodeMax=length([ -fliplr(Lintermin:Lintermin:(-Xmin)) 0:Lintermin:Xmax]);
ZengFEM.Group(Group_chosen).vestim =zeros(NodeMax,ZengFEM.Group(Group_chosen).number_Axons);
ZengFEM.Group(Group_chosen).vestim_Real=zeros(length(find(ZengFEM.setting(ID_chosen(1)).FEM(:,2)==ZengFEM.Group(Group_chosen).xyzd(1,2) & ZengFEM.setting(ID_chosen(1)).FEM(:,3)==ZengFEM.Group(Group_chosen).xyzd(1,3))),ZengFEM.Group(Group_chosen).number_Axons);
ZengFEM.Group(Group_chosen).nseg =zeros(ZengFEM.Group(Group_chosen).number_Axons,1);
length_ID_chosen=length(ID_chosen);
if length_ID_chosen==1
for i=1:ZengFEM.Group(Group_chosen).number_Axons
index=find(ZengFEM.setting(ID_chosen).FEM(:,2)==ZengFEM.Group(Group_chosen).xyzd(i,2) & ZengFEM.setting(ID_chosen).FEM(:,3)==ZengFEM.Group(Group_chosen).xyzd(i,3));
Node_Position=[ -fliplr(Linter(i):Linter(i):(-Xmin)) 0:Linter(i):Xmax]+ZengFEM.Group(Group_chosen).xyzd(i,1)*Linter(i);
ZengFEM.Group(Group_chosen).nseg(i)=length(Node_Position);
ZengFEM.Group(Group_chosen).L(i)=ZengFEM.Group(Group_chosen).nseg(i)*Linter(i);
ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).Iamp*spline(ZengFEM.setting(ID_chosen).FEM(index,1),ZengFEM.setting(ID_chosen).FEM(index,4),Node_Position)';
%Remove the offset from the FEM result
%ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).vestim(1: ZengFEM.Group(Group_chosen).nseg(i),i)-ZengFEM.Group(Group_chosen).vestim(1,i);
%/Remove the offset from the FEM result
ZengFEM.Group(Group_chosen).vestim_Real(1:length(index),i)=ZengFEM.setting(ID_chosen).FEM(index,4)';
end
else %if length(ID_chosen)==1
Mirror_Me=1;
if Mirror_Me
ZengFEM.Group(Group_chosen).vestim_Group =cell(length(ID_chosen)*2-1,1);
ZengFEM.Group(Group_chosen).vestim_Group_Real=cell(length(ID_chosen)*2-1,1);
else
ZengFEM.Group(Group_chosen).vestim_Group =cell(length(ID_chosen),1);
ZengFEM.Group(Group_chosen).vestim_Group_Real=cell(length(ID_chosen),1);
end
for i=1:length(ZengFEM.Group(Group_chosen).vestim_Group)
ZengFEM.Group(Group_chosen).vestim_Group{i} =zeros(NodeMax,ZengFEM.Group(Group_chosen).number_Axons);
ZengFEM.Group(Group_chosen).vestim_Group_Real{i}=zeros(length(find(ZengFEM.setting(ID_chosen(1)).FEM(:,2)==ZengFEM.Group(Group_chosen).xyzd(1,2) & ZengFEM.setting(ID_chosen(1)).FEM(:,3)==ZengFEM.Group(Group_chosen).xyzd(1,3))),ZengFEM.Group(Group_chosen).number_Axons);
end
for i=1:length_ID_chosen
ZengFEM.Group(Group_chosen).Iamp_Real(i)=ZengFEM.Group(Group_chosen).Iamp(i)*(1+2*(rand(1)-0.5)*ZengFEM.Ierr/100);
if i~=1 %mirror
ZengFEM.Group(Group_chosen).Iamp_Real(i+(length_ID_chosen-1))=ZengFEM.Group(Group_chosen).Iamp(i)*(1+2*(rand(1)-0.5)*ZengFEM.Ierr/100);
end
end
for i=1:ZengFEM.Group(Group_chosen).number_Axons
Node_Position=[ -fliplr(Linter(i):Linter(i):(-Xmin)) 0:Linter(i):Xmax]+ZengFEM.Group(Group_chosen).xyzd(i,1)*Linter(i);
ZengFEM.Group(Group_chosen).nseg(i)=length(Node_Position);
ZengFEM.Group(Group_chosen).L(i) =ZengFEM.Group(Group_chosen).nseg(i)*Linter(i);
for j=1:length_ID_chosen
index=find(ZengFEM.setting(ID_chosen(j)).FEM(:,2)==ZengFEM.Group(Group_chosen).xyzd(i,2) & ZengFEM.setting(ID_chosen(j)).FEM(:,3)==ZengFEM.Group(Group_chosen).xyzd(i,3));
ZengFEM.Group(Group_chosen).vestim_Group{j}(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).Iamp_Real(j)*spline(ZengFEM.setting(ID_chosen(j)).FEM(index,1),ZengFEM.setting(ID_chosen(j)).FEM(index,4),Node_Position)';
ZengFEM.Group(Group_chosen).vestim_Group_Real{j}(1:length(index),i)=ZengFEM.Group(Group_chosen).Iamp_Real(j)*ZengFEM.setting(ID_chosen(j)).FEM(index,4)';
ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)+ZengFEM.Group(Group_chosen).vestim_Group{j}(1:ZengFEM.Group(Group_chosen).nseg(i),i);
if Mirror_Me
if j~=1 %mirror
ZengFEM.Group(Group_chosen).vestim_Group{j+(length_ID_chosen-1)}(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).Iamp_Real(j+(length_ID_chosen-1))*spline(-ZengFEM.setting(ID_chosen(j)).FEM(index,1),ZengFEM.setting(ID_chosen(j)).FEM(index,4),Node_Position)';
%I don't have Ve_Group_Real
ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)+ZengFEM.Group(Group_chosen).vestim_Group{j+(length_ID_chosen-1)}(1:ZengFEM.Group(Group_chosen).nseg(i),i);
end
end
end
%/Remove the offset from the FEM result
%ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)=ZengFEM.Group(Group_chosen).vestim(1:ZengFEM.Group(Group_chosen).nseg(i),i)-ZengFEM.Group(Group_chosen).vestim(1,i);
%/Remove the offset from the FEM result
end %for i=1:ZengFEM.Group(Group_chosen).number_Axons
end%if length_ID_chosen==1
set(ZengFEM.figure,'userdata',ZengFEM);
if ishandle(hWaitZengFEM)
close(hWaitZengFEM )
end
case 'Check Value'
if nargin==1
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
else
ZengFEM=get(varargin{2},'userdata');
end
varargout{1}=0;
temp=str2num(get(ZengFEM.edit.mul,'string'));
if isempty(temp) | ~isreal(temp)
zexst('err','Multiplier has to be a number');
return
end
if temp==0
zexst('err','Multiplier cannot be zero');
return
end
ZengFEM.multiple=temp;
temp=str2num(get(ZengFEM.edit.dt ,'string'));
if isempty(temp)| temp<=0 | ~isreal(temp)
zexst('err','Time step has to be greater than zero');
return
end
zeng.dt=temp;
temp=str2num(get(ZengFEM.edit.start ,'string'));
if ~isreal(temp)
zexst('err','Start is bad.');
return
end
ZengFEM.tstart=temp/1000;
temp=str2num(get(ZengFEM.edit.stop ,'string'))/1000;
if ~isreal(temp)
zexst('err','Stop has to be a positive number.');
return
end
ZengFEM.tstop=temp;
set(ZengFEM.figure,'userdata',ZengFEM);
varargout{1}=1;
case 'Apply'
%when nargin>1, it could be from neuroFEM_ana
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
if isempty(ZengFEM.setting)
zexst('err',['You need to load the Load FEM first.']);
return
end
Good_to_go = neuroFEM('Check Value',ZengFEM.figure);
if ~Good_to_go
return
end
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata');
ZengFEM.Plot_range=[];
ZengFEM.Plot_range_all=[]
for i=1:length(ZengFEM.Group)
if isempty(ZengFEM.Group(i).xyzd)
zexst('err',['You need to load the Load Axon for all FEM files.']);
return
else
if isempty(ZengFEM.Plot_range)
ZengFEM.Plot_range=[fix(min(ZengFEM.Group(i).xyzd(:,4))) ceil(max(ZengFEM.Group(i).xyzd(:,4)))];
else
ZengFEM.Plot_range=[min(ZengFEM.Plot_range(1),fix(min(ZengFEM.Group(i).xyzd(:,4)))) max(ZengFEM.Plot_range(2),ceil(max(ZengFEM.Group(i).xyzd(:,4))))];
end
end
end
ZengFEM.Plot_range_all=[ZengFEM.Plot_range(1):ZengFEM.Bin_Size:ZengFEM.Plot_range(2)];
if length(zeng2.var)~=1
zexst('err','Something wrong with the model file.')
return
end
for tempzeng=1:length(zeng2.varlist)
feval('global',zeng2.varlist{tempzeng})
end
tic
%----------------------------------------------------------------
PW_Total=0;
for i=1:length(zeng.Iexstim)
PW_Total=PW_Total+zeng.Iexstim(i).dur
end
ZengFEM.Fired_para(1)=PW_Total+ZengFEM.tstart; %[Detect_Start Detect_Threthold]
zeng.tf=PW_Total+ZengFEM.tstop;
temp=str2num(get(ZengFEM.edit.Threshold ,'string'));
if isempty(temp)| temp<=0 | ~isreal(temp)
zexst('err','Threshold has to be a positive number.');
return
end
eval(['ZengFEM.Fired_para(2)=temp+' zeng2.var{1}.name '.vini;']) %[Detect_Start Detect_Threthold]
pop_target=get(ZengFEM.pop.target,'value')
if pop_target==1
edit_target=0;
else
temp=str2num(get(ZengFEM.edit.target ,'string'))
if isempty(temp)
zexst('err','Target is bad.');
return
end
for i=1:length(temp)
if isempty(temp(i))| temp(i)<=0 | ~isreal(temp(i))
zexst('err','Target is bad.');
return
end
end
if pop_target==2 %Axon
edit_target=fliplr(reshape(sort(temp),[1 length(temp)] ));
Itarget=ZengFEM.multiple*[0.5 1]
Itarget_check=[0 0]; %for setting the boundary of binary search
elseif pop_target==3 %Amp
edit_target=reshape(temp,[1 length(temp)]);
end
end
check_history=get(ZengFEM.check.history,'value');
%----------------------------------------------------------------
see_result=get(ZengFEM.check.see_result,'value');
if see_result
FG_Size=[0 0 500 600];
else
FG_Size=[0 0 200 100];
end
ScreenSize=get(0,'ScreenSize');
FG_Size(1:2)=[(ScreenSize(3)-FG_Size(3))/2 (ScreenSize(4)-FG_Size(4))/2];
FEMplot.figure = figure('Color',[0.8 0.8 0.8], ...
'MenuBar','none',...
'NumberTitle','off',...
'position',FG_Size,...
'tag','FEMplot',...
'ToolBar','none');
FEMplot.cancel=0;
if see_result
uicontrol('Parent',FEMplot.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','close(''gcbf'')',...
'ListboxTop',0, ...
'Position',[225 5 50 25], ...
'String','Cancel', ...
'Tag','Pushbutton');
figure(FEMplot.figure)
FEMplot.Vfire=subplot(3,2,1);
FEMplot.Ffire=subplot(3,2,3);
FEMplot.fire =subplot(3,2,5);
FEMplot.Vnotfire=subplot(3,2,2);
FEMplot.Fnotfire=subplot(3,2,4);
FEMplot.notfire =subplot(3,2,6);
set([FEMplot.Vfire FEMplot.notfire FEMplot.fire FEMplot.notfire],'ZLimMode','manual','ZLim',[-100 0]);
set([FEMplot.Ffire FEMplot.Fnotfire],'ZLimMode','manual','ZLim',[-100 0]);
else
uicontrol('Parent',FEMplot.figure, ...
'Units','pixels', ...
'BackgroundColor',[0.8 0.8 0.8], ...
'ListboxTop',0, ...
'Position',[1 35 200 60], ...
'String','You can stop me. Lazy boom!!!.', ...
'Style','text');
uicontrol('Parent',FEMplot.figure, ...
'Units','pixel', ...
'BackgroundColor',[0.85 0.8 0.75], ...
'callback','close(''gcbf'')',...
'ListboxTop',0, ...
'Position',[75 5 50 25], ...
'String','Cancel', ...
'Tag','Pushbutton');
end
%----------------------------------------------------------------
disp(['----------------------------------------------------------'])
disp(['Sim_i = ' num2str(ZengFEM.Sim_i)])
disp(['Ierr = ' num2str(ZengFEM.Ierr)])
disp(['Bin size = ' num2str(ZengFEM.Bin_Size)])
disp(['pw-start-stop = ' num2str(PW_Total) ' ' num2str(ZengFEM.Fired_para(1)) ' ' num2str(zeng.tf)])
ZengFEM.Axon_Fired=zeros(length(edit_target),length(ZengFEM.Sim_i),length(ZengFEM.Plot_range_all));
ZengFEM.Axon_Total=zeros(length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
ZengFEM.Axon_Group_Fired=zeros(length(edit_target),length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
ZengFEM.Axon_Group_Total=zeros(length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
ZengFEM.Iamp_Fired=zeros(length(edit_target),length(ZengFEM.Sim_i));
set(ZengFEM.figure,'userdata',ZengFEM);
for Sim_i=1:length(ZengFEM.Sim_i)
%-----------------------------------------
%Recreate the Ve if Linter_D has been changed.
eval(['Linter_D=' zeng2.var{1}.name '.Linter_D;'])
if length(ZengFEM.Sim_i)==1
if Linter_D==ZengFEM.Linter_D
bad_Linter=0;
else
bad_Linter=1;
ZengFEM.Linter_D=Linter_D;
set(ZengFEM.figure,'userdata',ZengFEM);
end
number_axons_total=0;
for i=1:length(ZengFEM.Group)
number_axons_total=number_axons_total+ZengFEM.Group(i).number_Axons;
if isempty(ZengFEM.Group(i).vestim) | bad_Linter
neuroFEM('Generate Voltage distribution',i);
end
end
else
ZengFEM.Linter_D=Linter_D;
if pop_target==2 %Axon
if Sim_i~=1
ZengFEM.multiple=ZengFEM.Iamp_Fired(1,1)/1000;
end
Itarget=ZengFEM.multiple*[0.5 1];
Itarget_check=[0 0]; %for setting the boundary of binary search
elseif pop_target==3 %Amp
ZengFEM.multiple=edit_target(1);
end
set(ZengFEM.figure,'userdata',ZengFEM);
number_axons_total=0;
for i=1:length(ZengFEM.Group)
number_axons_total=number_axons_total+ZengFEM.Group(i).number_Axons;
neuroFEM('Load Axon',i)
neuroFEM('Generate Voltage distribution',i);
end
%------------------------------------
end%if length(ZengFEM.Sim_i)==1
if nargin>1
if varargin{2}=='neuroFEM_ana'
return
end
end
ZengFEM=get(ZengFEM.figure,'userdata');
%------------------------------------
if pop_target==2 & ~isempty(find(edit_target>number_axons_total))
zexst('err',['Target has to be a positive number not more than the number of axons(' num2str(number_axons_total) ').']);
return
end
%------------------------------------
Temp=zeros(length(ZengFEM.Plot_range_all),1);
for i=1:length(ZengFEM.Group)
% ZengFEM.Axon_Group_Fired=zeros(length(edit_target),length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
% ZengFEM.Axon_Group_Total=zeros(length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
ZengFEM.Axon_Group_Total(i,:,Sim_i)=[hist((ZengFEM.Group(i).xyzd(:,4)),ZengFEM.Plot_range_all)]';
Temp=Temp+[hist((ZengFEM.Group(i).xyzd(:,4)),ZengFEM.Plot_range_all)]';
end
ZengFEM.Axon_Total(:,Sim_i)=Temp;
%------------------------------------
ZengFEM.Dfired=[];
edit_target_length=length(edit_target);
edit_target_i=1;
while 1 % for the target
disp([num2str(Sim_i) '-' num2str(edit_target_i) '-' num2str(ZengFEM.multiple)])
number_fired=0;
for j=1:length(ZengFEM.Group)
ZengFEM.Group(j).fired=[];
set(ZengFEM.Group(j).axons,'MarkerFaceColor','none')
if check_history & ~isempty(ZengFEM.Group(j).FEM_Mul)
Length_Amp=length(ZengFEM.Group(j).FEM_Mul);
Temp=find(ZengFEM.Group(j).FEM_Mul==ZengFEM.multiple);
if isempty(Temp)
Temp_high=find(ZengFEM.Group(j).FEM_Mul>ZengFEM.multiple);
Temp_low =find(ZengFEM.Group(j).FEM_Mul<ZengFEM.multiple);
if ~isempty(Temp_high)
Temp_high=find(ZengFEM.Group(j).FEM_Mul==min(ZengFEM.Group(j).FEM_Mul(Temp_high)));
if ~isempty(Temp_low)
Temp_low=find(ZengFEM.Group(j).FEM_Mul==max(ZengFEM.Group(j).FEM_Mul(Temp_low)));
end
Length_fired=length(ZengFEM.Group(j).FEM_fired{Temp_high});
str_Length_fired=num2str(Length_fired);
for i=1:Length_fired
% disp([num2str(Sim_i) '-' num2str(edit_target_i) ':' num2str(j) ' : ' num2str(i) '/' str_Length_fired])
drawnow
%----------------------------
if isempty(Temp_low)
eval([zeng2.var{1}.name '.nseg=ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i));'])
eval([zeng2.var{1}.name '.dia =ZengFEM.Group(j).xyzd(ZengFEM.Group(j).FEM_fired{Temp_high}(i),4);'])
eval([zeng2.var{1}.name '.L =ZengFEM.Group(j).L(ZengFEM.Group(j).FEM_fired{Temp_high}(i));'])
%--------------------------------------
Temp=ZengFEM.multiple*ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),ZengFEM.Group(j).FEM_fired{Temp_high}(i));
Temp2=zeros(length(Temp),length(zeng.Iexstim));
for k=1:length(zeng.Iexstim)
Temp2(:,k)=Temp;
end
%--------------------------------------
eval([zeng2.var{1}.name '.vestim =Temp2;'])
[Fired]=zexst('calculate',ZengFEM.Fired_para);
else
if isempty(find(ZengFEM.Group(j).FEM_fired{Temp_low}==ZengFEM.Group(j).FEM_fired{Temp_high}(i)))
eval([zeng2.var{1}.name '.nseg=ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i));'])
eval([zeng2.var{1}.name '.dia =ZengFEM.Group(j).xyzd(ZengFEM.Group(j).FEM_fired{Temp_high}(i),4);'])
eval([zeng2.var{1}.name '.L =ZengFEM.Group(j).L(ZengFEM.Group(j).FEM_fired{Temp_high}(i));'])
%--------------------------------------
Temp=ZengFEM.multiple*ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),ZengFEM.Group(j).FEM_fired{Temp_high}(i));
Temp2=zeros(length(Temp),length(zeng.Iexstim));
for k=1:length(zeng.Iexstim)
Temp2(:,k)=Temp;
end
%--------------------------------------
eval([zeng2.var{1}.name '.vestim =Temp2;'])
[Fired]=zexst('calculate',ZengFEM.Fired_para);
else
Fired=1;
ZengFEM.Group(j).fired =[ZengFEM.Group(j).fired ;ZengFEM.Group(j).FEM_fired{Temp_high}(i)];
if see_result
set(ZengFEM.Group(j).axons(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),'MarkerEdgeColor')))
end
continue
end
end
%----------------------------
if ~ishandle(FEMplot.figure)
FEMplot.cancel=1;
break
elseif Fired==-1
zexst('err','There is some error.');
return
elseif Fired==1
ZengFEM.Group(j).fired =[ZengFEM.Group(j).fired ;ZengFEM.Group(j).FEM_fired{Temp_high}(i)];
if see_result
set(ZengFEM.Group(j).axons(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),'MarkerEdgeColor')))
%axes(FEMplot.fire);mesh(zeng2.dummyvm);set(gca,'zlim',ZengFEM.ZLimfire);
axes(FEMplot.Vfire);plot(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),ZengFEM.Group(j).FEM_fired{Temp_high}(i)))
axes(FEMplot.Ffire);plot(diff(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),ZengFEM.Group(j).FEM_fired{Temp_high}(i)),2))
end
elseif Fired==0
if see_result
%axes(FEMplot.notfire);mesh(zeng2.dummyvm);;set(gca,'zlim',ZengFEM.ZLimnotfire);
axes(FEMplot.Vnotfire);plot(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),ZengFEM.Group(j).FEM_fired{Temp_high}(i)))
axes(FEMplot.Fnotfire);plot(diff(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(ZengFEM.Group(j).FEM_fired{Temp_high}(i)),ZengFEM.Group(j).FEM_fired{Temp_high}(i)),2))
end
end
%----------------------------
end%i=1:Length_fired
elseif ~isempty(Temp_low)
Temp_low=find(ZengFEM.Group(j).FEM_Mul==max(ZengFEM.Group(j).FEM_Mul(Temp_low)));
str_number_Axons=num2str(ZengFEM.Group(j).number_Axons);
for i=1:ZengFEM.Group(j).number_Axons
% disp([num2str(Sim_i) '-' num2str(edit_target_i) ':' num2str(j) ' : ' num2str(i) '/' str_number_Axons])
drawnow
if isempty(find(ZengFEM.Group(j).FEM_fired{Temp_low}==i))
eval([zeng2.var{1}.name '.nseg=ZengFEM.Group(j).nseg(i);'])
eval([zeng2.var{1}.name '.dia =ZengFEM.Group(j).xyzd(i,4);'])
eval([zeng2.var{1}.name '.L =ZengFEM.Group(j).L(i);'])
Temp=ZengFEM.multiple*ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i);
Temp2=zeros(length(Temp),length(zeng.Iexstim));
for k=1:length(zeng.Iexstim)
Temp2(:,k)=Temp;
end
%--------------------------------------
eval([zeng2.var{1}.name '.vestim =Temp2;'])
[Fired]=zexst('calculate',ZengFEM.Fired_para);
else
Fired=1;
ZengFEM.Group(j).fired =[ZengFEM.Group(j).fired ;(i)];
if see_result
set(ZengFEM.Group(j).axons(i),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(i),'MarkerEdgeColor')))
end
continue
end
if ~ishandle(FEMplot.figure)
FEMplot.cancel=1;
break
elseif Fired==-1
return
elseif Fired==1
ZengFEM.Group(j).fired =[ZengFEM.Group(j).fired ;(i)];
if see_result
set(ZengFEM.Group(j).axons(i),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(i),'MarkerEdgeColor')))
%axes(FEMplot.fire);mesh(zeng2.dummyvm);;set(gca,'zlim',ZengFEM.ZLimfire);
axes(FEMplot.Vfire);plot(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i));
axes(FEMplot.Ffire);plot(diff(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i),2));
end
elseif Fired==0
if see_result
%axes(FEMplot.notfire);mesh(zeng2.dummyvm);;set(gca,'zlim',ZengFEM.ZLimnotfire);
axes(FEMplot.Vnotfire);plot(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i));
axes(FEMplot.Fnotfire);plot(diff(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i),2));
end
end
end%for i=1:ZengFEM.Group(j).number_Axons
end %~isempty(Temp_high)
temp=length(ZengFEM.Group(j).FEM_Mul);
ZengFEM.Group(j).FEM_Mul(temp+1)=ZengFEM.multiple;
ZengFEM.Group(j).FEM_fired{temp+1}=ZengFEM.Group(j).fired;
else %if isempty(Temp)
ZengFEM.Group(j).fired =ZengFEM.Group(j).FEM_fired{Temp};
for i=1:length(ZengFEM.Group(j).fired)
set(ZengFEM.Group(j).axons(ZengFEM.Group(j).fired(i)),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(ZengFEM.Group(j).fired(i)),'MarkerEdgeColor')))
end
end %if isempty(Temp)
else %if check_history & ~isempty(ZengFEM.Group(j).FEM_Mul)
str_number_Axons=num2str(ZengFEM.Group(j).number_Axons);
for i=1:ZengFEM.Group(j).number_Axons
% disp([num2str(Sim_i) '-' num2str(edit_target_i) ':' num2str(j) ' : ' num2str(i) '/' str_number_Axons])
drawnow
eval([zeng2.var{1}.name '.nseg=ZengFEM.Group(j).nseg(i);'])
eval([zeng2.var{1}.name '.dia =ZengFEM.Group(j).xyzd(i,4);'])
eval([zeng2.var{1}.name '.L =ZengFEM.Group(j).L(i);'])
Temp=ZengFEM.multiple*ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i);
Temp2=zeros(length(Temp),length(zeng.Iexstim));
for k=1:length(zeng.Iexstim)
Temp2(:,k)=Temp;
end
eval([zeng2.var{1}.name '.vestim =Temp2;'])
[Fired]=zexst('calculate',ZengFEM.Fired_para);
if ~ishandle(FEMplot.figure)
FEMplot.cancel=1;
break
elseif Fired==-1
return
elseif Fired==1
ZengFEM.Group(j).fired =[ZengFEM.Group(j).fired ;i];
if see_result
set(ZengFEM.Group(j).axons(i),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(i),'MarkerEdgeColor')))
%axes(FEMplot.fire);mesh(zeng2.dummyvm);set(gca,'zlim',ZengFEM.ZLimfire);
axes(FEMplot.Vfire);plot(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i));
axes(FEMplot.Ffire);plot(diff(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i),2));
end
elseif Fired==0
if see_result
%axes(FEMplot.notfire);mesh(zeng2.dummyvm);set(gca,'zlim',ZengFEM.ZLimnotfire);
axes(FEMplot.Vnotfire);plot(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i));
axes(FEMplot.Fnotfire);plot(diff(ZengFEM.Group(j).vestim(1:ZengFEM.Group(j).nseg(i),i),2));
end
end
end %for i=1:ZengFEM.Group(j).number_Axons
temp=find(ZengFEM.Group(j).FEM_Mul==ZengFEM.multiple);
if isempty(temp)
temp=length(ZengFEM.Group(j).FEM_Mul);
ZengFEM.Group(j).FEM_Mul(temp+1) =ZengFEM.multiple;
ZengFEM.Group(j).FEM_fired{temp+1}=ZengFEM.Group(j).fired;
end
end %if check_history & ~isempty(ZengFEM.Group(j).FEM_Mul)
if FEMplot.cancel
return
end
number_fired=number_fired+length(ZengFEM.Group(j).fired);
end %for j=1:length(ZengFEM.Group)
if pop_target==1 %None
break
else
if edit_target(edit_target_i)==number_fired | pop_target==3 ;
%Save the fired
%Axons-------------------------------------------------
Temp=zeros(length(ZengFEM.Plot_range_all),1+length(ZengFEM.Group));
Temp(:,1)=[ZengFEM.Plot_range_all]';
for i=1:length(ZengFEM.Group)
% ZengFEM.Axon_Group_Fired=zeros(length(edit_target),length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
% ZengFEM.Axon_Group_Total=zeros(length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
Temp(:,i+1)=[hist((ZengFEM.Group(i).xyzd(ZengFEM.Group(i).fired,4)),ZengFEM.Plot_range_all)]';
ZengFEM.Axon_Group_Fired(edit_target_i,i,:,Sim_i)=Temp(:,i+1);
end
%------------------------------------------------------
ZengFEM.Axon_Fired(edit_target_i,Sim_i,:)=sum(Temp(:,[1:length(ZengFEM.Group)]+1),2);
ZengFEM.Iamp_Fired(edit_target_i,Sim_i)=round(ZengFEM.multiple*1000);
%------------------------------------------------------
if length(zeng.Iexstim)>1
Temp_Polar=['Bi' num2str(100*zeng.Iexstim(2).amp/zeng.Iexstim(1).amp)];
else
Temp_Polar='Mono'
end
if 0
Temp_name1=[ZengFEM.Group(1).Filename(1:(length(ZengFEM.Group(1).Filename))-5)];
Temp_name2=['S3VYR_A1C2-A2-50-' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['S3VYR_C4A5-80_err-' num2str(ZengFEM.Ierr) ];
elseif 0
Temp_name1=[ZengFEM.Group(1).Filename(1:(length(ZengFEM.Group(1).Filename))-6)];
Temp_name2=['LG_C1-' Temp_Polar] ;
elseif 0
Temp_name1=[ZengFEM.Group(1).Filename(1:(length(ZengFEM.Group(1).Filename))-10)];
% Temp_name2=['LG_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LGm_Vc_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LGf4_Uni200_Vc_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LG_Uni200x4_C1A2-100_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LG_Uni200x4_Vc_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LGf4_Uni200_C1A2-100_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LG_C2A1-A2-50_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
Temp_name2=['LGm_Vc_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
elseif 1
Temp_name1=[ZengFEM.Group(1).Filename(1:(length(ZengFEM.Group(1).Filename))-10)];
% Temp_name2=['S2F4-S2VYL_C1A2-100_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
Temp_name2=['S2F4-Uni400_C1A2-100_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['S2F4-S2VYL_Vc_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['Ventral-Uni400_C1A2-100_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['S2F4-Uni400_Bi_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['S2F2-Uni200_Vc_Gin_' Temp_Polar '_err-' num2str(ZengFEM.Ierr) ];
else
Temp_name1=[ZengFEM.Group(1).Filename(1:(length(ZengFEM.Group(1).Filename))-10)];
% Temp_name2=['LGf1_Uni200_C2A3_GND_' Temp_Polar 'err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LGf1_Uni200_C1A2-C2A2-50_GND_' Temp_Polar 'err-' num2str(ZengFEM.Ierr) ];
% Temp_name2=['LGf1_Uni200_C1A2-C2A2-50_GND_' Temp_Polar 'err-' num2str(ZengFEM.Ierr) ];
Temp_name2=['fs_Uni200_C1A2-C2-50-A2-25_GND_' Temp_Polar 'err-' num2str(ZengFEM.Ierr) ];
end
Temp_name3=['-' num2str(ZengFEM.Sim_i(Sim_i)) '-'];
Filename_1=[Temp_name1 '_' Temp_name2 '_pw' num2str(zeng.Iexstim(1).dur*1000)];
Filename_2=[Filename_1 '-' num2str(edit_target(edit_target_i)) Temp_name3 num2str(round(ZengFEM.multiple*1000)) '.fir'];
FID=fopen([ZengFEM.Path Filename_2],'w');
fprintf(FID,['Iexstim' '\t' 'Delay(us)' '\t' 'PW(us)' '\n']);
for i=1:length(zeng.Iexstim)
fprintf(FID,[num2str(zeng.Iexstim(i).amp) '\t' num2str(1000*zeng.Iexstim(i).delay) '\t' num2str(1000*zeng.Iexstim(i).dur) '\n']);
end
fprintf(FID,['\n' 'Iamp' '\t']);
for i=1:length(ZengFEM.Group(1).Iamp)
fprintf(FID,[num2str(ZengFEM.Group(1).Iamp(i)) '\t']);
end
fprintf(FID,['\n' 'Ierr' '\t']);
fprintf(FID,[num2str(ZengFEM.Ierr) '\t']);
fprintf(FID,['\n' 'Dia\Mul']);
fprintf(FID,['\t' num2str(round(ZengFEM.multiple*1000))]);
for i=1:length(Temp(:,1))
fprintf(FID,['\n']);
for j=1:length(Temp(1,:))
fprintf(FID,[num2str(Temp(i,j)) '\t']);
end
end
fprintf(FID,['\n']);
for i=1:length(ZengFEM.Plot_range_all)
fprintf(FID,['\n']);
fprintf(FID,[num2str(Temp(i,1)) '\t']);
fprintf(FID,[num2str(ZengFEM.Axon_Total(i,Sim_i)) '\t']);
end
fclose(FID);
%\Save the fired Axons
edit_target_i=edit_target_i+1;
if edit_target_i>edit_target_length
%------------------------------------
%Itarget_check,Itarget and ZengFEM.multiple are
%reset on the top before WHILE(edit_target_length).
%------------------------------------
%Save sum.
FID=fopen([ZengFEM.Path Filename_1 '-' num2str(ZengFEM.Sim_i(Sim_i)) '.txt'],'w');
fprintf(FID,['Iexstim' '\t' 'Delay(us)' '\t' 'PW(us)' '\n']);
for i=1:length(zeng.Iexstim)
fprintf(FID,[num2str(zeng.Iexstim(i).amp) '\t' num2str(1000*zeng.Iexstim(i).delay) '\t' num2str(1000*zeng.Iexstim(i).dur) '\n']);
end
fprintf(FID,['Iamp' '\t']);
for i=1:length(ZengFEM.Group(1).Iamp)
fprintf(FID,[num2str(ZengFEM.Group(1).Iamp(i)) '\t']);
end
fprintf(FID,['\n' 'Ierr' '\t']);
fprintf(FID,[num2str(ZengFEM.Ierr) '\t']);
fprintf(FID,['\n' 'Dia\Mul']);
for i=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Sim_i(i))]);
end
for k=length(edit_target):-1:1
fprintf(FID,['\n' num2str(edit_target(k))]);
for j=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Iamp_Fired(k,j))]);
end
%fprintf(FID,['\t' num2str(mean(ZengFEM.Iamp_Fired(k,:)))]);
%fprintf(FID,['\t' num2str(std(ZengFEM.Iamp_Fired(k,:)))]);
for i=1:length(ZengFEM.Plot_range_all)
fprintf(FID,['\n' num2str(ZengFEM.Plot_range_all(i))]);
for j=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Axon_Fired(k,j,i))]);
end
end
fprintf(FID,['\n']);
end
fprintf(FID,['\n']);
for i=1:length(ZengFEM.Plot_range_all)
fprintf(FID,['\n' num2str(ZengFEM.Plot_range_all(i))]);
for j=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Axon_Total(i,j))]);
end
end
fclose(FID)
%\Save sum.
%------------------------------------
%Save group.
if length(ZengFEM.Group)>1
for group_i=1:length(ZengFEM.Group)
FID=fopen([ZengFEM.Path Filename_1 '-Group ' num2str(group_i) '-' num2str(ZengFEM.Sim_i(Sim_i)) '.txt'],'w');
fprintf(FID,['Iexstim' '\t' 'Delay(us)' '\t' 'PW(us)' '\n']);
for i=1:length(zeng.Iexstim)
fprintf(FID,[num2str(zeng.Iexstim(i).amp) '\t' num2str(1000*zeng.Iexstim(i).delay) '\t' num2str(1000*zeng.Iexstim(i).dur) '\n']);
end
fprintf(FID,['Iamp' '\t']);
for i=1:length(ZengFEM.Group(1).Iamp)
fprintf(FID,[num2str(ZengFEM.Group(1).Iamp(i)) '\t']);
end
fprintf(FID,['\n' 'Ierr' '\t']);
fprintf(FID,[num2str(ZengFEM.Ierr) '\t']);
fprintf(FID,['\n' 'Dia\Mul']);
for i=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Sim_i(i))]);
end
for k=length(edit_target):-1:1
fprintf(FID,['\n' num2str(edit_target(k))]);
for j=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Iamp_Fired(k,j))]);
end
%fprintf(FID,['\t' num2str(mean(ZengFEM.Iamp_Fired(k,:)))]);
%fprintf(FID,['\t' num2str(std(ZengFEM.Iamp_Fired(k,:)))]);
for i=1:length(ZengFEM.Plot_range_all)
fprintf(FID,['\n' num2str(ZengFEM.Plot_range_all(i))]);
for j=1:length(ZengFEM.Sim_i)
% ZengFEM.Axon_Group_Fired=zeros(length(edit_target),length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
% ZengFEM.Axon_Group_Total=zeros(length(ZengFEM.Group),length(ZengFEM.Plot_range_all),length(ZengFEM.Sim_i));
fprintf(FID,['\t' num2str(ZengFEM.Axon_Group_Fired(k,group_i,i,j))]);
end
end
fprintf(FID,['\n']);
end
fprintf(FID,['\n']);
for i=1:length(ZengFEM.Plot_range_all)
fprintf(FID,['\n' num2str(ZengFEM.Plot_range_all(i))]);
for j=1:length(ZengFEM.Sim_i)
fprintf(FID,['\t' num2str(ZengFEM.Axon_Group_Total(group_i,i,j))]);
end
end
fclose(FID)
end
end
%\Save group.
break
else %edit_target_i>edit_target_length
if pop_target==2 ;
if Sim_i==1
%the edit_target is sort from max to min
Itarget_check=[0 1]; %for setting the boundary of binary search
Itarget=ZengFEM.multiple*[0.5 1];
ZengFEM.multiple=mean(Itarget);
else
Itarget_check=[0 0];
ZengFEM.multiple=ZengFEM.Iamp_Fired(edit_target_i,1)/1000;
Itarget=ZengFEM.multiple*[0.8 1.2];
Sim_i
ZengFEM.multiple
end
else %==3
ZengFEM.multiple=edit_target(edit_target_i);
end
end %edit_target_i>edit_target_length
elseif edit_target(edit_target_i)>number_fired;
Itarget_check(1)=1;%finding the low limit
Itarget(1)=ZengFEM.multiple;
if ~Itarget_check(2)%up limit
Itarget(2)=1.5*ZengFEM.multiple;
end
ZengFEM.multiple=mean(Itarget);
else
Itarget_check(2)=1;%finding the high limit
Itarget(2)=ZengFEM.multiple;
if ~Itarget_check(1)%low limit
Itarget(1)=0.5*ZengFEM.multiple;
end
ZengFEM.multiple=mean(Itarget);
end %if if edit_target(edit_target_i)==number_fired | pop_target==3
set(ZengFEM.edit.mul,'string',num2str(ZengFEM.multiple));
end %if pop_target==1 %None
end %%while 1 % for the target
temp=toc;
if temp<=60
disp(['finish run with ' num2str(temp) ' seconds' ])
elseif temp<=3600
temp_minute=fix(temp/60);
temp_second=mod(temp,60);
disp(['finish run with ' num2str(temp_minute) ':' num2str(temp_second) ' min:sec' ])
else
temp_hour=fix(temp/3600);
temp=temp-temp_hour*3600;
temp_minute=fix(temp/60);
temp_second=mod(temp,60);
disp(['finish run with ' num2str(temp_hour) ':' num2str(temp_minute) ':' num2str(temp_second) ' h:m:sec' ])
end
end % for Sim_i=1:length(ZengFEM.Sim_i)
if ishandle(FEMplot.figure)
delete(FEMplot.figure)
end
if see_result==0
for j=1:length(ZengFEM.Group)
for i=1:length(ZengFEM.Group(j).fired)
set(ZengFEM.Group(j).axons(ZengFEM.Group(j).fired(i)),'MarkerFaceColor',(get(ZengFEM.Group(j).axons(ZengFEM.Group(j).fired(i)),'MarkerEdgeColor')))
end
end
end
ZengFEM.xyzd_fired=[];
for i=1:length(ZengFEM.Group)
ZengFEM.xyzd_fired=[ZengFEM.xyzd_fired;ZengFEM.Group(i).xyzd(ZengFEM.Group(i).fired,4)];
end
ZengFEM.Dfired=hist((ZengFEM.xyzd_fired),ZengFEM.Plot_range_all);
set(ZengFEM.figure,'userdata',ZengFEM);
if 1
figure
hist((ZengFEM.xyzd_fired),ZengFEM.Plot_range_all);
set(gca,'xlim',[ZengFEM.Plot_range(1)-1 ZengFEM.Plot_range(2)]);
YLIM=get(gca,'ylim');
text(mean(ZengFEM.Plot_range),YLIM(2)*0.9,['# = ' num2str(sum(ZengFEM.Dfired ))])
else
neuroFEM('plot hist',ZengFEM.figure)
end
temp=toc;
if temp<=60
disp(['finish run with ' num2str(temp) ' seconds' ])
elseif temp<=3600
temp_minute=fix(temp/60);
temp_second=mod(temp,60);
disp(['finish run with ' num2str(temp_minute) ':' num2str(temp_second) ' min:sec' ])
else
temp_hour=fix(temp/3600);
temp=temp-temp_hour*3600;
temp_minute=fix(temp/60);
temp_second=mod(temp,60);
disp(['finish run with ' num2str(temp_hour) ':' num2str(temp_minute) ':' num2str(temp_second) ' h:m:sec' ])
end
case 'draw axons'
ZengFEM=get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'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(ZengFEM.Group)
ZengFEM.Group(k).axons=[];
if ~isempty(ZengFEM.Group(k).xyzd)
ZengFEM.Group(k).axons=zeros(1,ZengFEM.Group(k).number_Axons);
if isempty(xlim)
xlim=[min(ZengFEM.Group(k).xyzd(:,2)) max(ZengFEM.Group(k).xyzd(:,2))];
ylim=[min(ZengFEM.Group(k).xyzd(:,3)) max(ZengFEM.Group(k).xyzd(:,3))];
else
xlim=[min(xlim(1),min(ZengFEM.Group(k).xyzd(:,2))) max(xlim(2),max(ZengFEM.Group(k).xyzd(:,2)))];
ylim=[min(ylim(1),min(ZengFEM.Group(k).xyzd(:,3))) max(ylim(2),max(ZengFEM.Group(k).xyzd(:,3)))];
end
color_map=colormap;
color_map_l=length(color_map);
marker_size=6+4*(ZengFEM.Group(k).xyzd(:,4)-ZengFEM.Dmmr(1))/ZengFEM.Dmmr(3);
for i=1:ZengFEM.Group(k).number_Axons
c=color_map(1+round((color_map_l-1)*(ZengFEM.Group(k).xyzd(i,4)-ZengFEM.Dmmr(1))/ZengFEM.Dmmr(3)),:);
ZengFEM.Group(k).axons(i)=patch(ZengFEM.Group(k).xyzd(i,2),ZengFEM.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
ZengFEM.colorbar=colorbar;
YTickLabel=str2num(get(ZengFEM.colorbar,'YTickLabel'));
set(ZengFEM.colorbar,'YTickLabel',round(10*(ZengFEM.Dmmr(3)*YTickLabel+ZengFEM.Dmmr(1)))/10);
elseif ~isempty(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz)
ZengFEM.Group(k).axons=zeros(1,ZengFEM.setting(ZengFEM.Group(k).ID(1)).number_Sites);
if isempty(xlim)
xlim=[min(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,1)) max(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,1))];
ylim=[min(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,2)) max(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,2))];
else
xlim=[min(xlim(1),min(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,1))) max(xlim(2),max(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,1)))];
ylim=[min(ylim(1),min(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,2))) max(ylim(2),max(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(:,2)))];
end
for i=1:ZengFEM.setting(ZengFEM.Group(k).ID(1)).number_Sites
ZengFEM.Group(k).axons(i)=patch(ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(i,1),ZengFEM.setting(ZengFEM.Group(k).ID(1)).yz(i,2),'b',...
'marker','o',...
'LineWidth',1.25,...
'MarkerEdgeColor','b',...
'MarkerFaceColor','none',...
'MarkerSize',8,... %'tag','patch axon');
'tag','axon positions');
end
else
zexst('err','Something wrong at neuroFEM')
return
end
end
set(ZengFEM.figure,'userdata',ZengFEM);
xlim=xlim + [-20 20];
ylim=ylim + [-20 20];
set(axes_current,'xlim',xlim,'ylim',ylim)
case 'plot hist'
figure
ZengFEM=get(get(findobj('type','figure','tag','ZengAnalysis_NeuroFEM'),'userdata'),'userdata');
hist((ZengFEM.xyzd_fired),ZengFEM.Plot_range_all);
set(gca,'xlim',[ZengFEM.Plot_range(1)-1 ZengFEM.Plot_range(2)]);
YLIM=get(gca,'ylim');
text(mean(ZengFEM.Plot_range),YLIM(2)*0.9,['# = ' num2str(sum(ZengFEM.Dfired ))])
end