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

Find_Ith(varargin)
function varargout = Find_Ith(varargin)
global zeng zeng2 ZengIth

if nargin==0
    action='initial';
else
    action=varargin{1};
end

switch action
case 'initial'
    %model setup-----------------------------------------------------
    [Filename Path]=uigetfile([zeng2.cd zeng2.FILESEP 'model' zeng2.FILESEP '*.m']);
    if strcmp('0',num2str(Filename))
        return
    end
    zexst('open model file',Filename);
    %/model setup-----------------------------------------------------
    zeng2.options.vestim=1; % 1=calculated, 2=import
    zexst('change options','vestim',1);
    %zexst('DeleteFcn')
    %------------------------------------
    if length(zeng2.varlist)>1
        zexst('err','Sorry.. This version support only one "axon" in the model file.');
        return
    else
        for tempzeng=1:length(zeng2.varlist)
            feval('global',zeng2.varlist{tempzeng})
        end
    end
    %------------------------------------
    zeng.dtmode=1;
    zeng.dt=0.5;        %us
    zeng.tf=0.25;        %ms   
    ZengIth.cal.Ierr=1; %
    
    ZengIth.Istart=      500;
    ZengIth.Ilimit=      200*ZengIth.Istart;
    %-----------------------------------------
    Fired_para(1)=0.1;  %ms                                 %[Detect_Start Detect_Threthold  ]
    eval(['Fired_para(2)=75+' zeng2.var{1}.name '.vini;']) %[Detect_Start Detect_Threthold]
    %-----------------------------------------
    if 0
    	ZengIth.cal.Dia=10;
    else
%     	ZengIth.cal.Dia=1:0.5:20;
%     	ZengIth.cal.Dia=5:1:15;
     	ZengIth.cal.Dia=[14 15 21:25];

