Example #1
0
def li_iv_sum_stats(data):
    output = []
    for d in data.split_periodic(10300, adjust=True, closed_intervals=False):
        d = d.trim_left(10000, adjust=True)
        current = d['ical.i_CaL'][:-1] # the last value for some models can be NaN
        # magnitude measured as difference between peak and steady-state at end of step
        output = output + [max(current, key=abs)-current[-1]]
    return output
Example #2
0
def li_use_inact_sum_stats(data):
    def single_exp(n, k, D):
        return (1-D)+D*np.exp(-k*n)

    output1 = []
    output2 = []

    # split separate vholds
    for dvhold in data.split_periodic(sum(tsplits), adjust=True, closed_intervals=False):
        for i, f in enumerate(freq):
            pulses = [] # to hold the fitting data

            period = 1000./f

            dtrain, dvhold = dvhold.split(sum(tsplits[:i+1]))
            t0 = dtrain['engine.time'][0]
            dtrain['engine.time'] = [t-t0 for t in dtrain['engine.time']]
            dtrain = dtrain.trim_left(tpre, adjust=True)
            for d in dtrain.split_periodic(period, adjust=True, closed_intervals=False):
                d = d.trim_right(period-tpulse)
                current = d['ical.i_CaL']
                pulses = pulses + [max(current, key=abs)]

            # fit to exponential equation
            with warnings.catch_warnings():
                warnings.simplefilter('error', so.OptimizeWarning)
                warnings.simplefilter('error', RuntimeWarning)
                try:
                    # normalise to first pulse
                    norm = pulses[0]
                    for i in range(len(pulses)):
                        pulses[i] /= norm
                    popt, _ = so.curve_fit(single_exp,
                                           list(range(npulses)),
                                           pulses,
                                           p0 = [0.2, 0.2],
                                           bounds = (0.,
                                                     [np.inf, 1.0]),
                                           max_nfev=1000)

                    fit = [single_exp(n, popt[0], popt[1]) for n in range(npulses)]
                    # Calculate r2
                    ss_res = np.sum((np.array(pulses)-np.array(fit))**2)
                    ss_tot = np.sum((np.array(pulses)-np.mean(np.array(pulses)))**2)
                    r2 = 1 - (ss_res / ss_tot)
                    pulse_const = 1./popt[0]
                    ss_decay = 1.-popt[1]
                    if r2 > fit_threshold:
                        output1 = output1+[pulse_const]
                        output2 = output2+[ss_decay]
                    else:
                        raise RuntimeWarning('scipy.optimize.curve_fit found a poor fit')
                except:
                    output1 = output1 + [float('inf')]
                    output2 = output2 + [float('inf')]
    return output1+output2
Example #3
0
def li_inact_kin_sum_stats(data, fast=True, slow=True):
    def double_exp(t, tauh, taus, Ah, As, A0):
        return A0 + Ah*np.exp(-t/tauh) + As*np.exp(-t/taus)
    output_fast = []
    output_slow = []
    for d in data.split_periodic(10300, adjust=True, closed_intervals=False):
        d = d.trim_left(10000, adjust=True)

        current = d['ical.i_CaL'][:-1]
        time = d['engine.time'][:-1]
        index = np.argmax(np.abs(current))

        # Set time zero to peak current
        current = current[index:]
        time = time[index:]
        t0 = time[0]
        time = [t-t0 for t in time]

        with warnings.catch_warnings():
            warnings.simplefilter('error', OptimizeWarning)
            warnings.simplefilter('error', RuntimeWarning)
            try:
                current = [c/current[0] for c in current]
                if len(time)<=1 or len(current)<=1:
                    raise Exception('Failed simulation')
                popt, _ = so.curve_fit(double_exp,
                                       time,
                                       current,
                                       p0=[10,80,0.5,0.5,0],
                                       bounds=(0.,
                                               [np.inf, np.inf, 1.0, 1.0, 1.0]),
                                       max_nfev=1000)
                fit = [double_exp(t,popt[0],popt[1],popt[2],popt[3],popt[4]) for t in time]
                # Calculate r2
                ss_res = np.sum((np.array(current)-np.array(fit))**2)
                ss_tot = np.sum((np.array(current)-np.mean(np.array(current)))**2)
                r2 = 1 - (ss_res / ss_tot)

                tauh = min(popt[0],popt[1])
                taus = max(popt[0],popt[1])

                if r2 > fit_threshold:
                    output_fast = output_fast+[tauh]
                    output_slow = output_slow+[taus]
                else:
                    raise RuntimeWarning('scipy.optimize.curve_fit found a poor fit')
            except:
                output_fast = output_slow+[float('inf')]
                output_slow = output_slow+[float('inf')]
    output = []
    if fast:
        output += output_fast
    if slow:
        output += output_slow
    return output
