import random as rnd from neuron import h from neuron import gui h.load_file('nrngui.hoc') import copy as cp import numpy as np class Panels(object): def __init__(self,branch,protocol,plots): self.spines = branch.spines self.cell = branch.cell self.plots = plots self.tau_rm = self.spines[0].head.RMECB.tau_RM self.alpha_RMru = self.spines[0].head.RMECB.alpha_RMru self.blk_RMBLK = protocol.p['Block_RMBLK'] self.protocol = protocol self.dur = protocol.stimulators['IC_dep'][0][0].dur self.dep = protocol.stimulators['IC_dep'] self.hyp = protocol.stimulators['IC_hyp'] self.stim = protocol.stim self.start_base = protocol.p['time_start_induction_stimuli'] self.delta_t = 5 #-(self.stim.start - self.start_base) self.neck_diam = self.spines[0].neck.diam self.AMPA_Pmax = self.spines[0].head.AMPA.Pmax self.AMPA_Prel = self.spines[0].head.AMPA.U_SE_init self.AMPA_NMDA_ratio = self.spines[0].head.NMDA.Pmax/self.spines[0].head.AMPA.Pmax self.NMDA_Pmax = self.spines[0].head.NMDA.Pmax self.NMDA_mg = self.spines[0].head.NMDA.mg self.NMDA_mgbk = self.spines[0].head.NMDA.mgb_k self.KMULT = h.KMULT self.KMULTP = h.KMULTP self.nBPAP = len(protocol.stimulators['IC_dep'][0]) self.nstim = 25 #len(protocol.stimulators['IC_dep']) self.sp_delay_env = protocol.p['sp_delay_env'] self.old_sp_delay_env = cp.deepcopy(protocol.p['sp_delay_env']) self.gbar_cat = protocol.p['gcatbar'] self.clamp_dur = 120 self.clamp_V = -20 self.build() self.map() def build(self): self.box = h.HBox() self.box.intercept(1) self.box.ref(self) h.xpanel("") h.xbutton("View = Plot", self.set_view) h.xbutton("Set to run short sim", self.run_short) h.xbutton("Set to run long sim", self.run_long) h.xbutton("LTP11", self.set_LTP11) h.xbutton("LTP12", self.set_LTP12) h.xbutton("LTP14", self.set_LTP14) h.xbutton("SEClamp",self.set_seclamp) h.xbutton("SEClamp del",self.del_seclamp) h.xstatebutton("Block RMBLK",(self,'blk_RMBLK'),self.set_spines) h.xvalue("Pulse duration (ms)", (self, "dur"), 1, self.set_pulse) h.xvalue("Delta_t = t_post - t_pre (ms)", (self, "delta_t"), 1, self.set_stim_start) h.xvalue("Spine neck diam (um)", (self, "neck_diam"), 1, self.set_spines) h.xvalue("AMPA permeability (cm/s)", (self, "AMPA_Pmax"), 1, self.set_spines) h.xvalue("Glutammate Prel", (self, "AMPA_Prel"), 1, self.set_spines) h.xvalue("AMPA NMDA ratio", (self, "AMPA_NMDA_ratio"), 1, self.set_spines) h.xvalue("NMDA permeability (cm/s)", (self, "NMDA_Pmax"), 1, self.set_spines) h.xvalue("NMDA Mg out (mM)", (self, "NMDA_mg"), 1, self.set_spines) h.xvalue("NMDA Mg Block slope (/mV)", (self, "NMDA_mgbk"), 1, self.set_spines) h.xvalue("BPAB number", (self, "nBPAP"), 1, self.set_pulse) h.xvalue("Number of stimuli", (self, "nstim"), 1, self.set_pulse) h.xvalue("KMULT", (self, "KMULT"), 1, self.set_cell) h.xvalue("KMULTP", (self, "KMULTP"), 1, self.set_cell) h.xvalue("CaT gbar", (self, "gbar_cat"), 1, self.set_spines) h.xvalue("Spike envelop delay", (self, "sp_delay_env"), 1, self.set_pulse) h.xvalue("RM decay tau (ms)", (self, "tau_rm"), 1, self.set_spines) h.xvalue("alpha_RMru (1)", (self, "alpha_RMru"), 1, self.set_spines) h.xvalue("Clamp dur", (self, "clamp_dur"), 1, self.set_seclamp) h.xvalue("Clamp V", (self, "clamp_V"), 1, self.set_seclamp) h.xpanel() self.box.intercept(0) def map(self): self.box.map("Stimulus control", 0, 378, 329.28, 642.24) def set_seclamp(self): self.clamp = h.SEClamp(0.5,sec=self.cell.soma) self.clamp.dur1 = self.clamp_dur self.clamp.amp1 = self.clamp_V self.clamp_graph = h.Graph() self.clamp_graph.addvar('I_seclamp',self.clamp._ref_i, 1,1,sec=self.cell.soma) h.graphList[0].append(self.clamp_graph) def del_seclamp(self): del self.clamp def set_LTP11(self): h.stoprun = 1 self.erase() h.init() self.nBPAP = 1 self.nstim = 70 self.set_pulse() def set_LTP12(self): h.stoprun = 1 self.erase() h.init() self.nBPAP = 2 self.nstim = 50 self.set_pulse() def set_LTP14(self): h.stoprun = 1 self.erase() h.init() self.nBPAP = 4 self.nstim = 25 self.set_pulse() def set_spines(self): for spine in self.spines: spine.head.RMECB.tau_RM = self.tau_rm spine.head.RMECB.alpha_RMru = self.alpha_RMru spine.neck.diam = self.neck_diam spine.head.AMPA.Pmax = self.AMPA_Pmax spine.head.AMPA.U_SE_init = self.AMPA_Prel if self.AMPA_NMDA_ratio > 0: spine.head.NMDA.Pmax = self.AMPA_Pmax * self.AMPA_NMDA_ratio self.NMDA_Pmax = spine.head.NMDA.Pmax else: spine.head.NMDA.Pmax = self.NMDA_Pmax spine.head.gcatbar_cat = self.gbar_cat spine.head.NMDA.mg = self.NMDA_mg spine.head.NMDA.mgb_k = self.NMDA_mgbk if self.blk_RMBLK: self.alpha_cai_RMBLK_tmp = spine.head.RMECB.alpha_cai_RMBLK spine.head.RMECB.alpha_cai_RMBLK = 0 else: spine.head.RMECB.alpha_cai_RMBLK = self.alpha_cai_RMBLK_tmp def set_stim_start(self): self.stim.start = self.start_base - self.delta_t print(("Delta t =",self.stim.start)) def set_pulse(self): # Set curr inj duration for dc,hc in zip(self.dep, self.hyp): for dc2 in dc: dc2.dur = self.dur # Set nunmber of curr injections for each induction stim (nBPAPs) for dc,hc in zip(self.dep, self.hyp): for dc2 in dc[int(self.nBPAP):len(dc)]: dc2.dur = 0 # for hc2 in hc: # hc2.dur = 0 # hc2.delay = dc.delay + dc.dur # ms # Set nunmber of trains of curr injections, i.e. n induction stimuli for nst,(dc,hc) in enumerate(zip(self.dep, self.hyp)): if nst > self.nstim: for dc2 in dc: dc2.dur = 0 self.stim.number = self.nstim synaptic_delays = np.linspace(0,self.sp_delay_env,len(self.spines)) for delay,nc,nc_nmda in zip(synaptic_delays,self.protocol.nc_stim,self.protocol.nc_stim_nmda): nc.delay = delay nc_nmda.delay = delay print(("new dur =", self.dep[0][0].dur)) def set_cell(self): command = 'forall ' for sec in self.cell.apical_sl: for seg in sec: xdist = h.distance(seg.x) if xdist > 100: prev_gkabar_kad = seg.gkabar_kad seg.gkabar_kad = self.KMULT*(1+xdist/100) # print((seg.gkabar_kad - prev_gkabar_kad) / prev_gkabar_kad) else: prev_gkabar_kap = seg.gkabar_kap seg.gkabar_kap = self.KMULTP*(1+xdist/100) def set_view(self): for plot in list(self.plots.values()): plot.exec_menu("View = plot") def erase(self): for plot in list(self.plots.values()): plot.exec_menu("Erase") def run_short(self): h.stoprun = 1 self.erase() h.tstop = 250 def run_long(self): h.stoprun = 1 self.erase() h.tstop = 1800e3 # runs for 30 min = 1000 ms x 60 s x 30 min = 1.800.000 ms