from neuron import h
import random as rnd
import numpy as np
class stim_protocol():
def __init__(self,
cell,
p,
rank = 0):
# Add parameters to protocol
self.p = p
self.seed = 123881
rnd.seed(self.seed)
# Start protocol
self.stimulators = {}
# Initial time lag
start_next = 0
# Stabilization of membrane potential
start_next += 0
# pre induction EPSP Test
self.test_pre = h.NetStim()
self.test_pre.start = start_next # start_next # ms
self.test_pre.interval = 1e3/self.p['test_freq'] # ms -> 20 sec
self.test_pre.number = int(self.p['time_on_initialization'] / self.test_pre.interval) # 200
self.test_pre.noise = 0
if p['check']:
print(('Begin sim',start_next))
self.nc_test_pre = []
self.nc_test_pre_nmda = []
for spine in cell.spines:
self.nc_test_pre.append(h.NetCon(self.test_pre, spine.head.AMPA,0,0,1))
self.nc_test_pre_nmda.append(h.NetCon(self.test_pre, spine.head.NMDA,0,0,1))
self.stimulators['test_pre_spike_times'] = h.Vector()
self.nc_test_pre[-1].record(self.stimulators['test_pre_spike_times'])
start_next += self.p['time_on_initialization']
if p['check']:
print(('End PRE',start_next))
# Induction protocol
self.stim = h.NetStim()
start_next += self.p['time_to_begin_induction']
self.stim.start = start_next # ms
self.p['time_start_induction_stimuli'] = self.stim.start
self.stim.number = self.p['nstim'] # 200
self.stim.interval = 1e3/self.p['induction_freq'] # ms 0.5 Hz = 2 s
self.stim.noise = 0
if p['check']:
print(('Begin induction',start_next))
self.nc_stim = []
self.nc_stim_nmda = []
synaptic_delays = np.linspace(0,p['sp_delay_env'],len(cell.spines))
for spine,delay in zip(cell.spines,synaptic_delays):
spine.delay = delay #rnd.uniform(0,p['sp_delay_env'])
self.nc_stim.append(h.NetCon(self.stim, spine.head.AMPA,0,spine.delay,1))
self.nc_stim_nmda.append(h.NetCon(self.stim, spine.head.NMDA,0,spine.delay,1))
self.stimulators['induction_spikes'] = h.Vector()
self.nc_stim[-1].record(self.stimulators['induction_spikes'])
# during induction EPSP Test
self.test_during = h.NetStim()
self.test_during.start = start_next + 1e3/self.p['induction_freq']/2 # ms
if p['check']:
print(("DURING",self.test_during.start, 1e3/self.p['induction_freq']/2))
self.test_during.interval = 1e3/self.p['test_freq'] # ms -> 20 sec
self.test_during.number = int(self.stim.number*self.stim.interval / self.test_during.interval)
self.test_during.noise = 0
self.nc_test_during = []
self.nc_test_during_nmda = []
for spine in cell.spines:
self.nc_test_during.append(h.NetCon(self.test_during, spine.head.AMPA,0,0,1))
self.nc_test_during_nmda.append(h.NetCon(self.test_during, spine.head.NMDA,0,0,1))
self.stimulators['test_during_spike_times'] = h.Vector()
self.nc_test_during[-1].record(self.stimulators['test_during_spike_times'])
# BPAP self.stimulation
IC_dep = self.stimulators['IC_dep'] = []
IC_hyp = self.stimulators['IC_hyp'] = []
IC_delays = self.stimulators['IC_delays'] = []
for s in range(self.p['nstim']):
IC_dep.append([])
IC_hyp.append([])
IC_delays.append(start_next + self.stim.interval * s - p['IC_delay_to_spike'])
for ap in range(4):
IC_dep[-1].append(h.IClamp(0.5, sec = cell.cell.soma))
IC_hyp[-1].append(h.IClamp(0.5, sec = cell.cell.soma))
IC_dep[-1][ap].amp = p['BPAP_stimulus_amplitude'] # nA
IC_dep[-1][ap].delay = IC_delays[-1] + ap*5# ms
IC_dep[-1][ap].dur = p['BPAP_dep_stimulus_duration'] # ms
IC_hyp[-1][ap].amp = -0.02 # nA
IC_hyp[-1][ap].delay = IC_dep[-1][ap].delay + IC_dep[-1][ap].dur # ms
IC_hyp[-1][ap].dur = p['BPAP_hyp_stimulus_duration'] # ms
# self.stimulators['IC_dep'].append(h.IClamp(0.5, sec = cell.cell.branch_base))
# self.stimulators['IC_hyp'].append(h.IClamp(0.5, sec = cell.cell.branch_base))
# self.stimulators['IC_dep'][-1].amp = self.p['BPAP_stimulus_ampitude'] # nA
# self.stimulators['IC_dep'][-1].delay = start_next + self.stim.interval * s - self.p['IC_delay_to_spike'] # ms
# self.stimulators['IC_delays'].append(self.stimulators['IC_dep'][-1].delay)
# self.stimulators['IC_dep'][-1].dur = self.p['BPAP_dep_stimulus_duration'] # ms
# self.stimulators['IC_hyp'][-1].amp = -0.02 # nA
# self.stimulators['IC_hyp'][-1].delay = self.stimulators['IC_dep'][-1].delay + self.stimulators['IC_dep'][-1].dur # ms
# self.stimulators['IC_hyp'][-1].dur = self.p['BPAP_hyp_stimulus_duration'] # ms
self.time_of_induction = self.p['nstim'] * self.stim.interval
start_next += self.time_of_induction
self.time_end_induction = start_next
if p['check']:
print(('End induction',start_next))
# Post induction EPSP test during expression
self.test_post = h.NetStim()
start_next += self.p['time_after_induction']
self.test_post.start = start_next # ms
self.test_post.number = 1e4
self.test_post.interval = 1e3/self.p['test_freq'] # ms = 0.05 Hz = 20 sec
self.test_post.noise = 0
self.nc_test_post = []
self.nc_test_post_nmda = []
for spine in cell.spines:
self.nc_test_post.append(h.NetCon(self.test_post, spine.head.AMPA,0,0,1))
self.nc_test_post_nmda.append(h.NetCon(self.test_post, spine.head.NMDA,0,0,1))
start_next += self.p['time_of_expression'] #ms
self.stimulators['test_post_spike_times'] = h.Vector()
self.nc_test_post[-1].record(self.stimulators['test_post_spike_times'])
# cell.spines[0].head.plot('cai')
# dend.plot('v')
# # h('load_file("Tests/Test_ampa.ses")')
# # h('load_file("Tests/Test_ampa_30min.ses")')
# Remve the induction self.stimulus
if self.p['activate_LTP_protocol']:
self.stim.number = self.p['nstim']
else:
self.stim.number = 0
##### Initialization ########
h.v_init = self.p['Vrest'] # mV
self.p['tstop'] = start_next
h.init()
if p['check']:
print(('Setup finished on cpu %g tstop %g'%(rank,h.tstop)))