A mathematical model of evoked calcium dynamics in astrocytes (Handy et al 2017)

 Download zip file 
Help downloading and running models
Accession:189344
" ...Here we present a qualitative analysis of a recent mathematical model of astrocyte calcium responses. We show how the major response types are generated in the model as a result of the underlying bifurcation structure. By varying key channel parameters, mimicking blockers used by experimentalists, we manipulate this underlying bifurcation structure and predict how the distributions of responses can change. We find that store-operated calcium channels, plasma membrane bound channels with little activity during calcium transients, have a surprisingly strong effect, underscoring the importance of considering these channels in both experiments and mathematical settings. ..."
Reference:
1 . Handy G, Taheri M, White JA, Borisyuk A (2017) Mathematical investigation of IP3-dependent calcium dynamics in astrocytes. J Comput Neurosci 42:257-273 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Glia;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s): Ca pump; I_SERCA; I Calcium;
Gap Junctions:
Receptor(s): IP3;
Gene(s):
Transmitter(s):
Simulation Environment: MATLAB; XPP;
Model Concept(s): Calcium dynamics; Oscillations; Bifurcation;
Implementer(s): Handy, Gregory [handy at math.utah.edu]; Taheri, Marsa ;
Search NeuronDB for information about:  IP3; I Calcium; I_SERCA; Ca pump;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright: Marsa Taheri and Gregory Handy, 2016
% This code was used to simulate the mathematical model of Astrocyte 
% IP3-dependent Ca responses in 2 papers submitted in Nov 2016.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%The script here is used around line 188 of "FourCaResponseTypes.m" 
%function and is essentially the same as the end of the code in
%"FourCaResponseTypes.m"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if isempty(bumpVal)==0 %There is a bump after the (one) peak
    height1 = PeakVal(1) - b4Resp;
    height2 = bumpVal - x(ZeroDerLoc); %Should not use "b4Resp"
    AllHeights = [height1, height2];
    if max(AllHeights)*0.05<=min(AllHeights) && (x(ZeroDerLoc) - b4Resp) < 0.5*h
        display('Multi-Peak')
        RespType='MP';
        return
    else %Now, only the d1 and d2 matter to determine if it's a SP or Plat
        %There's 1 peak and a bump that is too small to be MP OR the "trough" is at >50% of h
        EndOfResponse = LastTrough1; 
        PlatToEnd = EndOfResponse - ZeroDerLoc;
        Trough1ToPlat = ZeroDerLoc - TrueTroughLoc(1);
        if (x(ZeroDerLoc)-b4Resp)>=0.1*h && PlatToEnd>0.5*Trough1ToPlat
            if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
                display('Long-Lasting')
                RespType='LL';
                return
            else
                display('Plateau')
                RespType='Plat';
                return
            end
        elseif length(DerivMinLoc)>3 %4 or more times
            if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now!
                display('Long-Lasting')
                RespType='LL';
                return
            else
                display('Plateau')
                RespType='Plat';
                return
            end
        else
            if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
                display('Long-Lasting')
                RespType='LL';
                return
            else
                display('Single-Peak')
                RespType='SP';
                return
            end
        end
        
    end
    
%From here on, it must be a SP, LL, or Plateau response (though had
%some SP & Plat cases above too), though not MP:
elseif isempty(MPTrough) && T>1 %The trough was >50% of adjacent heights
    if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
        display('Long-Lasting')
        RespType='LL';
        return
    else
        display('Plateau')
        RespType='Plat';
        return
    end
    
elseif P>2
    %Still need to check two things- Distance and TroughLoc:
    EndOfResponse = PeakLoc(2) + find(x(PeakLoc(2):end) > 1.15*x(1), 1, 'last');
    PlatToEnd = EndOfResponse - ZeroDerLoc;
    Trough1ToPlat = ZeroDerLoc - TrueTroughLoc(1);
    %Note: This part is only valid if the 1st peak is the highest peak;
    %otherwise, the code will need to be modified.
    if (x(ZeroDerLoc)-b4Resp)>=0.1*(PeakVal(1)-b4Resp) && PlatToEnd>0.5*Trough1ToPlat
        if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
            display('Long-Lasting')
            RespType='LL';
            return
        else
            display('Plateau')
            RespType='Plat';
            return
        end
    else
        if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
            display('Long-Lasting')
            RespType='LL';
            return
        else
            display('Single-Peak')
            RespType='SP';
        end
    end
    
    %NOTE: The part below assumes the 1st peak of 2 peaks is larger; If
    %this is not the case, then the code needs to be adjusted to consider 
    %the opposite case too.
elseif P==2 %&& T==1, at this point this must be true too
    EndOfResponse = PeakLoc(2) + find(x(PeakLoc(2):end) > 1.15*x(1), 1, 'last');
    PlatToEnd = EndOfResponse - ZeroDerLoc;
    Trough1ToPlat = ZeroDerLoc - TrueTroughLoc(1);
    if (x(ZeroDerLoc)-b4Resp)>=0.1*(PeakVal(1)-b4Resp) && PlatToEnd>0.5*Trough1ToPlat
        if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
            display('Long-Lasting')
            RespType='LL';
            return
        else
            display('Plateau')
            RespType='Plat';
            return
        end
    else
        if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
            display('Long-Lasting')
            RespType='LL';
            return
        else
            display('Single-Peak')
            RespType='SP';
            return
        end
    end
    
elseif P==1 %The only case remaining
    if length(DerivMinLoc)==1
        if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
            display('Long-Lasting')
            RespType='LL';
            return
        else
            display('Single-Peak')
            RespType='SP';
        return
        end
    elseif length(DerivMinLoc)>3 %4 or more times
        if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
            display('Long-Lasting')
            RespType='LL';
            return
        else
            display('Plateau')
            RespType='Plat';
            return
        end
    else %When the deriv decreases 2 or 3 times
        diffTrace=diff(x);
        [~,l]= findpeaks((diff(diff(x(Decreasing:LastTrough1))).^2),'SORTSTR', 'descend');
        if isempty(l)
            PlatPoint=ZeroDerLoc;
        else
            PlatPointTemp = Decreasing + l(1); %l(1) is max peak since findpeaks in descending order
            PlatPoint = min(PlatPointTemp, ZeroDerLoc);
            if abs(diffTrace(PlatPoint))>5e-4 %Checks if the deriv at the chosen PlatPoint
                %is not close enough to zero
                PlatPoint = max(PlatPointTemp, ZeroDerLoc);
            end
        end
        EndOfResponse = LastTrough1;
        PlatToEnd = EndOfResponse - PlatPoint;
        Trough1ToPlat = PlatPoint - TrueTroughLoc(1);
        if (x(PlatPoint)-b4Resp)>=0.1*h && PlatToEnd > 0.5*Trough1ToPlat 
            if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
                display('Long-Lasting')
                RespType='LL';
                return
            else
                display('Plateau')
                RespType='Plat';
                return
            end
        else
            if t(LastTrough)-t(TrueTroughLoc(1)) > LL_Dur %since the whole response is one segment now
                display('Long-Lasting')
                RespType='LL';
                return
            else
                display('Single-Peak')
                RespType='SP';
                return
            end
        end
    end
end

Loading data, please wait...