No BSD License  

Highlights from
Neurocal

image thumbnail
from Neurocal by Zeng Lertmanorat
Simulation describing the electrical activity of nerve cell (neuron) by solving cable equation

FEA_Ve(varargin)
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

Contact us at files@mathworks.com