__author__ = 'milsteina' from specify_cells import * from plot_results import * import random morph_filename = 'EB2-late-bifurcation.swc' mech_filename = '043016 Type A - km2_NMDA_KIN5_Pr' def plot_rinp_figure(rec_filename, svg_title=None): """ Expects an output file generated by parallel_rinp. File contains voltage recordings from dendritic compartments probed with hyperpolarizing current injections to measure steady-state r_inp. Plots r_inp vs distance to soma, with all dendritic sec_types superimposed. :param rec_filename: str :param svg_title: str """ dt = 0.02 if svg_title is not None: remember_font_size = mpl.rcParams['font.size'] mpl.rcParams['font.size'] = 20 sec_types = ['basal', 'trunk', 'apical', 'tuft'] distances = {} r_inp = {} fig, axes = plt.subplots(1) colors = ['k', 'r', 'c', 'y', 'm', 'g', 'b'] for sec_type in sec_types: distances[sec_type] = [] r_inp[sec_type] = [] maxval, minval = None, None with h5py.File(data_dir+rec_filename+'.hdf5', 'r') as f: trial = f.itervalues().next() amp = trial['stim']['0'].attrs['amp'] start = trial['stim']['0'].attrs['delay'] stop = start + trial['stim']['0'].attrs['dur'] for trial in f.itervalues(): rec = trial['rec']['0'] sec_type = rec.attrs['type'] if sec_type in sec_types: distances[sec_type].append(rec.attrs['soma_distance']) if sec_type == 'basal': distances[sec_type][-1] *= -1 this_rest, this_peak, this_steady = get_Rinp(trial['time'][:], rec[:], start, stop, amp) r_inp[sec_type].append(this_steady) if maxval is None: maxval = this_steady else: maxval = max(maxval, this_steady) if minval is None: minval = this_steady else: minval = min(minval, this_steady) for i, sec_type in enumerate(sec_types): axes.scatter(distances[sec_type], r_inp[sec_type], label=sec_type, color=colors[i]) axes.set_xlabel('Distance to soma (um)') axes.set_title('Input resistance gradient', fontsize=mpl.rcParams['font.size']) axes.set_ylabel('Input resistance (MOhm)') axes.set_xlim(-200., 525.) axes.set_xticks([-150., 0., 150., 300., 450.]) if (maxval is not None) and (minval is not None): buffer = 0.1 * (maxval - minval) axes.set_ylim(minval - buffer, maxval + buffer) clean_axes(axes) axes.tick_params(direction='out') #plt.legend(loc='best', scatterpoints=1, frameon=False, framealpha=0.5, fontsize=mpl.rcParams['font.size']) if not svg_title is None: fig.set_size_inches(5.27, 4.37) fig.savefig(data_dir+svg_title+' - Rinp gradient.svg', format='svg', transparent=True) plt.show() plt.close() if svg_title is not None: mpl.rcParams['font.size'] = remember_font_size def get_spike_shape(vm, equilibrate=250., th_dvdt=10., dt=0.01): """ :param vm: array :param equilibrate: float :param th_dvdt: float :param dt: float :return: tuple of float: (v_peak, th_v) """ vm = vm[int((equilibrate+0.4)/dt):] dvdt = np.gradient(vm, [dt]) th_x = np.where(dvdt > th_dvdt)[0] if th_x.any(): th_x = th_x[0] - int(1.6/dt) else: th_x = np.where(vm > -30.)[0][0] - int(2./dt) th_v = vm[th_x] v_peak = np.max(vm[th_x:th_x+int(5./dt)]) return v_peak, th_v def plot_bAP_attenuation_figure(rec_filename, svg_title=None, dt=0.01): """ Expects an output file generated by record_bAP_attenuation. File contains voltage recordings from dendritic compartments probed with a somatic current injections to measure spike attenuation. Plots spike height vs distance to soma, with all dendritic sec_types superimposed. :param rec_filename: str :param svg_title: str :param dt: float """ if svg_title is not None: remember_font_size = mpl.rcParams['font.size'] mpl.rcParams['font.size'] = 20 sec_types = ['basal', 'trunk', 'apical', 'tuft'] distances = {} spike_height = {} fig, axes = plt.subplots(1) colors = ['k', 'r', 'c', 'y', 'm', 'g', 'b'] for sec_type in sec_types: distances[sec_type] = [] spike_height[sec_type] = [] maxval, minval = None, None with h5py.File(data_dir+rec_filename+'.hdf5', 'r') as f: trial = f.itervalues().next() rec = trial['rec']['0'] equilibrate = trial['stim']['0'].attrs['delay'] duration = trial['stim']['1'].attrs['dur'] t = np.arange(0., duration, dt) soma_vm = np.interp(t, trial['time'], rec[:]) v_peak, v_th = get_spike_shape(soma_vm, equilibrate) soma_height = v_peak - v_th x_th = np.where(soma_vm[int(equilibrate/dt):] >= v_th)[0][0] + int(equilibrate/dt) for rec in (rec for rec in trial['rec'].itervalues() if not rec.attrs['type'] == 'soma'): sec_type = rec.attrs['type'] if sec_type in sec_types: distances[sec_type].append(rec.attrs['soma_distance']) if sec_type == 'basal': distances[sec_type][-1] *= -1 local_vm = np.interp(t, trial['time'], rec[:]) local_peak = np.max(local_vm[x_th:x_th+int(10./dt)]) local_pre = np.mean(local_vm[x_th-int(0.2/dt):x_th-int(0.1/dt)]) local_height = local_peak - local_pre local_height /= soma_height spike_height[sec_type].append(local_height) if maxval is None: maxval = local_height else: maxval = max(maxval, local_height) if minval is None: minval = local_height else: minval = min(minval, local_height) for i, sec_type in enumerate(sec_types): axes.scatter(distances[sec_type], spike_height[sec_type], label=sec_type, color=colors[i]) axes.set_xlabel('Distance to soma (um)') axes.set_title('bAP attenuation gradient', fontsize=mpl.rcParams['font.size']) axes.set_ylabel('Normalized spike amplitude') axes.set_xlim(-200., 525.) axes.set_xticks([-150., 0., 150., 300., 450.]) if (maxval is not None) and (minval is not None): buffer = 0.1 * (maxval - minval) axes.set_ylim(minval - buffer, maxval + buffer) clean_axes(axes) axes.tick_params(direction='out') #plt.legend(loc='best', scatterpoints=1, frameon=False, framealpha=0.5, fontsize=mpl.rcParams['font.size']) if not svg_title is None: fig.set_size_inches(5.27, 4.37) fig.savefig(data_dir+svg_title+' - bAP attenuation.svg', format='svg', transparent=True) plt.show() plt.close() if svg_title is not None: mpl.rcParams['font.size'] = remember_font_size def plot_EPSP_amplitude_figure(rec_filename, rec_loc=None, title=None, svg_title=None, dt=0.01): """ Expects an output file generated by record_bAP_attenuation. File contains voltage recordings from dendritic compartments probed with a somatic current injections to measure spike attenuation. Plots spike height vs distance to soma, with all dendritic sec_types superimposed. :param rec_filename: str :param rec_loc: str :param title: str :param svg_title: str :param dt: float """ if svg_title is not None: remember_font_size = mpl.rcParams['font.size'] mpl.rcParams['font.size'] = 20 sec_types = ['basal', 'trunk', 'apical', 'tuft'] distances = {} EPSP_amp = {} fig, axes = plt.subplots(1) colors = ['k', 'r', 'c', 'y', 'm', 'g', 'b'] for sec_type in sec_types: distances[sec_type] = [] EPSP_amp[sec_type] = [] maxval, minval = None, None if rec_loc is None: rec_loc = 'soma' if title is None: title = 'Soma' with h5py.File(data_dir+rec_filename+'.hdf5', 'r') as f: trial = f.itervalues().next() for rec_key in trial['rec']: if trial['rec'][rec_key].attrs['description'] == rec_loc: break equilibrate = trial.attrs['equilibrate'] duration = trial.attrs['duration'] t = np.arange(0., duration, dt) for trial in f.itervalues(): input_loc = trial.attrs['input_loc'] if input_loc in sec_types: distances[input_loc].append(trial['rec']['3'].attrs['soma_distance']) if input_loc == 'basal': distances[input_loc][-1] *= -1 rec = trial['rec'][rec_key] vm = np.interp(t, trial['time'][:], rec[:]) left, right = time2index(t, equilibrate - 3.0, equilibrate - 1.0) baseline = np.mean(vm[left:right]) start, end = time2index(t, equilibrate, duration) this_amp = np.max(vm[start:end]) - baseline EPSP_amp[input_loc].append(this_amp) if maxval is None: maxval = this_amp else: maxval = max(maxval, this_amp) if minval is None: minval = this_amp else: minval = min(minval, this_amp) for i, sec_type in enumerate(sec_types): axes.scatter(distances[sec_type], EPSP_amp[sec_type], label=sec_type, color=colors[i]) axes.set_xlabel('Distance to soma (um)') axes.set_title(title+' EPSP amplitude', fontsize=mpl.rcParams['font.size']) axes.set_ylabel('EPSP amplitude (mV)') axes.set_xlim(-200., 525.) axes.set_xticks([-150., 0., 150., 300., 450.]) if (maxval is not None) and (minval is not None): buffer = 0.1 * (maxval - minval) axes.set_ylim(minval - buffer, maxval + buffer) clean_axes(axes) axes.tick_params(direction='out') #plt.legend(loc='best', scatterpoints=1, frameon=False, framealpha=0.5, fontsize=mpl.rcParams['font.size']) if not svg_title is None: fig.set_size_inches(5.27, 4.37) fig.savefig(data_dir+svg_title+' - '+title+' EPSP amplitude.svg', format='svg', transparent=True) plt.show() plt.close() if svg_title is not None: mpl.rcParams['font.size'] = remember_font_size def plot_EPSP_duration_figure(rec_filename, rec_loc=None, title=None, svg_title=None, dt=0.01): """ Expects an output file generated by record_bAP_attenuation. File contains voltage recordings from dendritic compartments probed with a somatic current injections to measure spike attenuation. Plots spike height vs distance to soma, with all dendritic sec_types superimposed. :param rec_filename: str :param rec_loc: str :param title: str :param svg_title: str :param dt: float """ if svg_title is not None: remember_font_size = mpl.rcParams['font.size'] mpl.rcParams['font.size'] = 20 sec_types = ['basal', 'trunk', 'apical', 'tuft'] distances = {} EPSP_duration = {} fig, axes = plt.subplots(1) colors = ['k', 'r', 'c', 'y', 'm', 'g', 'b'] for sec_type in sec_types: distances[sec_type] = [] EPSP_duration[sec_type] = [] maxval, minval = None, None if rec_loc is None: rec_loc = 'soma' if title is None: title = 'Soma' with h5py.File(data_dir+rec_filename+'.hdf5', 'r') as f: trial = f.itervalues().next() for rec_key in trial['rec']: if trial['rec'][rec_key].attrs['description'] == rec_loc: break equilibrate = trial.attrs['equilibrate'] duration = trial.attrs['duration'] t = np.arange(0., duration, dt) for trial in f.itervalues(): input_loc = trial.attrs['input_loc'] if input_loc in sec_types: distances[input_loc].append(trial['rec']['3'].attrs['soma_distance']) if input_loc == 'basal': distances[input_loc][-1] *= -1 rec = trial['rec'][rec_key] vm = np.interp(t, trial['time'][:], rec[:]) left, right = time2index(t, equilibrate - 3.0, equilibrate - 1.0) baseline = np.mean(vm[left:right]) start, end = time2index(t, equilibrate, duration) interp_t = np.array(t[start:end]) interp_t -= interp_t[0] vm = vm[start:end] - baseline amp = np.max(vm) t_peak = np.where(vm == amp)[0][0] vm /= amp rise_50 = np.where(vm[:t_peak] >= 0.5)[0][0] decay_50 = np.where(vm[t_peak:] <= 0.5)[0][0] this_duration = interp_t[decay_50] + interp_t[t_peak] - interp_t[rise_50] EPSP_duration[input_loc].append(this_duration) if maxval is None: maxval = this_duration else: maxval = max(maxval, this_duration) if minval is None: minval = this_duration else: minval = min(minval, this_duration) for i, sec_type in enumerate(sec_types): axes.scatter(distances[sec_type], EPSP_duration[sec_type], label=sec_type, color=colors[i]) axes.set_xlabel('Distance to soma (um)') axes.set_title(title+' EPSP duration', fontsize=mpl.rcParams['font.size']) axes.set_ylabel('EPSP duration (ms)') axes.set_xlim(-200., 525.) axes.set_xticks([-150., 0., 150., 300., 450.]) if (maxval is not None) and (minval is not None): buffer = 0.1 * (maxval - minval) axes.set_ylim(minval - buffer, maxval + buffer) clean_axes(axes) axes.tick_params(direction='out') #plt.legend(loc='best', scatterpoints=1, frameon=False, framealpha=0.5, fontsize=mpl.rcParams['font.size']) if not svg_title is None: fig.set_size_inches(5.27, 4.37) fig.savefig(data_dir+svg_title+' - '+title+' EPSP duration.svg', format='svg', transparent=True) plt.show() plt.close() if svg_title is not None: mpl.rcParams['font.size'] = remember_font_size def plot_spine_attenuation_ratio_figure(rec_filename, svg_title=None, dt=0.01): """ Expects an output file generated by parallel_spine_attenuation_ratio. File contains voltage recordings from spines and parent branches during EPSC-shaped current injections. Attenuation is measured as the ratio of branch to spine voltage amplitude. Plots attenuation ration vs distance to soma, with all dendritic sec_types superimposed. :param rec_filename: str :param svg_title: str :param dt: float """ if svg_title is not None: remember_font_size = mpl.rcParams['font.size'] mpl.rcParams['font.size'] = 20 sec_types = ['basal', 'trunk', 'apical', 'tuft'] distances = {} ratio = {} index_dict = {} fig, axes = plt.subplots(1) colors = ['k', 'r', 'c', 'y', 'm', 'g', 'b'] for sec_type in sec_types: distances[sec_type] = [] ratio[sec_type] = [] maxval, minval = None, None with h5py.File(data_dir+rec_filename+'.hdf5', 'r') as f: trial = f.itervalues().next() # amp = trial.attrs['amp'] equilibrate = trial.attrs['equilibrate'] duration = trial.attrs['duration'] t = np.arange(0., duration, dt) for trial_key in f: trial = f[trial_key] stim_loc = trial.attrs['stim_loc'] spine_rec = trial['rec']['0'] if trial['rec']['0'].attrs['description'] == 'spine' else trial['rec']['1'] spine_index = spine_rec.attrs['index'] if not spine_index in index_dict: index_dict[spine_index] = {} index_dict[spine_index][stim_loc] = trial_key for index in index_dict.itervalues(): spine_stim = f[index['spine']]['rec'] spine_tvec = f[index['spine']]['time'] for rec in spine_stim.itervalues(): if rec.attrs['description'] == 'branch': branch_rec = rec sec_type = rec.attrs['type'] elif rec.attrs['description'] == 'spine': spine_rec = rec distances[sec_type].append(spine_rec.attrs['soma_distance']) if sec_type == 'basal': distances[sec_type][-1] *= -1 branch_vm = np.interp(t, spine_tvec[:], branch_rec[:]) spine_vm = np.interp(t, spine_tvec[:], spine_rec[:]) left, right = time2index(t, equilibrate - 3.0, equilibrate - 1.0) baseline_branch = np.mean(branch_vm[left:right]) baseline_spine = np.mean(spine_vm[left:right]) left, right = time2index(t, equilibrate, duration) peak_branch = np.max(branch_vm[left:right]) - baseline_branch peak_spine = np.max(spine_vm[left:right]) - baseline_spine this_ratio = peak_spine / peak_branch ratio[sec_type].append(this_ratio) if maxval is None: maxval = this_ratio else: maxval = max(maxval, this_ratio) if minval is None: minval = this_ratio else: minval = min(minval, this_ratio) for i, sec_type in enumerate(sec_types): axes.scatter(distances[sec_type], ratio[sec_type], label=sec_type, color=colors[i]) axes.set_xlabel('Distance to soma (um)') axes.set_title('Spine to branch EPSP attenuation', fontsize=mpl.rcParams['font.size']) axes.set_ylabel('EPSP attenuation ratio') axes.set_xlim(-200., 525.) axes.set_xticks([-150., 0., 150., 300., 450.]) if (maxval is not None) and (minval is not None): buffer = 0.1 * (maxval - minval) axes.set_ylim(minval - buffer, maxval + buffer) clean_axes(axes) axes.tick_params(direction='out') #plt.legend(loc='best', scatterpoints=1, frameon=False, framealpha=0.5, fontsize=mpl.rcParams['font.size']) if not svg_title is None: fig.set_size_inches(5.27, 4.37) fig.savefig(data_dir+svg_title+' - spine attenuation ratio.svg', format='svg', transparent=True) plt.show() plt.close() if svg_title is not None: mpl.rcParams['font.size'] = remember_font_size NMDA_type = 'NMDA_KIN5' excitatory_stochastic = 1 syn_types = ['AMPA_KIN', NMDA_type] local_random = random.Random() cell = CA1_Pyr(morph_filename, mech_filename, full_spines=True) cell.set_terminal_branch_na_gradient() cell.insert_inhibitory_synapses_in_subset() # place synapses in every spine for sec_type in ['basal', 'trunk', 'apical', 'tuft']: for node in cell.get_nodes_of_subtype(sec_type): for spine in node.spines: syn = Synapse(cell, spine, syn_types, stochastic=excitatory_stochastic) cell.init_synaptic_mechanisms() AMPAR_Po = 0.3252 """ plot_mech_param_distribution(cell, 'pas', 'g', param_label='Leak conductance gradient', svg_title='051316 - cell107') plot_mech_param_distribution(cell, 'h', 'ghbar', param_label='Ih conductance gradient', svg_title='051316 - cell107') plot_mech_param_distribution(cell, 'nas', 'gbar', param_label='Na conductance gradient', svg_title='051316 - cell107') plot_sum_mech_param_distribution(cell, [('kap', 'gkabar'), ('kad', 'gkabar')], param_label='A-type K conductance gradient', svg_title='051316 - cell107') plot_synaptic_param_distribution(cell, 'AMPA_KIN', 'gmax', scale_factor=1000.*AMPAR_Po, yunits='nS', param_label='Synaptic AMPAR gradient', svg_title='051316 - cell107') plot_rinp_figure('043016 Type A - km2_NMDA_KIN5_Pr - Rinp', '051316 - cell107') plot_bAP_attenuation_figure('output051320161518-pid24213_bAP', '051316 - cell107') plot_EPSP_amplitude_figure('043016 Type A - km2_NMDA_KIN5_Pr - epsp attenuation', svg_title='051316 - cell107') plot_EPSP_amplitude_figure('043016 Type A - km2_NMDA_KIN5_Pr - epsp attenuation', rec_loc='branch', title='Branch', svg_title='051316 - cell107') plot_EPSP_duration_figure('043016 Type A - km2_NMDA_KIN5_Pr - epsp attenuation', svg_title='051316 - cell107') plot_EPSP_duration_figure('043016 Type A - km2_NMDA_KIN5_Pr - epsp attenuation', rec_loc='branch', title='Branch', svg_title='051316 - cell107') """ plot_spine_attenuation_ratio_figure('043016 Type A - km2_NMDA_KIN5_Pr - spine AR', svg_title='051316 - cell107')