Example #4
0
def li_act_sum_stats(data, ss=True, act_tau_10=False):
    def single_exp(t, tau, A):
        return 1-A*np.exp(-t/tau)
    output = []
    output_tau = []

    for d in data.split_periodic(10300, adjust=True, closed_intervals=False):
        d = d.trim_left(10000, adjust=True)
        act_gate = d['ical.g']
        if ss:
            output = output + [max(act_gate, key=abs)]

        if act_tau_10 and np.isclose(d['membrane.V'][0], 10.0):
            time = d['engine.time']
            index = np.argmax(act_gate)

            # trim anything after peak
            act_gate = act_gate[:index]
            time = time[:index]

            with warnings.catch_warnings():
                warnings.simplefilter('error', OptimizeWarning)
                warnings.simplefilter('error', RuntimeWarning)
                try:
                    norm = max(act_gate, key=abs)
                    act_gate = [a/norm for a in act_gate]
                    if len(time)<=1 or len(act_gate)<=1:
                        raise Exception('Failed simulation')
                    popt, _ = so.curve_fit(single_exp,
                                           time,
                                           act_gate,
                                           p0=[0.5, 1],
                                           bounds=(0., np.inf),
                                           max_nfev=1000)
                    fit = [single_exp(t,popt[0],popt[1]) for t in time]
                    # Calculate r2
                    ss_res = np.sum((np.array(act_gate)-np.array(fit))**2)
                    ss_tot = np.sum((np.array(act_gate)-np.mean(np.array(act_gate)))**2)
                    r2 = 1 - (ss_res / ss_tot)

                    tau = popt[0]

                    if r2 > fit_threshold:
                        output_tau = [tau]
                    else:
                        raise RuntimeWarning('scipy.optimize.curve_fit found a poor fit')
                except:
                    output_tau = [float('inf')]
    if ss:
        norm = max(output)
        for i in range(len(output)):
            output[i] /= norm
    return output+output_tau
Example #5
0
def li_inact_sum_stats(data, tstep):
    output = []
    for d in data.split_periodic(10300+tstep, adjust=True, closed_intervals=False):
        d = d.trim_left(10000+tstep, adjust=True)
        inact_gate = d['ical.g']
        output = output + [max(inact_gate, key=abs)]
    norm = output[0] # absence of prepulse
    for i in range(len(output)):
        output[i] /= norm
    # account for incomplete voltage-dependent inactivation
    # (only if fitting to Boltzmann function
    #fmin = min(output)
    #for i in range(len(output)):
    #    output[i] = (output[i]-fmin)/(1-fmin)
    return output
Example #6
0
def li_recov_sum_stats(data, fast=True, slow=True):
    def double_exp(t, tau_f, tau_s, Af, As, A0):
        return A0-Af*np.exp(-t/tau_f)-As*np.exp(-t/tau_s)
    def single_exp(t, tau_s, As, A0):
        return A0-As*np.exp(-t/tau_s)

    output1 = []
    output2 = []
    timename = 'engine.time'
    for i,d in enumerate(data.split_periodic(tsplit_recov, adjust=True, closed_intervals=False)):
        recov = []
        for t in tsplits_recov:
            d_, d = d.split(t)
            step1 = d_.trim(d_[timename][0]+10000,
                            d_[timename][0]+10300,
                            adjust=True)
            step2 = d_.trim_left(t-300, adjust=True)
            try:
                max1 = max(step1['ical.i_CaL'], key=abs)
                max2 = max(step2['ical.i_CaL'], key=abs)
                recov = recov + [max2/max1]
            except:
                recov = recov + [float('inf')]
        # Now fit output to single/double exponential
        with warnings.catch_warnings():
            warnings.simplefilter('error', so.OptimizeWarning)
            warnings.simplefilter('error', RuntimeWarning)
            if i > 0:
                try:
                    popt, _ = so.curve_fit(double_exp,
                                           twaits_recov,
                                           recov,
                                           p0=[50.,500.,0.5,0.5,0.],
                                           bounds=(0.,
                                                   [np.inf,np.inf,1.0,1.0,1.0]),
                                           max_nfev=1000)

                    fit = [double_exp(t,popt[0],popt[1],popt[2],popt[3],popt[4])
                           for t in twaits_recov]
                    # Calculate r2
                    ss_res = np.sum((np.array(recov)-np.array(fit))**2)
                    ss_tot = np.sum((np.array(recov)-np.mean(np.array(recov)))**2)
                    r2 = 1 - (ss_res / ss_tot)

                    tauf = min(popt[0],popt[1])
                    taus = max(popt[0],popt[1])
                    if r2 > fit_threshold:
                        output1 = output1+[tauf]
                        output2 = output2+[taus]
                    else:
                        raise RuntimeWarning('scipy.optimize.curve_fit found a poor fit')

                except:
                    output1 = output1+[float('inf')]
                    output2 = output2+[float('inf')]
            else:
                try:
                    popt, _ = so.curve_fit(single_exp,
                                           twaits_recov,
                                           recov,
                                           p0=[50.,0.5,0.],
                                           bounds=(0.,
                                                   [np.inf,1.0,1.0]),
                                           max_nfev=1000)

                    fit = [single_exp(t,popt[0],popt[1],popt[2])
                           for t in twaits_recov]
                    # Calculate r2
                    ss_res = np.sum((np.array(recov)-np.array(fit))**2)
                    ss_tot = np.sum((np.array(recov)-np.mean(np.array(recov)))**2)
                    r2 = 1 - (ss_res / ss_tot)

                    taus = popt[0]
                    if r2 > fit_threshold:
                        output2 = output2+[taus]
                    else:
                        raise RuntimeWarning('scipy.optimize.curve_fit found a poor fit')
                except:
                    output2 = output2+[float('inf')]
    output = []
    if fast:
        output += output1
    if slow:
        output += output2
    return output