Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons.
The 22 matches
- [1] § STAR★METHODS › METHOD DETAILS › Inhibitory inputs ↔ Code_data_generation/Cluster_cells_validation_protocols.py, lines 769–832 · score 0.85 · hippocampal network, PVbasket, Ivy cells, 2.8 Hz, transmission, neurogliaform
- [2] § STAR★METHODS › METHOD DETAILS › Inhibitory inputs ↔ Code_data_generation/Cluster_make_connectivity.py, lines 393–435 · score 0.80 · hippocampal network, PVbasket, Ivy cells, neurogliaform, parvalbumin, NGF
- [3] § STAR★METHODS › METHOD DETAILS › Grid-like and place-like inputs structure ↔ Make_input/Cluster_make_grid_like_inputs.py, lines 148–233 · score 0.79 · 30–40 Hz, place field location, theta phase, tref, CA3, EC
- [4] § STAR★METHODS › METHOD DETAILS › Pyramidal neuron model validation ↔ Code_data_generation/Cluster_cells_validation_protocols.py, lines 317–398 · score 0.79 · voltage attenuation, passive properties, pyramidal neurons, Rin, validated, curve
- [5] § STAR★METHODS › METHOD DETAILS › Input distribution ↔ Code_data_generation/Cluster_make_connectivity_higher_w_infield.py, lines 130–253 · score 0.77 · chosen place field, probability distribution, clustered synapses, bias, place tuned, cumulative
- [6] § STAR★METHODS › METHOD DETAILS › Inhibitory inputs ↔ Make_input/poisson_input.py, lines 417–522 · score 0.76 · filtered Poisson distributed, theta cycle, theta modulated, spike trains, firing rates, phase
- [7] § STAR★METHODS › QUANTIFICATION AND STATISTICAL ANALYSIS › Multivariate random forest ↔ Code_data_generation/Code_data_analysis/Analysis_synapse_distribution_ML.py, lines 462–545 · score 0.76 · Min Max Scaler, Random Forest regression, predict, trained, model, protocols
- [8] § STAR★METHODS › METHOD DETAILS › Inhibitory inputs ↔ Make_input/poisson_input_interneurons.py, lines 41–124 · score 0.75 · theta cycle, theta modulated, Poisson distributed, spike trains, firing rates, interneuron
- [9] § RESULTS › Functional role of input clustering in place cell computation ↔ Figure_6.py, lines 65–106 · score 0.74 · pairwise Mann Whitney, Benjamini Hochberg, Kruskal Wallis, FDR, Figure 6
- [10] § RESULTS › Synaptic clustering amplifies dendritic gain and sustains calcium influx under noisy input regimes ↔ Figure_4.py, lines 383–398 · score 0.72 · dendritic firing rates, dendritic spiking, somatic spiking, dendritic activity, activated synapses, Figure 4
- [11] § RESULTS › From reconstruction of synaptic distribution to modeling of neuronal functional properties ↔ Code_data_generation/Cluster_cells_validation_protocols.py, lines 769–832 · score 0.69 · PVbasket, Ivy cells, neurogliaform, parvalbumin, NGF, Bistratified
- [12] § STAR★METHODS › QUANTIFICATION AND STATISTICAL ANALYSIS › Place cell quantification ↔ Code_data_generation/Code_data_analysis/place_cell_metrics.py, lines 225–294 · score 0.69 · linear track, firing rate maps, field Firing, Place Field, metric, peak
- [13] § STAR★METHODS › METHOD DETAILS › Somato-dendritic parameter distributions ↔ Code_data_generation/Cluster_cells_validation_protocols.py, lines 317–398 · score 0.68 · CA1 pyramidal neurons, passive properties, integration properties, uniformly, apical, location
- [14] § RESULTS › From reconstruction of synaptic distribution to modeling of neuronal functional properties ↔ Code_data_generation/Cluster_make_connectivity.py, lines 393–435 · score 0.67 · PVbasket, Ivy cells, neurogliaform, parvalbumin, NGF, Bistratified
- [15] § STAR★METHODS › METHOD DETAILS › Inputs design ↔ Make_input/poisson_input.py, lines 417–522 · score 0.64 · Gaussian filtered Poisson, Poisson distributed, spike trains, firing rate, peak, noise
- [16] § RESULTS › Dendritic subdomain-specific strategies differentially shape spatial tuning ↔ Code_data_generation/Code_data_analysis/Analysis_synapse_distribution_ML.py, lines 462–545 · score 0.62 · squared error, random forest, RF, MSE, regression, predict
- [17] § RESULTS › Dendritic subdomain-specific strategies differentially shape spatial tuning ↔ Figure_7.py, lines 39–124 · score 0.59 · squared error, random forest, RF, MSE, variable, Figure 7
- [18] § STAR★METHODS › METHOD DETAILS › Input distribution ↔ Figure_5.py, lines 317–340 · score 0.55 · PV basket, CCK, Bistratified, Bezaire, apical, probabilities
- [19] § RESULTS › Synaptic clustering amplifies dendritic gain and sustains calcium influx under noisy input regimes ↔ Figure_4.py, lines 419–434 · score 0.52 · NMDA charge, NMDA spike, activated synapses, CI, Figure 4, shuffled
- [20] § RESULTS › From reconstruction of synaptic distribution to modeling of neuronal functional properties ↔ Figure_3.py, lines 285–332 · score 0.52 · Passive properties, sag ratio, resistance, models, Figure 3
- [21] § RESULTS › Domain-specific analysis of synaptic organization in CA1 PNs ↔ Code_data_generation/Code_data_analysis/Analysis_synapse_distribution_ML.py, lines 230–319 · score 0.51 · density distribution, co tuned, uniformly, subdomains, shuffling, volume
- [22] § RESULTS › From reconstruction of synaptic distribution to modeling of neuronal functional properties ↔ Figure_5.py, lines 224–272 · score 0.50 · excitatory theta oscillation, spike trains, interneuron, activity, Figure 5
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 1,224 lines · 51 KB · GPL-3.0 · 4 matches
- # -*- coding: utf-8 -*-
- """
- Created on Tue Apr 23 11:39:07 2024
- @author: simon
- """
- from neuron import h
- from neuron.units import mV, ms
- from Class_CA1_Pyr_standardized import Cell
- import numpy as np
- import pickle
- import pandas as pd
- import os, sys
- import random
- from functools import wraps
- import pathlib
- # Get the path of the current script
- base_path = pathlib.Path().resolve().parent
- h.load_file("stdgui.hoc")
- h.load_file('stdlib.hoc') #mknrndll on anaconda prompt to compile the mod files
- h.load_file("stdrun.hoc")
- h.load_file('import3d.hoc')
- protocols = ['negative_current_soma', 'negative_current_dend',
- 'negative_current_cesium_bath_soma', 'negative_current_cesium_bath_dend',
- 'positive_current_soma', 'positive_current_dend', 'excitatory_synaptic_validation',
- 'NMDA_AMPA_ratio', 'inhibitory_synaptic_validation']
- protocol = protocols[0] #protocols[int(sys.argv[1])] #Use sys.argv to input parameters externally and loop through all protocols
- high_segmentation = True
- path = str(base_path / "Morphologies\\SWCs")+"\\"
- names = ["E_6_15_", "E_6_14_", "E_3_6_", "E_3_7_", "E_9_11_"]
- name = names[0] #names[int(sys.argv[2])] #Use sys.argv to input parameters externally and loop through all cells
- if protocol == 'dendritic_nonlinearity':
- hh_switch = False
- else:
- hh_switch = True
- ###################################################################################################################
- # F U N C T I O N D E F I N I T I O N
- ###################################################################################################################
- def find_closest_values(pd_serie, target_value):
- """
- pd_serie: pd.Series or a column of a dataframe.
- target_value: int or float that you want to find in the pd.Series/column.
- """
- idx = (pd_serie - target_value).abs().idxmin()
- return pd_serie.loc[idx]
- def input_resistance_calculation(voltage, time, stim_onset, stim_duration, inj_current):
- """
- voltage: np.array of the voltage trace
- time: np.array of the simulation time
- stim_onset: int when the stimulation starts
- stim_duration: int the duration of the current injection stim
- inj_current: amplitude of the injected current in nA
- """
- indx_v0 = np.abs(time - (stim_onset)).argmin()
- v0 = voltage[indx_v0]
- indx_v_max = np.abs(time - (stim_onset + stim_duration)).argmin()
- v_max= voltage[indx_v_max]
- R_Input= (np.abs((v_max-v0)))/np.abs(inj_current)
- return R_Input
- def sag_ratio_and_tau_calc(voltage, time, stim_onset, stim_duration, after_stim_duration, inj_current):
- """
- voltage: np.array of the voltage trace
- time: np.array of the simulation time
- stim_onset: int when the stimulation starts
- stim_duration: int the duration of the current injection stim
- after_stim_duration: int the duration of the simulation after the stimulus ends
- inj_current: amplitude of the injected current in nA
- """
- indx_v0 = np.abs(time - (stim_onset)).argmin()
- v0 = voltage[indx_v0]
- indx_v_max = np.abs(time - (stim_onset + stim_duration)).argmin()
- v_max= voltage[indx_v_max]
- v_peak = np.amax(np.abs(voltage))
- sag_ratio = (v_peak-np.abs(v_max))/(v_peak-np.abs(v0))
- v_decrease = abs(voltage[indx_v_max:])
- Diff_v = v_decrease-abs(voltage[np.abs(time - (stim_onset + stim_duration +
- after_stim_duration-1)).argmin()])
- Normalized_v = Diff_v/max(Diff_v)
- Calc_tau= time[indx_v_max + np.argmin(abs(Normalized_v-(1/np.e)))] - time[indx_v_max]
- return sag_ratio, Calc_tau
- def tau_rise_decay_calc(voltage, time, spike_onset, delay):
- """
- voltage: np.array of the voltage trace
- time: np.array of the simulation time
- stim_onset: int when the stimulation starts
- delay: delay of synaptic current from actual spiketime in ms
- """
- indx_v0 = np.abs(time - (spike_onset + delay)).argmin()
- v_psp = np.abs(voltage[indx_v0:] - voltage[indx_v0])
- time_psp = np.abs(time[indx_v0:] - time[indx_v0])
- indx_psp_peak = np.abs(v_psp).argmax()
- v_peak = v_psp[indx_psp_peak]
- v_decrease = v_psp[indx_psp_peak:]
- t_decrease = time_psp[indx_psp_peak:]
- Normalized_v_decrease = v_decrease/v_peak
- tau_decay = t_decrease[np.argmin(abs(Normalized_v_decrease-(1/np.e)))] - t_decrease[0]
- v_increase = v_psp[:indx_psp_peak]
- t_increase = time_psp[:indx_psp_peak]
- Normalized_v_increase = v_increase/v_peak
- tau_rise = t_increase[np.argmin(abs(Normalized_v_increase-0.9))] - t_increase[
- np.argmin(abs(Normalized_v_increase-0.1))]
- return tau_rise, tau_decay
- def timeit(func):
- @wraps(func)
- def wrapper(*args, **kwargs):
- start = time.perf_counter()
- func(*args, **kwargs)
- end = time.perf_counter()
- print(f"Time {start - end} sec")
- return wrapper
- # @timeit
- # def func1():
- # time.sleep(1)
- def calculate_segment_indexes(num_segments):
- if num_segments == 1:
- return [0.5]
- initial_segs = []
- final_segs = []
- segment_length = 1 / (num_segments)
- for i in range(int((num_segments-1)/2)):
- ind = i+1
- initial_segs.append(0.5-(segment_length*ind))
- final_segs.append(0.5+(segment_length*ind))
- inverted_initial_segs = initial_segs[::-1]
- indexes = inverted_initial_segs + [0.5] + final_segs
- return indexes
- ###################################################################################################################
- # C E L L S E T U P
- ###################################################################################################################
- if high_segmentation:
- segmentation = 0.001
- else:
- segmentation = 0.1
- c = Cell(path, name + "smooth_smaller_diam",'swc', 0,
- d_lambda = segmentation)
- if 'cesium_bath' in protocol:
- c.cesium_bath_present = 0.2
- cesium_protocol = 'cesium'
- else:
- c.cesium_bath_present = 1
- cesium_protocol = 'control'
- axon_group = c.axon
- trunk_group = c.apic
- oblique_group = c.dend
- tuft_group = c.dend_5
- basal_group = c.dend_7
- if protocol == 'NMDA_AMPA_ratio':
- # Channels inhibition (switch to false relevant channels) #################################
- for segment in c.soma:
- c.channel_setup('soma', segment, c.soma[0](1), hha2=False, pas=True, h=False,
- kap=False, km=False, cal=False, kca=False, mykca=False, cat=False,
- somacar=False)
- for segment in axon_group:
- c.channel_setup('axon', segment, c.soma[0](0), hha2=False, pas=True,
- km=False)
- for segment in trunk_group:
- c.channel_setup('trunk', segment, c.soma[0](1), hha_old=False, pas=True,
- h=False, kap=False, kad=False, km=False, cal=False, calH=False,
- car=False, kca=False, mykca=False, cat=False)
- for segment in oblique_group:
- c.channel_setup('oblique', segment, c.soma[0](1), hha_old=False, pas=True,
- h=False, kap=False, kad=False, km=False, calH=False, car=False, kca=False,
- mykca=False, cat=False, nap=False)
- for segment in tuft_group:
- c.channel_setup('tuft', segment, c.soma[0](1), hha_old=False, pas=True,
- h=False, kap=False, kad=False, km=False, calH=False, car=False, kca=False,
- mykca=False, cat=False, nap=False)
- for segment in basal_group:
- c.channel_setup('basal', segment, c.soma[0](1), hha2=False, pas=True,
- h=False, kap=False, kad=False)
- cyt, ca, cad = c.setup_molecules(c.all, cainf=5e-5, tau_ca=200, dCa=0.6)
- else:
- for segment in c.soma:
- c.channel_setup('soma', segment, c.soma[0](1), hha2=hh_switch, pas=True, h=True,
- kap=True, km=True, cal=True, kca=True, mykca=True, cat=True,
- somacar=True)
- for segment in axon_group:
- c.channel_setup('axon', segment, c.soma[0](0), hha2=hh_switch, pas=True,
- km=True)
- for segment in trunk_group:
- c.channel_setup('trunk', segment, c.soma[0](1), hha_old=True, pas=True,
- h=True, kap=True, kad=True, km=True, cal=True, calH=True,
- car=True, kca=True, mykca=True, cat=True)
- for segment in oblique_group:
- c.channel_setup('oblique', segment, c.soma[0](1), hha_old=True, pas=True,
- h=True, kap=True, kad=True, km=True, calH=True, car=True, kca=True,
- mykca=True, cat=True, nap=True)
- for segment in tuft_group:
- c.channel_setup('tuft', segment, c.soma[0](1), hha_old=True, pas=True,
- h=True, kap=True, kad=True, km=True, calH=True, car=True, kca=True,
- mykca=True, cat=True, nap=True)
- for segment in basal_group:
- c.channel_setup('basal', segment, c.soma[0](1), hha2=True, pas=True,
- h=True, kap=True, kad=True)
- cyt, ca, cad = c.setup_molecules(c.all, cainf=5e-5, tau_ca=200, dCa=0.6)
- ###################################################################################################################
- # M O N I T O R S
- ###################################################################################################################
- number_of_segments = 0
- cell_segment_names = {}
- for pp in c.all:
- cell_segment_names[f"{pp}"] = pp
- for segment_b in pp:
- number_of_segments += 1
- compartments = {}
- compartments_list = []
- comp_distances = np.zeros(len(c.all))
- for i, sec in enumerate(c.all):
- compartments[f"volt_{i}"] = h.Vector().record(sec(0.5)._ref_v)
- compartments[f"compartment_{i}"] = str(sec)
- compartments_list.append(sec)
- comp_distances[i] = c.fromtodistance(c.soma[0](1), sec(0.5))
- domain_list = [
- 'Trunk' if 'apic' in str(sec)
- else 'Basal' if 'dend_7' in str(sec)
- else 'Oblique' if 'dend[' in str(sec)
- else 'Tuft' if 'dend_5' in str(sec)
- else 'Soma' if 'soma' in str(sec)
- else 'Axon'
- for sec in c.all
- ]
- comp_df = pd.DataFrame(comp_distances, columns=['comp_distances'])
- comp_df['domain_list'] = domain_list
- apic_distances = np.zeros(len(c.apic))
- for i, el in enumerate(c.apic):
- distance = c.fromtodistance(c.soma[0](1), el(0.5))
- apic_distances[i] = distance
- index_238_apic = np.argmin(np.abs(apic_distances-238))
- voltage_238_apic = h.Vector().record(c.apic[index_238_apic](0.5)._ref_v)
- index_169_apic = np.argmin(np.abs(apic_distances-169))
- voltage_169_apic = h.Vector().record(c.apic[index_169_apic](0.5)._ref_v)
- index_30_apic = np.argmin(np.abs(apic_distances-30))
- voltage_soma = h.Vector().record(c.soma[0](0.5)._ref_v)
- time_ = h.Vector().record(h._ref_t)
- ###################################################################################################################
- # P R O T O C O L S
- ###################################################################################################################
- stim_onset = 300*ms
- stim_duration = 1000*ms
- after_stim_duration = 300*ms
- exp_R_input = 60 #Mohm From Magee (1998)
- ########################### NEGATIVE CURRENT ####################################################################
- if 'negative_current' in protocol:
- '''
- Postsynaptic integrative properties of dorsal CA1 pyramidal neuron subpopulations. Masurkar JNphys 2020.
- - Resting membrane potential was measured on break-in. The remaining measurements
- - were made after 2–5 min following break-in while the cell was maintained at −70 mV.
- - Input resistance Rin was measured by [...] −10-pA current injection.
- Arithmetic of Subthreshold Synaptic Summation in a Model CA1 Pyramidal Cell. Poirazi Neuron 2003
- - somatic and dendritic current injections, under control conditions (−200 pA,
- - solid curves) and with bath application of 3 mM Cs+ (−100 pA, dashed curves),
- - which we assumed blocked 80% of Ih. [...] current injections either at the
- - soma or 325 μm away in the main apical trunk.
- Factors mediating powerful voltage attenuation along CA1 pyramidal neuron dendrites. Golding J Physiol 2005
- -Figure 2, around 50% of attenuation at 238um distance from the soma.
- -The parameters that contribute to the high attenuation are: internal resistivity (high); non-uniform
- membrane resistivity (high in the soma, low in distal dendrites); non-uniform h conductance
- (low in the soma, high in distal dendrites).
- To verify the passive properties, run the simulations with the four combinations of
- stimulus location (comment/uncomment below) and cesium_bath presence (Ture/False above).
- After producing the four files, run the visualization code.
- '''
- if '_soma' in protocol:
- stim_location = 'Somatic_injection'
- I_negative_range = [-0.01, -0.2]
- elif '_dend' in protocol:
- stim_location = 'Dendritic_injection'
- I_negative_range = [-0.2]
- DATA = {}
- iclamps = []
- for i, I_negative in enumerate (I_negative_range):
- #Current injection
- if stim_location == 'Dendritic_injection':
- iclamps.append(h.IClamp(c.apic[index_238_apic](0.5)))
- else:
- iclamps.append(h.IClamp(c.soma[0](0.5)))
- iclamps[-1].delay = stim_onset
- iclamps[-1].dur = stim_duration
- iclamps[-1].amp = I_negative
- h.finitialize(c.v_init)
- h.fcurrent()
- h.continuerun(stim_onset + stim_duration + after_stim_duration)
- v_soma = np.array(voltage_soma)
- v_apic_238 = np.array(voltage_238_apic)
- time = np.array(time_)
- DATA[f'Voltage_soma_{I_negative}_{stim_location}'] = v_soma
- DATA[f'Voltage_apical_{I_negative}_{stim_location}'] = v_apic_238
- DATA[f'Time_{I_negative}_{stim_location}'] = time
- DATA[f'Compartments_{I_negative}_{stim_location}'] = compartments
- DATA["Inj_current_range"] = I_negative_range
- DATA["stim_onset"] = stim_onset
- DATA["stim_duration"] = stim_duration
- DATA["after_stim_duration"] = after_stim_duration
- DATA["comp_df"] = comp_df
- saving_path = str(base_path / f"Protocol_results\\Cell_validation\\{name}validation")
- if not os.path.exists(saving_path):
- os.makedirs(saving_path)
- with open(f"{saving_path}/{name}negative_current_{stim_location}_{cesium_protocol}.pkl", "wb") as file:
- pickle.dump(DATA, file, protocol=pickle.HIGHEST_PROTOCOL)
- comp_df.to_csv(r''+saving_path+'/'+name+'comp_df.txt', header=None, index=None, sep=' ', mode='a')
- ########################### POSITIVE CURRENT ####################################################################
- if 'positive_current' in protocol:
- '''
- Postsynaptic integrative properties of dorsal CA1 pyramidal neuron subpopulations. Masurkar JNphys 2020.
- - Firing frequency-input current (F-I) curves for each of these neurons [...] were produced
- by giving a range of current injections from 100 to 350 pA.
- '''
- DATA = {}
- if '_soma' in protocol:
- stim_location = 'Somatic_injection'
- I_positive_range = [0.02, 0.04, 0.06, 0.08, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.5]
- elif '_dend' in protocol:
- stim_location = 'Dendritic_injection'
- I_positive_range = [-0.2, 0.2, 0.3, 0.4, 0.5, 0.8]
- for I_positive in I_positive_range:
- if stim_location == 'Somatic_injection':
- iclamps = h.IClamp(c.soma[0](0.5))
- else:
- iclamps = h.IClamp(c.apic[index_169_apic](0.5))
- iclamps.delay = stim_onset
- iclamps.dur = stim_duration
- iclamps.amp = I_positive
- h.finitialize(c.v_init)
- h.fcurrent()
- h.continuerun(stim_onset + stim_duration + after_stim_duration)
- v_soma = np.array(voltage_soma)
- v_apic_169 = np.array(voltage_169_apic)
- time = np.array(time_)
- DATA[f'Voltage_soma_{I_positive}'] = v_soma
- DATA[f'Voltage_apical_{I_positive}'] = v_apic_169
- DATA[f'Time_{I_positive}'] = time
- DATA[f'Compartments_{I_positive}'] = compartments
- DATA["Inj_current_range"] = I_positive_range
- DATA["stim_onset"] = stim_onset
- DATA["stim_duration"] = stim_duration
- DATA["after_stim_duration"] = after_stim_duration
- saving_path = str(base_path / f"Protocol_results/Cell_validation/{name}validation")
- if not os.path.exists(saving_path):
- os.makedirs(saving_path)
- with open(f"{saving_path}/{name}positive_current_{stim_location}.pkl", "wb") as file:
- pickle.dump(DATA, file, protocol=pickle.HIGHEST_PROTOCOL)
- ########################### EXCITATORY SYNAPSES VALIDATION ####################################################################
- if 'excitatory_synaptic_validation' in protocol:
- '''
- For apical inputs (Trunk, Schaffer collaterals), from "Somatic EPSP amplitude is independent of synapse
- location in hippocampal pyramidal neurons", Magee Narure Neuro 2000.
- - "EPSPs recorded simultaneously at the soma exhibited an average amplitude that was virtually independent of
- synapse location (Fig. 1e; ∼0.2 mV from 50 to 325 μm [...])"
- - "Somatic EPSP rise times show a more pronounced location dependence than do somatic EPSP decay times".
- Rise time goes from around 1ms from 100um syn activation to 2.5ms from 300um.
- Decay time goes from 20ms to 25ms in the same distance range.
- Basal inputs are inferred to have similar properties.
- '''
- compartments = {} #to remove not needed recordings for this validation protocol
- stim_duration = 0
- DATA = {}
- domains = ["Trunk_stimulation", "Basal_stimulation"] #
- input_distances = np.arange(50, 301, 25)
- # Synapse details
- volume_scaling = 1 #(synapse_list['Spine_Volume'][i]/e_syn_volume_average) * 0.6 + 0.4
- for stim_domain in domains:
- for distance in input_distances:
- # Create empty list for preallocation.
- syns, netcons = [], []
- inputs, vecstims = [], []
- if stim_domain == 'Trunk_stimulation':
- domain = c.apic
- elif stim_domain == 'Basal_stimulation':
- domain = c.dend_7
- if distance >= 200:
- # print('Skip distance for basal')
- continue
- sec_distances = []
- sections = []
- for i, el in enumerate(domain):
- for selected_section in el:
- distance_section = c.fromtodistance(c.soma[0](1), selected_section)
- sec_distances.append(distance_section)
- sections.append(selected_section)
- index_section = np.argmin(np.abs(np.array(sec_distances)-int(np.random.choice(
- np.arange(distance-5,distance+5),1))))
- # print('Synapse section', sections[index_section], 'distant', c.fromtodistance(
- # c.soma[0](1), sections[index_section]),'um from the soma')
- voltage_section = h.Vector().record(sections[index_section]._ref_v)
- syns.append(h.AmpaNmda(sections[index_section])) # add a synapse to the closest segment to the node that holds the synapse
- syns[-1].gamma_mg = 0.12
- syns[-1].eta_mg = 0.28011
- syns[-1].mg2o = 1.2
- syns[-1].half_mg =2.5 #4
- if stim_domain == 'Trunk_stimulation':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time #??? Increasing AMPA with the distance causes a shortening of the decay time with the distance. Not biologically relevant!
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = (0.17e-3 * volume_scaling) + (distance * 3e-7)
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 0.4 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = (0.50e-3 + (distance * 1.0e-6))
- elif stim_domain == 'Basal_stimulation':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = (0.14e-3 * volume_scaling) + (distance * 1.2e-7)
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 14 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = (0.36e-3 + (distance * 1.0e-6))
- spiketimes = [stim_onset]
- inputs.append(h.Vector(spiketimes))
- vecstims.append(h.VecStim())
- vecstims[-1].play(inputs[-1]) # add the last created inputs to the last created VecStim
- pre_synaptic_input = vecstims[-1]
- netcons.append(h.NetCon(pre_synaptic_input, syns[-1]))
- netcons[-1].delay = 2.0 # delay in ms
- ampa_current = h.Vector().record(syns[-1]._ref_iampa)
- nmda_current = h.Vector().record(syns[-1]._ref_inmda)
- h.finitialize(c.v_init)
- h.fcurrent()
- h.continuerun(stim_onset + stim_duration + after_stim_duration)
- time = np.array(time_)
- v_soma = np.array(voltage_soma)
- v_section = np.array(voltage_section)
- DATA[f'Voltage_soma_{stim_domain}_{distance}um'] = v_soma
- DATA[f'Voltage_section_{stim_domain}_{distance}um'] = v_section
- DATA[f'Time_{stim_domain}_{distance}um'] = time
- DATA[f'Real_distance_{stim_domain}_{distance}um'] = c.fromtodistance(c.soma[0](1), sections[index_section])
- DATA["input_distances"] = input_distances
- DATA["domains"] = domains
- DATA["stim_onset"] = stim_onset
- DATA["stim_duration"] = stim_duration
- DATA["after_stim_duration"] = after_stim_duration
- saving_path = str(base_path / f"Protocol_results/Cell_validation/{name}validation")
- if not os.path.exists(saving_path):
- os.makedirs(saving_path)
- with open(f"{saving_path}/{name}syn_validation_amplitude_kinetic.pkl", "wb") as file:
- pickle.dump(DATA, file, protocol=pickle.HIGHEST_PROTOCOL)
- ########################### NMDA/AMPA RATIO ####################################################################
- if 'NMDA_AMPA_ratio' in protocol:
- '''
- NMDA/AMPA for Perforant Pathway synapses (on tuft) and Shaffer collaterals (on trunk)
- from "Pathway-Specific Properties of AMPA and NMDA-Mediated Transmission in CA1
- Hippocampal Pyramidal Cells", Otmakhova et al., 2002 J Neurosci.
- - The intracellular solution contained Cs+ to block most K+ channels and QX-314 to
- block Na+ channels, Ih channels, G-protein-coupled K+ (GABAB) channels and Ca2+
- currents (partially). Voltage clamp at -20 mV.
- - The NMDA/AMPA ratio was determined as the control area minus APV (NMDA antagonist)
- area, all divided by APV area (Fig. 4C, PP (8.6 +/- 0.8), SC input (5.3 +/- 0.9;)).
- - Basals inferred to be the same as the trunk.
- '''
- compartments = {} #to remove not needed recordings for this validation protocol
- stim_duration = 0
- DATA = {}
- domains = ["Trunk_stimulation", "Tuft_stimulation", "Basal_stimulation"]
- samples_n = 5
- nmda_inhibition = [True, False]
- # Synapse details
- volume_scaling = 1 #(synapse_list['Spine_Volume'][i]/e_syn_volume_average) * 0.6 + 0.4
- for stim_domain in domains:
- for samples in range(samples_n):
- if stim_domain == 'Trunk_stimulation':
- domain = c.apic
- elif stim_domain == 'Tuft_stimulation':
- domain = c.dend_5
- elif stim_domain == 'Basal_stimulation':
- domain = c.dend_7
- stimulated_branch = random.choice([branch for branch in domain])
- voltage_section = h.Vector().record(stimulated_branch(0.5)._ref_v)
- for nmda_inh in nmda_inhibition:
- if nmda_inh:
- APV = 0
- else:
- APV = 1
- # Create empty list for preallocation.
- syns, netcons = [], []
- inputs, vecstims = [], []
- syns.append(h.AmpaNmda(stimulated_branch(0.5)))
- syn_distance = c.fromtodistance(c.soma[0](1), stimulated_branch(0.5))
- if stim_domain == 'Trunk_stimulation':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = (0.17e-3 * volume_scaling) + (distance * 3e-7)
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 14 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = APV * (0.50e-3 + (distance * 1.0e-6))
- elif stim_domain == 'Tuft_stimulation':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = 0.17e-3 * volume_scaling
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 14 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = APV * 0.75e-3
- elif stim_domain == 'Basal_stimulation':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = (0.18e-3 * volume_scaling) + (distance * 1.2e-7)
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 14 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = APV * (0.44e-3 + (distance * 1.0e-6))
- # Voltage clamp at -20 to reproduce experimental condition
- clampobj = h.SEClamp(c.soma[0](0.5))
- clampobj.dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj.amp1 = -20
- clampobj.rs = 5
- clamp_current = h.Vector().record(clampobj._ref_i)
- spiketimes = [stim_onset]
- inputs.append(h.Vector(spiketimes))
- vecstims.append(h.VecStim())
- vecstims[-1].play(inputs[-1]) # add the last created inputs to the last created VecStim
- pre_synaptic_input = vecstims[-1]
- netcons.append(h.NetCon(pre_synaptic_input, syns[-1]))
- netcons[-1].delay = 2.0 # delay in ms
- ampa_current = h.Vector().record(syns[-1]._ref_iampa)
- nmda_current = h.Vector().record(syns[-1]._ref_inmda)
- h.finitialize(c.v_init)
- h.fcurrent()
- h.continuerun(stim_onset + stim_duration + after_stim_duration)
- time = np.array(time_)
- v_soma = np.array(voltage_soma)
- v_section = np.array(voltage_section)
- DATA[f'Voltage_soma_{stim_domain}_sample{samples}_{APV}'] = v_soma
- DATA[f'Voltage_section_{stim_domain}_sample{samples}_{APV}'] = v_section
- DATA[f'Time_{stim_domain}_sample{samples}_{APV}'] = time
- DATA["nmda_inhibition"] = nmda_inhibition
- DATA["domains"] = domains
- DATA["samples_n"] = samples_n
- DATA["stim_onset"] = stim_onset
- DATA["stim_duration"] = stim_duration
- DATA["after_stim_duration"] = after_stim_duration
- saving_path = str(base_path / f"Protocol_results/Cell_validation/{name}validation")
- if not os.path.exists(saving_path):
- os.makedirs(saving_path)
- with open(f"{saving_path}/{name}syn_validation_NMDA_AMPA_ratio.pkl", "wb") as file:
- pickle.dump(DATA, file, protocol=pickle.HIGHEST_PROTOCOL)
- ########################### INHIBITORY SYNAPSES VALIDATION ####################################################################
- if 'inhibitory_synaptic_validation' in protocol:
- '''
- - NGF: uIPSC average 4.9 pA current recorded in the soma after clamping at -50mV from
- "GABAB Receptor Modulation of Feedforward Inhibition through Hippocampal Neurogliaform
- Cells" T. Price 2008 JoN. (Voltage clamped at -62mV in model to stay below threshold,
- validated to ≈ half amplitude) Decay includes the GABAb component. Kinetics (rise time:
- 4.17 ± 0.24 ms; decay time: 36.5 ± 1.3 ms) from "Different transmitter transients
- underlie presynaptic cell type specificity of GABAA,slow and GABAA,fast" Szabadics
- et al 2007 PNAS
- - OLM: uIPSC average 2.6 pA current recorded in the soma after clamping at -70mV and
- kinetics (rise time: 6.2 ± 0.6 ms; decay time: 20.8 ± 1.7 ms) from "Cell surface
- domain specific postsynaptic currents evoked by identified GABAergic neurones in
- rat hippocampus in vitro" Maccaferri et al 2000 J. Physiol
- The actual amplitude in the paper is 26 pA but it would not make sense. The paper
- has been corrected but such correction is not available. Moreover, in "Dendritic
- inhibition mediated by O-LM and bistratified interneurons in the hippocampus"
- Müller et al Frontiers 2014 they cite Maccaferri claiming IPSC = 2.6 pA.
- - PVbasket: average 32.4 pA current (for superficialPC) recorded in the soma after
- clamping at -70mV with reversal at -26.3 from "Parvalbumin-Positive Basket
- Cells Differentiate Among Hippocampal Pyramidal Cells" Lee 2014 Neuron
- Kinetics (rise times: 0.53 ± 0.02 ms; decay time: 6.4 ± 0.33 ms, for fast
- spiking BC) from "Different transmitter transients underlie presynaptic cell
- type specificity of GABAA,slow and GABAA,fast" Szabadics et al 2007 PNAS
- - CCKbasket: average 42.9 pA current recorded in the soma after clamping at -70mV with
- reversal at -26.3 from "Parvalbumin-Positive Basket Cells Differentiate Among
- Hippocampal Pyramidal Cells" Lee 2014 Neuron
- Kinetics (rise times: 2.0 ± 0.8 ms; decay time: 8.15 ± 0.75 ms, average from
- two cases in TableS5) from "Ivy Cells: A Population of Nitric-Oxide-Producing,
- Slow-Spiking GABAergic Neurons and Their Involvement in Hippocampal Network
- Activity" P. Fuentealba 2008 Neuron
- - bistratified: average 0.8 mV current recorded in the soma after clamping at -50mV. Kinetics
- (rise times: 8.4 ± 3.2 ms; decay time: 42.1 ± 17.0 ms, average from two cases in
- Table2) from "Ivy Cells: A Population of Nitric-Oxide-Producing, Slow-Spiking
- GABAergic Neurons and Their Involvement in Hippocampal Network Activity" P. Fuentealba
- 2008 Neuron (Voltage clamped at -62mV in model to stay below threshold, validated to ≈
- half amplitude).
- - Ivy: average 8.0 pA current recorded in the soma after clamping at -50mV. Kinetics
- (rise times: 2.8 ± 0.2 ms; decay time: 16.05 ± 2.45 ms, average from two cases in
- TableS5) from "Ivy Cells: A Population of Nitric-Oxide-Producing, Slow-Spiking
- GABAergic Neurons and Their Involvement in Hippocampal Network Activity" P. Fuentealba
- 2008 Neuron (Voltage clamped at -62mV in model to stay below threshold, validated to
- ≈ half amplitude).
- '''
- stim_duration = 0
- DATA = {}
- presynaptic_interneurons = ["NGF", "OLM", "PVbasket", "CCKbasket", "bistratified", "Bistratified", "Ivy"]
- n_repetitions = 5
- for intern in presynaptic_interneurons:
- for n in range(n_repetitions):
- # Create empty list for preallocation.
- syns, netcons = [], []
- inputs, vecstims = [], []
- clampobj = []
- if intern == 'NGF':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Tuft')
- ].index)
- elif intern == 'OLM':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Tuft')
- ].index)
- elif intern == 'PVbasket':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Trunk') & (
- comp_df['comp_distances'] >= 80) & (comp_df['comp_distances'] <= 90)
- ].index)
- elif intern == 'CCKbasket':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Trunk') & (
- comp_df['comp_distances'] >= 150) & (comp_df['comp_distances'] <= 160)
- ].index)
- elif intern == 'bistratified':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Trunk') & (
- comp_df['comp_distances'] >= 95) & (comp_df['comp_distances'] <= 105)
- ].index)
- elif intern == 'Bistratified':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Trunk') & (
- comp_df['comp_distances'] >= 95) & (comp_df['comp_distances'] <= 105)
- ].index)
- elif intern == 'Ivy':
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Basal') & (
- comp_df['comp_distances'] >= 85) & (comp_df['comp_distances'] <= 110)
- ].index)
- else:
- compartment_idx = random.choice(comp_df.loc[(comp_df['domain_list'] == 'Trunk') & (
- comp_df['comp_distances'] >= 95) & (comp_df['comp_distances'] <= 105)
- ].index)
- # print("Not a valid interneuron, using bistratified cells")
- stimulated_branch = compartments_list[compartment_idx]
- voltage_section = h.Vector().record(stimulated_branch(0.5)._ref_v)
- syn_distance = c.fromtodistance(c.soma[0](1), stimulated_branch(0.5))
- # print('Synapse section', stimulated_branch, 'distant', syn_distance,
- # 'um from the soma')
- syns.append(h.Exp2Syn(stimulated_branch(0.5)))
- if intern == 'NGF':
- syns[-1].tau1 = 1.17 # rise time
- syns[-1].tau2 = 36.5 # decay time #decay includes the GABAb component.
- syns[-1].e = -80 # reversal potential GABA #??? reverse potential should be -72mV for GABAa and -87mV for GABAb component. Since I cannot reproduce both components, I will set it in between the two.
- syn_weight = 0.6e-3
- clampobj.append(h.SEClamp(c.soma[0](0.5)))
- clampobj[-1].dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj[-1].amp1 = -62
- clampobj[-1].rs = 5
- clamp_current = h.Vector().record(clampobj[-1]._ref_i)
- clamp_on = True
- elif intern == 'OLM':
- syns[-1].tau1 = 1. # rise time
- syns[-1].tau2 = 16. # decay time
- syns[-1].e = -80 # reversal potential GABA
- syn_weight = 0.62e-3
- clampobj.append(h.SEClamp(c.soma[0](0.5)))
- clampobj[-1].dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj[-1].amp1 = -70
- clampobj[-1].rs = 5
- clamp_current = h.Vector().record(clampobj[-1]._ref_i)
- clamp_on = True
- elif intern == 'PVbasket':
- syns[-1].tau1 = 0.1 # rise time
- syns[-1].tau2 = 3.1 # decay time
- syns[-1].e = -26.3 # reversal potential GABA #??? high cloride in the pipet, they calculate this reversal
- syn_weight = 2.1e-3
- clampobj.append(h.SEClamp(c.soma[0](0.5)))
- clampobj[-1].dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj[-1].amp1 = -70
- clampobj[-1].rs = 5
- clamp_current = h.Vector().record(clampobj[-1]._ref_i)
- clamp_on = True
- elif intern == 'CCKbasket':
- syns[-1].tau1 = 0.5 # rise time
- syns[-1].tau2 = 3. # decay time
- syns[-1].e = -26.3 # reversal potential GABA #??? high cloride in the pipet, they calculate this reversal
- syn_weight = 3.3e-3
- clampobj.append(h.SEClamp(c.soma[0](0.5)))
- clampobj[-1].dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj[-1].amp1 = -70
- clampobj[-1].rs = 5
- clamp_current = h.Vector().record(clampobj[-1]._ref_i)
- clamp_on = True
- elif intern == 'bistratified':
- syns[-1].tau1 = 0.5 # rise time
- syns[-1].tau2 = 23.4 # decay time
- syns[-1].e = -80 # reversal potential GABA
- syn_weight = 3.5e-3 # Tuned in order to produce average 0.86 mV depolarization in the soma from "Dendritic inhibition mediated by O-LM and bistratified interneurons in the hippocampus" Muller 2014 FSN
- clamp_on = False
- elif intern == 'Bistratified':
- syns[-1].tau1 = 0.5 # rise time
- syns[-1].tau2 = 23.4 # decay time
- syns[-1].e = -80 # reversal potential GABA
- syn_weight = 3.5e-3 # Tuned in order to produce average 0.86 mV depolarization in the soma from "Dendritic inhibition mediated by O-LM and bistratified interneurons in the hippocampus" Muller 2014 FSN
- clampobj.append(h.SEClamp(c.soma[0](0.5)))
- clampobj[-1].dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj[-1].amp1 = -70
- clampobj[-1].rs = 5
- clamp_current = h.Vector().record(clampobj[-1]._ref_i)
- clamp_on = True
- elif intern == 'Ivy':
- syns[-1].tau1 = 0.4 # rise time
- syns[-1].tau2 = 10.8 # decay time
- syns[-1].e = -80 # reversal potential GABA
- syn_weight = 0.8e-3
- clampobj.append(h.SEClamp(c.soma[0](0.5)))
- clampobj[-1].dur1 = stim_onset + stim_duration + after_stim_duration
- clampobj[-1].amp1 = -62
- clampobj[-1].rs = 5
- clamp_current = h.Vector().record(clampobj[-1]._ref_i)
- clamp_on = True
- else:
- syns[-1].tau1 = 0.5 # rise time
- syns[-1].tau2 = 23.4 # decay time
- syns[-1].e = -80 # reversal potential GABA
- syn_weight = 3.5e-3 # Tuned in order to produce average 0.86 mV depolarization in the soma from "Dendritic inhibition mediated by O-LM and bistratified interneurons in the hippocampus" Muller 2014 FSN
- clamp_on = False
- # print("Not a valid interneuron, using bistratified cells")
- spiketimes = [stim_onset]
- inputs.append(h.Vector(spiketimes))
- vecstims.append(h.VecStim())
- vecstims[-1].play(inputs[-1]) # add the last created inputs to the last created VecStim
- pre_synaptic_input = vecstims[-1]
- netcons.append(h.NetCon(pre_synaptic_input, syns[-1]))
- netcons[-1].delay = 2.0 # delay in ms
- netcons[-1].weight[0] = syn_weight
- current = h.Vector().record(syns[-1]._ref_i)
- h.finitialize(c.v_init)
- h.fcurrent()
- h.continuerun(stim_onset + stim_duration + after_stim_duration)
- time = np.array(time_)
- v_soma = np.array(voltage_soma)
- v_section = np.array(voltage_section)
- I_syn = np.array(current)
- if clamp_on == True:
- DATA[f'Clamp_current_{intern}_syn_{n}'] = np.array(clamp_current)
- DATA[f'Clamp_on_{intern}_{n}'] = clamp_on
- DATA[f'Voltage_soma_{intern}_syn_{n}'] = v_soma
- DATA[f'Voltage_section_{intern}_syn_{n}'] = v_section
- DATA[f'Time_{intern}_syn_{n}'] = time
- DATA[f'Synaptic_current_{intern}_syn_{n}'] = I_syn
- DATA["interneurons"] = presynaptic_interneurons
- DATA["n_repetitions"] = n_repetitions
- DATA["stim_onset"] = stim_onset
- DATA["stim_duration"] = stim_duration
- DATA["after_stim_duration"] = after_stim_duration
- saving_path = str(base_path / f"Protocol_results/Cell_validation/{name}validation")
- if not os.path.exists(saving_path):
- os.makedirs(saving_path)
- with open(f"{saving_path}/{name}interneurons_validation_amplitude.pkl", "wb") as file:
- pickle.dump(DATA, file, protocol=pickle.HIGHEST_PROTOCOL)
- ########################### DENDRITIC NONLINEARITY PROTOCOL ####################################################################
- if 'dendritic_nonlinearity' in protocol:
- '''
- Tuning the NMDA and the dendritic sodium to validate dendritic non-linearity from
- "Integrative Properties of Radial Oblique Dendrites in Hippocampal CA1 Pyramidal Neurons",
- Attila Losonczy, Jeffrey C. Magee, 2006 Neuron.
- E_6_14:
- Oblique 51, measured EPSP supralinear with 25 synapses to about 8 mV, dV/dt up to 3.5 mV/ms.
- '''
- stimulated_domain = 'Oblique'
- ind_section = 6
- synapse_number = [1, 4, 8, 12, 15, 18, 22, 25, 28, 30, 32, 35]
- NMDA_switch = 1
- if stimulated_domain == 'Tuft':
- selected_branch = tuft_group[ind_section]
- elif stimulated_domain == 'Trunk':
- selected_branch = trunk_group[ind_section]
- elif stimulated_domain == 'Oblique':
- selected_branch = oblique_group[ind_section]
- elif stimulated_domain == 'Basal':
- selected_branch = basal_group[ind_section]
- selected_branch_apic = c.apic[np.argmax(apic_distances)] #index_169_apic] # selected_branch #
- ICa_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ica)
- ICa_apic_car = h.Vector().record(selected_branch_apic(0.5)._ref_ica_car)
- ICa_apic_calh = h.Vector().record(selected_branch_apic(0.5)._ref_ica_calH)
- Ikad_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ik_kad) #c.apic[index_238_apic]
- Ikap_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ik_kap)
- Ikm_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ik_km)
- Ikca_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ik_kca)
- Imykca_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ik_mykca)
- IK_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ik_kvs)
- INa_apic = h.Vector().record(selected_branch_apic(0.5)._ref_ina_nas)
- act_Na_par = h.Vector().record(selected_branch_apic(0.5)._ref_m_nas)
- inact_Na_par = h.Vector().record(selected_branch_apic(0.5)._ref_h_nas)
- act_K_par = h.Vector().record(selected_branch_apic(0.5)._ref_n_kvs)
- DATA = {}
- distances = []
- DATA['time'] = []
- DATA['v_soma'] = []
- DATA['v_section'] = []
- DATA['derivative_soma'] = []
- DATA['depol_soma'] = []
- stim_onset = 150*ms
- stim_duration = 10*ms
- after_stim_duration = 100*ms
- for n_syns in synapse_number:
- selected_branch.nseg = 201
- seg_id = calculate_segment_indexes(201)[101:]
- segs_with_syns = seg_id[:n_syns]
- # Create empty list for preallocation.
- syns, netcons = [], []
- inputs, vecstims = [], []
- diameter = selected_branch.diam
- length = selected_branch.L
- voltage_section = h.Vector().record(selected_branch(0.5)._ref_v)
- for i_s, segs in enumerate(segs_with_syns):
- stim_dend = selected_branch(segs)
- distances.append(c.fromtodistance(c.soma[0](1), stim_dend))
- distance = distances[-1]
- syns.append(h.AmpaNmda(stim_dend))
- syns[-1].gamma_mg = 0.12
- syns[-1].eta_mg = 0.28011
- syns[-1].mg2o = 1.2
- syns[-1].half_mg =2.5 #4
- if stimulated_domain == 'Trunk' or stimulated_domain == 'Oblique':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time #??? Increasing AMPA with the distance causes a shortening of the decay time with the distance. Not biologically relevant!
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = 0.17e-3 + (distance * 3e-7)
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 2.4 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = (0.50e-3 + (distance * 1e-6)) * NMDA_switch
- elif stimulated_domain == 'Tuft':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time
- syns[-1].eampa = 0.0 # reversal potential AMPA/NMDA
- syns[-1].gbar_ampa = 0.06e-3
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 2.4 # rise time
- syns[-1].tau2_nmda = 43. # decay time
- syns[-1].enmda = 0.0 # reversal potential AMPA/NMDA
- syns[-1].gbar_nmda = (0.6e-3) * NMDA_switch
- elif stimulated_domain == 'Basal':
- #Setting AMPA conductance
- syns[-1].tau1_ampa = 0.61 # rise time
- syns[-1].tau2_ampa = 4.5 # decay time
- syns[-1].eampa = 0.0 # reversal potential NMDA
- syns[-1].gbar_ampa = (0.14e-3 + (distance * 1.2e-7))
- #Setting NMDA conductance
- syns[-1].tau1_nmda = 2.4 # rise time
- syns[-1].tau2_nmda = 43.0 # decay time
- syns[-1].enmda = 0.0 # reversal potential NMDA
- syns[-1].gbar_nmda = (0.36e-3 + (distance * 1e-6)) * NMDA_switch
- spiketimes = [stim_onset + 0.1*i_s]
- inputs.append(h.Vector(spiketimes))
- vecstims.append(h.VecStim())
- vecstims[-1].play(inputs[-1]) # add the last created inputs to the last created VecStim
- pre_synaptic_input = vecstims[-1]
- netcons.append(h.NetCon(pre_synaptic_input, syns[-1]))
- netcons[-1].delay = 2.0 # delay in ms
- ampa_current = h.Vector().record(syns[-1]._ref_iampa)
- nmda_current = h.Vector().record(syns[-1]._ref_inmda)
- h.finitialize(c.v_init)
- h.fcurrent()
- h.continuerun(stim_onset + stim_duration + after_stim_duration)
- time = np.array(time_)
- v_soma = np.array(voltage_soma)
- v_section = np.array(voltage_section)
- dist = distances[0]
- DATA['time'].append(time)
- DATA['v_soma'].append(v_soma)
- DATA['v_section'].append(v_section)
- DATA['derivative_soma'].append(max(np.gradient(v_soma, time)))
- indx_v0 = np.abs(time - (stim_onset)).argmin()
- DATA['depol_soma'].append(max(np.abs(v_soma[indx_v0:]-v_soma[indx_v0-1])))
- saving_path = str(base_path / f"Protocol_results/Cell_validation/{name}validation")
- if not os.path.exists(saving_path):
- os.makedirs(saving_path)
- with open(f"{saving_path}/{name}dendritic_nonlinearity.pkl", "wb") as file:
- pickle.dump(DATA, file, protocol=pickle.HIGHEST_PROTOCOL)
Cluster_cells_validation_protocols.py at commit 77cf670, under GPL-3.0 · at the source
Overview
- Department of Biology, University of Crete, Heraklion, Greece
- Institute of Molecular Biology and Biotechnology, Foundation for Research and Technology-Hellas, Heraklion, Greece
- Mortimer B. Zuckerman Mind Brain Behavior Institute, Columbia University, New York, NY, USA
- Present address: Department of Biological Sciences, Rensselaer Polytechnic Institute, Troy, NY, USA
- Present address: Department of Neurology, The Ohio State University, Wexner Medical School, Columbus, Ohio, USA
- Department of Neuroscience, Columbia University, New York, NY, USA
- Present address: O’Donnell Brain Institute at UT Southwestern Medical Center, Harry Hines Blvd. Dallas, Texas, USA
- Lead contact
Abstract
How the spatial arrangement of synaptic inputs shapes neuronal feature selectivity remains a fundamental question. Here, we map the three-dimensional distribution of excitatory and inhibitory synapses across the dendritic arbor of CA1 pyramidal neurons in vivo and build biophysical models to probe their impact on place-cell emergence. Excitatory synapses are non-uniformly distributed, forming structural clusters preferentially on terminal apical and basal dendrites, whereas inhibitory synapses are uniformly arranged. Relative to dispersed configurations, clustered inputs generate higher-quality, stable place fields while recruiting ~13% fewer active synapses for equivalent somatic output, and cause elevated voltage-gated calcium influx and NMDA-receptor activation. Notably, disrupting clustering permits recovery of somatic excitability but not dendritic calcium dynamics, implicating clustering in calcium-dependent plasticity. Synaptic organization further determines integration strategy: clustered inputs preferentially engage apical dendritic nonlinearities, whereas distributed inputs rely on basal summation. These results establish synaptic clustering as a core mechanism for efficient, compartmentalized spatial computation.
Reproduced under the paper's license (CC BY-NC), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 22 matches between paragraphs and lines of code.
Zenodo 20738191
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
64 files
- Code_data_generation/
Add_neuron_branch_sectio — Python, 212 linesns_to_eswc.py - Code_data_generation/
Class_CA1_Pyr_standardiz — Python, 693 linesed.py - Code_data_generation/
Cluster_cells_validation — Python, 1,224 lines_protocols.py - Code_data_generation/
Cluster_dendritic_non_li — Python, 588 linesnearity_assessment.py - Code_data_generation/
Cluster_make_connectivit — Python, 979 linesy.py - Code_data_generation/
Cluster_make_connectivit — Python, 1,074 linesy_higher_w_infield.py - Code_data_generation/
Cluster_stimulation.py — Python, 634 lines - Code_data_generation/
Code_data_analysis/ — Python, 345 linesAnalysis_noise_stimulati on.py - Code_data_generation/
Code_data_analysis/ — Python, 470 linesAnalysis_place_stimulati on.py - Code_data_generation/
Code_data_analysis/ — Python, 545 linesAnalysis_synapse_distrib ution_ML.py - Code_data_generation/
Code_data_analysis/ — Python, 521 linesCluster_cells_validation _analysis.py - Code_data_generation/
Code_data_analysis/ — Python, 993 linesSynapse_statistical_anal ysis.py - Code_data_generation/
Code_data_analysis/ — Python, 246 linesopt.py - Code_data_generation/
Code_data_analysis/ — Python, 547 linesplace_cell_metrics.py - Code_data_generation/
Fix_eswc_and_make_swc.py — Python, 197 lines - Code_data_generation/
SWCExplorer_class.py — Python, 161 lines - Code_data_generation/
mechanisms/ — NEURON, 89 linesKv_Simone.mod - Code_data_generation/
mechanisms/ — NEURON, 104 linesNa_Simone.mod - Code_data_generation/
mechanisms/ — NEURON, 143 linesampa_nmda.mod - Code_data_generation/
mechanisms/ — NEURON, 164 linesampa_nmda_plastic.mod - Code_data_generation/
mechanisms/ — NEURON, 80 linescad.mod - Code_data_generation/
mechanisms/ — NEURON, 98 linescal.mod - Code_data_generation/
mechanisms/ — NEURON, 68 linescalH.mod - Code_data_generation/
mechanisms/ — NEURON, 62 linescar.mod - Code_data_generation/
mechanisms/ — NEURON, 117 linescat.mod - Code_data_generation/
mechanisms/ — NEURON, 71 linesccanl.mod - Code_data_generation/
mechanisms/ — NEURON, 27 linesconstant.mod - Code_data_generation/
mechanisms/ — NEURON, 61 linesh.mod - Code_data_generation/
mechanisms/ — NEURON, 142 lineshha2.mod - Code_data_generation/
mechanisms/ — NEURON, 162 lineshha_old.mod - Code_data_generation/
mechanisms/ — NEURON, 163 lineshha_old_Yiota.mod - Code_data_generation/
mechanisms/ — NEURON, 149 lineshha_old_hrp.mod - Code_data_generation/
mechanisms/ — NEURON, 159 lineshha_old_rp.mod - Code_data_generation/
mechanisms/ — NEURON, 95 lineskad.mod - Code_data_generation/
mechanisms/ — NEURON, 96 lineskap.mod - Code_data_generation/
mechanisms/ — NEURON, 98 lineskca.mod - Code_data_generation/
mechanisms/ — NEURON, 77 lineskm.mod - Code_data_generation/
mechanisms/ — NEURON, 84 linesmy_exp2syn.mod - Code_data_generation/
mechanisms/ — NEURON, 81 linesmykca.mod - Code_data_generation/
mechanisms/ — NEURON, 59 linesnap.mod - Code_data_generation/
mechanisms/ — NEURON, 71 linesnmda.mod - Code_data_generation/
mechanisms/ — NEURON, 64 linessomacar.mod - Code_data_generation/
mechanisms/ — NEURON, 215 linessynapseCa.mod - Code_data_generation/
mechanisms/ — NEURON, 164 linesvecevent.mod - Code_data_generation/
mechanisms/ — NEURON, 77 linesvecstim.mod - Figure_1.py — Python, 221 lines
- Figure_2.py — Python, 491 lines
- Figure_3.py — Python, 332 lines
- Figure_4.py — Python, 434 lines
- Figure_5.py — Python, 418 lines
- Figure_6.py — Python, 540 lines
- Figure_7.py — Python, 180 lines
- Figure_S2_validation.py — Python, 427 lines
- Make_input/
Cluster_make_grid_like_i — Python, 233 linesnputs.py - Make_input/
Cluster_make_noise_inh_i — Python, 59 linesnputs.py - Make_input/
opt_.py — Python, 295 lines - Make_input/
poisson_input.py — Python, 538 lines - Make_input/
poisson_input_interneuro — Python, 126 linesns.py - Plots_for_reviewers.py — Python, 108 lines
- download_data.py — Python, 85 lines
- opt_.py — Python, 356 lines
- plotting_functions.py — Python, 58 lines
- LICENSE — License, 674 lines
- README.md — Text, 342 lines
zenodo.com
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
poirazi-lab/tasciotti_et_al_2026
77cf67010d0e6bce4e83a891fb6a49318b5b0ac4, 17 June 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
64 files
- Code_data_generation/
Add_neuron_branch_sectio — Python, 212 linesns_to_eswc.py - Code_data_generation/
Class_CA1_Pyr_standardiz — Python, 693 linesed.py - Code_data_generation/
Cluster_cells_validation — Python, 1,224 lines, 4 matches_protocols.py - Code_data_generation/
Cluster_dendritic_non_li — Python, 588 linesnearity_assessment.py - Code_data_generation/
Cluster_make_connectivit — Python, 979 lines, 2 matchesy.py - Code_data_generation/
Cluster_make_connectivit — Python, 1,074 lines, 1 matchy_higher_w_infield.py - Code_data_generation/
Cluster_stimulation.py — Python, 634 lines - Code_data_generation/
Code_data_analysis/ — Python, 345 linesAnalysis_noise_stimulati on.py - Code_data_generation/
Code_data_analysis/ — Python, 470 linesAnalysis_place_stimulati on.py - Code_data_generation/
Code_data_analysis/ — Python, 545 lines, 3 matchesAnalysis_synapse_distrib ution_ML.py - Code_data_generation/
Code_data_analysis/ — Python, 521 linesCluster_cells_validation _analysis.py - Code_data_generation/
Code_data_analysis/ — Python, 993 linesSynapse_statistical_anal ysis.py - Code_data_generation/
Code_data_analysis/ — Python, 246 linesopt.py - Code_data_generation/
Code_data_analysis/ — Python, 547 lines, 1 matchplace_cell_metrics.py - Code_data_generation/
Fix_eswc_and_make_swc.py — Python, 197 lines - Code_data_generation/
SWCExplorer_class.py — Python, 161 lines - Code_data_generation/
mechanisms/ — NEURON, 89 linesKv_Simone.mod - Code_data_generation/
mechanisms/ — NEURON, 104 linesNa_Simone.mod - Code_data_generation/
mechanisms/ — NEURON, 143 linesampa_nmda.mod - Code_data_generation/
mechanisms/ — NEURON, 164 linesampa_nmda_plastic.mod - Code_data_generation/
mechanisms/ — NEURON, 80 linescad.mod - Code_data_generation/
mechanisms/ — NEURON, 98 linescal.mod - Code_data_generation/
mechanisms/ — NEURON, 68 linescalH.mod - Code_data_generation/
mechanisms/ — NEURON, 62 linescar.mod - Code_data_generation/
mechanisms/ — NEURON, 117 linescat.mod - Code_data_generation/
mechanisms/ — NEURON, 71 linesccanl.mod - Code_data_generation/
mechanisms/ — NEURON, 27 linesconstant.mod - Code_data_generation/
mechanisms/ — NEURON, 61 linesh.mod - Code_data_generation/
mechanisms/ — NEURON, 142 lineshha2.mod - Code_data_generation/
mechanisms/ — NEURON, 162 lineshha_old.mod - Code_data_generation/
mechanisms/ — NEURON, 163 lineshha_old_Yiota.mod - Code_data_generation/
mechanisms/ — NEURON, 149 lineshha_old_hrp.mod - Code_data_generation/
mechanisms/ — NEURON, 159 lineshha_old_rp.mod - Code_data_generation/
mechanisms/ — NEURON, 95 lineskad.mod - Code_data_generation/
mechanisms/ — NEURON, 96 lineskap.mod - Code_data_generation/
mechanisms/ — NEURON, 98 lineskca.mod - Code_data_generation/
mechanisms/ — NEURON, 77 lineskm.mod - Code_data_generation/
mechanisms/ — NEURON, 84 linesmy_exp2syn.mod - Code_data_generation/
mechanisms/ — NEURON, 81 linesmykca.mod - Code_data_generation/
mechanisms/ — NEURON, 59 linesnap.mod - Code_data_generation/
mechanisms/ — NEURON, 71 linesnmda.mod - Code_data_generation/
mechanisms/ — NEURON, 64 linessomacar.mod - Code_data_generation/
mechanisms/ — NEURON, 215 linessynapseCa.mod - Code_data_generation/
mechanisms/ — NEURON, 164 linesvecevent.mod - Code_data_generation/
mechanisms/ — NEURON, 77 linesvecstim.mod - Figure_1.py — Python, 221 lines
- Figure_2.py — Python, 491 lines
- Figure_3.py — Python, 332 lines, 1 match
- Figure_4.py — Python, 434 lines, 2 matches
- Figure_5.py — Python, 418 lines, 2 matches
- Figure_6.py — Python, 540 lines, 1 match
- Figure_7.py — Python, 180 lines, 1 match
- Figure_S2_validation.py — Python, 427 lines
- Make_input/
Cluster_make_grid_like_i — Python, 233 lines, 1 matchnputs.py - Make_input/
Cluster_make_noise_inh_i — Python, 59 linesnputs.py - Make_input/
opt_.py — Python, 295 lines - Make_input/
poisson_input.py — Python, 538 lines, 2 matches - Make_input/
poisson_input_interneuro — Python, 126 lines, 1 matchns.py - Plots_for_reviewers.py — Python, 108 lines
- download_data.py — Python, 85 lines
- opt_.py — Python, 356 lines
- plotting_functions.py — Python, 58 lines
- LICENSE — License, 674 lines
- README.md — Text, 342 lines
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 124 scripts, each with its path and the digest of its content;
- 22 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 3, 28 September 2026
- Publisher: — → Cell Press
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 8 authors, 10 keywords, 17 funders, 148 references, 1 RRID.
Cite
This paper
Tasciotti, S., Iascone, D. M., Chavlis, S., Hammond, L. A., Katz, Y., Losonczy, A., Polleux, F., & Poirazi, P. (2026). Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons. Cell reports, 45(8), 117793. https://
BibTeX
@article{tasciotti2026cl
author = {Tasciotti, Simone and Iascone, Daniel Maxim and Chavlis, Spyridon and Hammond, Luke A and Katz, Yardena and Losonczy, Attila and Polleux, Franck and Poirazi, Panayiota},
title = {{Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons}},
journal = {Cell reports},
year = {2026},
month = aug,
volume = {45},
number = {8},
pages = {117793},
publisher = {Cell Press},
issn = {2211-1247},
doi = {10.1016/
url = {https://
pmid = {42560818},
pmcid = {PMC13586326}
}
RIS
TY - JOUR
AU - Tasciotti, Simone
AU - Iascone, Daniel Maxim
AU - Chavlis, Spyridon
AU - Hammond, Luke A
AU - Katz, Yardena
AU - Losonczy, Attila
AU - Polleux, Franck
AU - Poirazi, Panayiota
TI - Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons
T2 - Cell reports
J2 - Cell Rep
PY - 2026
DA - 2026/
VL - 45
IS - 8
SP - 117793
SN - 2211-1247
PB - Cell Press
DO - 10.1016/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1016/
"type": "article-journal",
"title": "Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons",
"container-title": "Cell reports",
"author": [
{
"family": "Tasciotti",
"given": "Simone"
},
{
"family": "Iascone",
"given": "Daniel Maxim"
},
{
"family": "Chavlis",
"given": "Spyridon"
},
{
"family": "Hammond",
"given": "Luke A"
},
{
"family": "Katz",
"given": "Yardena"
},
{
"family": "Losonczy",
"given": "Attila"
},
{
"family": "Polleux",
"given": "Franck"
},
{
"family": "Poirazi",
"given": "Panayiota"
}
],
"container-title-short":
"volume": "45",
"issue": "8",
"page": "117793",
"DOI": "10.1016/
"PMID": "42560818",
"PMCID": "PMC13586326",
"ISSN": "2211-1247",
"publisher": "Cell Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
5
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.7554/elife.108352 [code]
- Analysis of dendritic input currents during place field dynamics.Journal: eLifeIn common: NEURON, pandas, Matplotlib, 1 other tool, 20 references
- [2] doi:10.1126/sciadv.aec3961 [code]
- Linking functional and structural dendritic spine remodeling during fear learning and extinction in vivo.Journal: Science advancesIn common: NEURON, pandas, SciPy, 2 other tools, 14 references
- [3] doi:10.1016/j.isci.2026.117010 [code]
- Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging.Journal: iScienceIn common: seaborn, scikit-learn, pandas, 3 other tools, cellular / molecular, 11 references
- [4] doi:10.1038/s41467-026-77800-w [code]
- Learning reorganizes dendritic and stabilizes axon initial segment inhibitory synapses in CA1 pyramidal neurons.Journal: Nature communicationsIn common: cellular / molecular, 13 references
- [5] doi:10.1038/s41467-026-74834-y [code]
- Voltage imaging of CA1 pyramidal cells and SST+ interneurons reveals stability and plasticity mechanisms of spatial firing.Journal: Nature communicationsIn common: 11 references
- [6] doi:10.7554/elife.89629 [code]
- Active dendrites enable robust spiking computations despite timing jitter.Journal: eLifeIn common: NEURON, seaborn, pandas, 2 other tools, 7 references
- [7] doi:10.1126/sciadv.adz4123 [code]
- Highly attenuated dendritic propagation of isolated synaptic potentials in vivo.Journal: Science advancesIn common: cellular / molecular, 10 references
- [8] doi:10.1016/j.celrep.2026.117388 [code]
- An unsuspected physiological role for mGluRIII glutamate receptors in hippocampal area CA1.Journal: Cell reportsIn common: NEURON, pandas, Matplotlib, 1 other tool, cellular / molecular, 7 references
- [9] doi:10.1523/jneurosci.1540-25.2026 [code]
- Dendritic Inhibition Terminates Plateau Potentials in CA1 Pyramidal Neurons.Journal: The Journal of neuroscience : the official journal of the Society for NeuroscienceIn common: cellular / molecular, 10 references
- [10] doi:10.1073/pnas.2533168123 [code]
- Dendritic morphology and synaptic nonlinearities enhance functional complexity in human cortical neurons.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: NEURON, scikit-learn, pandas, 3 other tools, cellular / molecular, 5 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 3 repositories of the authors' code, each at its verified commit and with its license, 124 scripts, and 22 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:56e4317fef3fb368…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
