from neuron import h, gui import nrnutils_ss as nu import toolbox as tb from Spine import Spine import pyr_2005 as pyr from random import sample,choice import numpy as np # import ipdb class Spiny_branch(): def __init__(self, p, rank=0): h.celsius = p['temperature'] # Load the branch 93 with its channels self.cell = pyr.cell(p['Vrest'], p['RmDend'], p['RaAll'], p['CmDend'], records=[ {'section':'soma', 'variable':'v', 'location':0.5, 'unit':'mV'}, {'section':'branch_base', 'variable':'v', 'location':0.5, 'unit':'mV'}], use_channels=True ) # # Set branhc erev # for sec in self.cell.branch_sl: # sec.ena = p['erev_na'] # sec.ek = p['erev_k'] # if p['check']: # print sec.ena,sec.ek # ipdb.set_trace() # self.cell.balance_currents(p['Vrest'], check = p['check']) # done in the hoc file # self.cell.record(['vm','spikes']) # Spine mechanisms self.cad = nu.Mechanism('cad', depth = 0.05, tauca = 12, cainf = 100e-6) # depth in um, tau in ms, cainf in mM self.pas = nu.Mechanism('pas', e=p['Vrest'], g=1./p['Rm']) self.cal = nu.Mechanism ('cal', gcalbar=p['gcalbar']) self.can = nu.Mechanism ('can', gcanbar=p['gcanbar']) self.cat = nu.Mechanism ('cat', gcatbar=p['gcatbar']) # self.kad = nu.Mechanism ('kad', gkabar=0) # self.na3 = nu.Mechanism ('na3', gbar=0) # self.kdr = nu.Mechanism ('kdr', gkdrbar=0) h.use_mcell_ran4() self.MCell_Ran4_lowindex = 42 h.mcell_ran4_init(self.MCell_Ran4_lowindex) self.noiseRandObj = h.Random() #Provides NOISE with random stream self.MCell_Ran4_highindex = [self.noiseRandObj.MCellRan4(12345)] self.noiseRandObj.uniform(0,1) self.branch_segments = [[sec,seg] for sec in list(self.cell.branch38.values()) for seg in sec] self.branch_segments_2 = [[sec,seg] for sec in list(self.cell.branch8.values()) for seg in sec] self.branch_segments_3 = [[sec,seg] for sec in list(self.cell.branch37.values()) for seg in sec] # self.spine_segments = sample(self.branch_segments,p['nspines']) # self.spine_segments = self.branch_segments[0:len(self.branch_segments):3] # # Some spines potentiate before others, thus we set those spines to be at the dendritic tip where # # the BPAP has larger amplitud yielding a larger Ca2+ transient, more fused vesicles, more pro/mBDNF in the syn cleft # # with a resulting earlier/faster potentiation. # self.spine_segments = [self.branch_segments[-1], # self.branch_segments[-1], # self.branch_segments[-1], # self.branch_segments[-1]]# 4 spines at the branch tip # self.spine_segments.extend(self.branch_segments[-7:-4]) # 3 spines in the middle # self.spine_segments.extend(self.branch_segments[-15:-12]) # 4 near the branching point # self.spine_segments.extend([self.branch_segments[-20]]) # self.spine_segments.extend([self.branch_segments[-22]]) # # print len(self.branch_segments), self.branch_segments[-22:-19] # self.spine_segments.extend(self.branch_segments_2[-22:-19]) # self.spine_segments.extend(self.branch_segments_2[-22:-19]) # # self.spine_segments.extend([self.branch_segments[-25]]) # # self.spine_segments.extend([self.branch_segments[-26]]) # # self.spine_segments.extend([self.branch_segments_3[-1]]) # # self.spine_segments.extend([self.branch_segments_3[-3]]) # print "LENGTH",len(self.spine_segments) self.seg_indexes = [-1,-1,-1,-1,-7,-6,-5,-15,-14,-13,-20,-22] # 12 spines [0:11] self.seg_indexes_2 =[-22,-21,-20,-22,-21,-20] # 6 extra spines [12:17] # # Generate randomly selected set # # self.seg_indexes = sample(range(0,len(self.branch_segments)-15),p['nspines']) # self.seg_indexes = np.random.choice(range(len(self. branch_segments)),size=p['nspines']) # self.seg_indexes_2 = np.random.choice(range(len(self.branch_segments_2)),size=p['nspines_2']) # Seg_indexes are saved in the sim data file. self.spine_segments = [self.branch_segments[idx] for idx in self.seg_indexes] self.spine_segments.extend([self.branch_segments_2[idx] for idx in self.seg_indexes_2]) print([str(sn) for sn in self.spine_segments]) # Spines self.spines = [] for i,s in enumerate(self.spine_segments): self.spines.append(Spine('Spine_%g'%i,p, neck_mechanisms=[self.pas], connection_point = 0, parent = s, head_mechanisms=[self.cad, self.pas, self.cal, self.can, self.cat], noiseRandObj = self.noiseRandObj, balance_currents=True, highindex=self.MCell_Ran4_highindex[-1])) self.MCell_Ran4_highindex.append(self.noiseRandObj.MCellRan4()) # Set specific RM11 and RMD time constants self.spines[0].head.RMECB.tau_RMLTP11 = self.spines[0].head.RMECB.tau_RMLTP11/3 self.spines[1].head.RMECB.tau_RMLTP11 = self.spines[0].head.RMECB.tau_RMLTP11 self.spines[2].head.RMECB.tau_RMLTP11 = self.spines[0].head.RMECB.tau_RMLTP11 self.spines[3].head.RMECB.tau_RMLTP11 = self.spines[3].head.RMECB.tau_RMLTP11 self.spines[4].head.RMECB.tau_RMLTP11 = self.spines[3].head.RMECB.tau_RMLTP11 self.spines[5].head.RMECB.tau_RMLTP11 = self.spines[3].head.RMECB.tau_RMLTP11 * 1.5 self.spines[6].head.RMECB.tau_RMLTP11 = self.spines[3].head.RMECB.tau_RMLTP11 * 1.5 self.spines[7].head.RMECB.tau_RMLTP11 = self.spines[7].head.RMECB.tau_RMLTP11 * 1.7 self.spines[8].head.RMECB.tau_RMLTP11 = self.spines[7].head.RMECB.tau_RMLTP11 self.spines[9].head.RMECB.tau_RMLTP11 = self.spines[7].head.RMECB.tau_RMLTP11 self.spines[10].head.RMECB.tau_RMLTP11 = self.spines[3].head.RMECB.tau_RMLTP11 * 2 self.spines[11].head.RMECB.tau_RMLTP11 = self.spines[3].head.RMECB.tau_RMLTP11 # # Set specific BDNF constants # for s_i,s in enumerate(self.spines[12:18]): # s.head.BDNF.theta_cai_BDNF = 0.045 # set a low cai threshold these spines on branch8 # s.head.internal_nc.threshold = s.head.BDNF.theta_cai_BDNF # s.head.RMECB.theta_cai_RMBLK = 0.052 # set a low cai threshold these spines on branch8 # s.head.RMECB.theta_cai_RM = 0.006 # set a low cai threshold these spines on branch8 # s.head.BDNF.theta_gAMPA = 0.02 # set a normal threshold for test # s.head.BDNF.alpha_gAMPA = 1.5 # set a high LTP # s.head.BDNF.v_BDNF = 0.002*1.0 # Increase BDNF release at these spines # self.spines[12].head.BDNF.theta_gAMPA = 0.06 # self.spines[13].head.BDNF.theta_gAMPA = 0.05 # self.spines[14].head.BDNF.theta_gAMPA = 0.075 # self.spines[15].head.BDNF.theta_gAMPA = 0.075 # self.spines[16].head.BDNF.theta_gAMPA = 0.08 # self.spines[17].head.BDNF.theta_gAMPA = 0.11 for s_i,s in enumerate(self.spines): print(("spine ", s_i, s.head.BDNF.theta_gAMPA)) def plot_branch(self, variable, type='mech', label='', location=0.5, tmin=0, tmax=5, xmin=-80, xmax=40, view=None, show=1, color='k', line=1, graph=None): # Convert color to number colors = {'r':2,'k':1,'g':4,'b':3,'o':5,'mr':7,'m':9,'y':8} color = colors[color] import neuron.gui if graph is None: self.graph = h.Graph(show) graph = self.graph h.graphList[0].append(graph) graph.size(tmin, tmax, xmin, xmax) if view is not None: graph.view(view[0],view[1],view[2], view[3],view[4],view[5],view[6],view[7]) if not label: label = variable if 'mech' in type: graph.addvar('%s(%g)'%(label,location), '%s(%g)' % (variable, location), color, line, sec=self.cell.branch_base) if 'pp' in type: graph.addvar('%s(%g)'%(label,location), getattr(getattr(self,variable[0]), '_ref_'+variable[1]), color, line, sec=self.cell.branch_base) return graph def plot_soma(self, variable, type='mech', label='', location=0.5, tmin=0, tmax=5, xmin=-80, xmax=40, view=None, show=1, color='k', line=1, graph=None, position=None): # Convert color to number colors = {'r':2,'k':1,'g':4,'b':3,'o':5,'mr':7,'m':9,'y':8, '1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9} color = colors[str(color)] if position is None: position = [0.8,0.9] import neuron.gui if graph is None: self.graph = h.Graph(show) graph = self.graph h.graphList[0].append(graph) graph.size(tmin, tmax, xmin, xmax) if view is not None: graph.view(view[0],view[1],view[2], view[3],view[4],view[5],view[6],view[7]) if not label: label = variable if 'mech' in type: graph.addvar('%s(%g)'%(label,location), '%s(%g)' % (variable, location), color, line, sec=self.cell.soma) if 'pp' in type: graph.addvar('%s(%g)'%(label,location), getattr(getattr(self,variable[0]), '_ref_'+variable[1]), color, line, sec=self.cell.branch_base) graph.flush() return graph