%     	ZengIth.cal.Dia=5:5:10;
    end
    ZengIth.cal.Dia_length=length(ZengIth.cal.Dia);
    %-----------------------------------------
    ZengIth.cal.X_number=5;
    ZengIth.cal.X=zeros(ZengIth.cal.X_number,ZengIth.cal.Dia_length);
    ZengIth.cal.X=zeros(ZengIth.cal.X_number,ZengIth.cal.Dia_length);
    if 1        %systematic 0-L
        ZengIth.cal.X(:,1)=linspace(0,1,ZengIth.cal.X_number)';
        for i=2:ZengIth.cal.Dia_length
            ZengIth.cal.X(:,i)=ZengIth.cal.X(:,1);
        end
    elseif 0    %systematic 0-L/2
        ZengIth.cal.X(:,1)=linspace(0,0.5,ZengIth.cal.X_number)';
        for i=2:ZengIth.cal.Dia_length
            ZengIth.cal.X(:,i)=ZengIth.cal.X(:,1);
        end
    else        %random
        ZengIth.cal.X=rand(ZengIth.cal.X_number,ZengIth.cal.Dia_length)*2-1; %[-1 +1]
    end
    eval(['Linter_D=' zeng2.var{1}.name '.Linter_D;'])
    for i=1:ZengIth.cal.Dia_length
        ZengIth.cal.X(:,i)=ZengIth.cal.X(:,i)*Linter_D*ZengIth.cal.Dia(i);
    end
    %-----------------------------------------
    %Don't sort(X), do sort(Z) only.
    if 0 % random_z
        temp=[50 200]; %range (um)
        ZengIth.cal.Z=rand(ZengIth.cal.X_number,ZengIth.cal.Dia_length)*diff(temp)+temp(1);
        ZengIth.cal.Z=sort(ZengIth.cal.Z);
    else
        ZengIth.cal.Z=[];
    end
    %-----------------------------------------
    ZengIth.cal.Ith=zeros(ZengIth.cal.X_number,ZengIth.cal.Dia_length);
    Iexstim_original=zeng.Iexstim;
    temp=0;
    Iexstim_n=length(zeng.Iexstim);
    for k=1:Iexstim_n
        temp=max(temp,abs(zeng.Iexstim(k).amp));
    end
    for k=1:Iexstim_n
        zeng.Iexstim(k).amp=zeng.Iexstim(k).amp/temp;
    end
    Iexstim=zeng.Iexstim;
    %-----------------------------------------
    Total_axons=num2str(ZengIth.cal.Dia_length*ZengIth.cal.X_number);
    Total_axons_i=0;
    %-----------------------------------------
    tic
    %---------------------------
    if 1  %for early termination
        Early_Ter_check=1;
        Early_Ter=figure(99);
        text(0.25,0.5,'close me to stop')
    else
        Early_Ter_check=0;
        
    end
    
    for i=1:ZengIth.cal.Dia_length
    %-----------------------------------------
        if 0 %vary L
            temp.L=400000; %um
            eval([zeng2.var{1}.name '.dia  =ZengIth.cal.Dia(i);'])
            eval([zeng2.var{1}.name '.nseg =1+2*round(temp.L/2/ZengIth.cal.Dia(i)/' zeng2.var{1}.name '.Linter_D)']);
            eval([zeng2.var{1}.name '.L    =' zeng2.var{1}.name '.nseg*ZengIth.cal.Dia(i)*' zeng2.var{1}.name '.Linter_D']);
        else %donot alter L
            eval([zeng2.var{1}.name '.dia  =ZengIth.cal.Dia(i);'])
        end
        %-----------------------------------------
        for j=1:ZengIth.cal.X_number
            Total_axons_i=Total_axons_i+1;
            disp([num2str(Total_axons_i) '/' Total_axons])           
            Iminmaxmean=ZengIth.Istart;
            Iminmax(1:2)=Iminmaxmean;
            for k=1:Iexstim_n
                zeng.Iexstim(k).amp   =Iexstim(k).amp*Iminmaxmean;
                zeng.Iexstim(k).xyz(1)=Iexstim(k).xyz(1)+ZengIth.cal.X(j,i);
                if ~isempty(ZengIth.cal.Z)
                    zeng.Iexstim(k).xyz(3)=ZengIth.cal.Z(j,i);
                end
            end
            zexst('Update GUI')
            drawnow
            [Fired]=zexst('calculate',Fired_para); 
            disp(['start with I = '   num2str([Iminmax]) ' - ' num2str(Fired)])
            if Fired==-1
                return
            elseif Fired==0
                while Fired==0
                    if Early_Ter_check
                        if ~ishandle(Early_Ter)
                            return
                        end
                    end
                    Iminmax(1)=Iminmax(2);
	                Iminmax(2)=Iminmax(2)*2;
                    for k=1:Iexstim_n
                        zeng.Iexstim(k).amp=Iminmax(2)*Iexstim(k).amp;
                    end
                    [Fired]=zexst('calculate',Fired_para); 
                    disp(['           I = '   num2str([mean(Iminmax)]) ' - ' num2str(Fired)])
                    if Iminmax(2)>ZengIth.Ilimit
                        Fired=1
                    end
                end
            elseif Fired==1
                while Fired==1
                    if Early_Ter_check
                        if ~ishandle(Early_Ter)
                            return
                        end
                    end
                    Iminmax(2)=Iminmax(1);
                    Iminmax(1)=Iminmax(1)*0.75;
                    for k=1:Iexstim_n
                        zeng.Iexstim(k).amp=Iminmax(1)*Iexstim(k).amp;
                    end
                    [Fired]=zexst('calculate',Fired_para); 
                    disp(['           I = '   num2str([mean(Iminmax)]) ' - ' num2str(Fired)])
            end
            else
                disp('err')
                return
            end
            disp(['I found you at ' num2str(Iminmax)])
            while 1
                if Early_Ter_check
                    if ~ishandle(Early_Ter)
                        return
                    end
                end
                Iminmaxmean=mean(Iminmax);
                if Iminmaxmean>ZengIth.Ilimit
                    ZengIth.cal.Ith(j,i)=ZengIth.Ilimit;
                    break
                end
                for k=1:Iexstim_n
                    zeng.Iexstim(k).amp=Iminmaxmean*Iexstim(k).amp;
                end
                [Fired]=zexst('calculate',Fired_para); 
                
                disp(['           I = '   num2str([Iminmaxmean]) ' - ' num2str(Fired)])
                if Fired==-1
                    return
                elseif Fired==1
                    if (100*(Iminmaxmean-Iminmax(1))/Iminmaxmean)>ZengIth.cal.Ierr
                        Iminmax(2)=Iminmaxmean;
                    else
                        disp(['           I = '   num2str([Iminmaxmean])])
                        ZengIth.cal.Ith(j,i)=Iminmaxmean;
                        break
                    end
                elseif Fired==0
                    if (100*(Iminmax(2)-Iminmaxmean)/Iminmaxmean)>ZengIth.cal.Ierr
                        Iminmax(1)=Iminmaxmean;
                    else
                        disp(['           I = '   num2str([Iminmax(2)])])
                        ZengIth.cal.Ith(j,i)=Iminmax(2);
                        break
                    end
                end
            end
            
        end %for j=1:ZengIth.cal.X_number
        Find_Ith('Save Threshold')
    end% for i=1:ZengIth.cal.Dia_length
    zeng.Iexstim=Iexstim_original;
    Find_Ith('Save Threshold')
    temp=toc;
    figure    
    if size(ZengIth.cal.Ith,1)==1
        plot(ZengIth.cal.Dia,ZengIth.cal.Ith);
    else
        errorbar(ZengIth.cal.Dia,mean(ZengIth.cal.Ith),std(ZengIth.cal.Ith),'b');
    end
    
    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 'Save Threshold'
    if 1
        ZengIth.Filename=[zeng2.file(1:(length(zeng2.file)-2)) '_Z-200'  '_PW-' num2str(1000*zeng.Iexstim(1).dur) '_dt-' num2str(zeng.dt) '_D2-20.thr'];
        ZengIth.Path=[zeng2.cd '\'];
    else
        [Filename Path]=uiputfile([thr.cd '\*.thr']);
    end

    if ~strcmp('0',num2str(ZengIth.Filename)) & ~strcmp('0',num2str(ZengIth.Path));
        Have_dot=find(ZengIth.Filename=='.');
        if isempty(Have_dot)
      	    ZengIth.Filename=[ZengIth.Filename '.thr'];   
        end
        dlmwrite([ZengIth.Path ZengIth.Filename],'');
        FID=fopen([ZengIth.Path ZengIth.Filename],'w');
        fprintf(FID,['I(mA) \t']);
        for k=1:length(zeng.Iexstim)
            fprintf(FID,[num2str(zeng.Iexstim(k).amp) '\t' ]);
        end
        fprintf(FID,['\n PW(us) \t']);
        for k=1:length(zeng.Iexstim)
            fprintf(FID,[num2str(zeng.Iexstim(k).dur*1000) '\t' ]);
        end
        fprintf(FID,['\n Delay(us) \t']);
        for k=1:length(zeng.Iexstim)
            fprintf(FID,[num2str(zeng.Iexstim(k).delay*1000) '\t' ]);
        end
        fprintf(FID,['\n X \t']);
        for k=1:length(zeng.Iexstim)
            fprintf(FID,[num2str(zeng.Iexstim(k).xyz(1)) '\t' ]);
        end
        fprintf(FID,['\n Y \t']);
        for k=1:length(zeng.Iexstim)
            fprintf(FID,[num2str(zeng.Iexstim(k).xyz(2)) '\t' ]);
        end
        fprintf(FID,['\n Z \t']);
        for k=1:length(zeng.Iexstim)
            fprintf(FID,[num2str(zeng.Iexstim(k).xyz(3)) '\t' ]);
        end
        fprintf(FID,['\n Time step (us) \t']);
        fprintf(FID,[num2str(zeng.dt)]);
        fprintf(FID,['\n']);
        for i=1:ZengIth.cal.Dia_length
		    fprintf(FID,[num2str(ZengIth.cal.Dia(i)) '\t' ]);
        end
        fprintf(FID,['\t']);
        fprintf(FID,['\t' 'X']);
        for i=1:ZengIth.cal.Dia_length
		    fprintf(FID,[ '\t' ]);
        end
        fprintf(FID,['\t' 'Z']);
        fprintf(FID,['\n']);
        for j=1:ZengIth.cal.X_number
            for i=1:ZengIth.cal.Dia_length
			    fprintf(FID,[num2str(ZengIth.cal.Ith(j,i)) '\t' ]);
            end
            fprintf(FID,['\t']);
            for i=1:ZengIth.cal.Dia_length
			    fprintf(FID,[num2str(ZengIth.cal.X(j,i)) '\t' ]);
            end
            fprintf(FID,['\t']);
            if isempty(ZengIth.cal.Z)
            else
                for i=1:ZengIth.cal.Dia_length
			        fprintf(FID,[num2str(ZengIth.cal.Z(j,i)) '\t' ]);
                end
            end
            fprintf(FID,['\n']);
        end
        Status=fclose(FID);
    end
end

Contact us at files@mathworks.com