def testFitModel(self): self.loadTTree() fit_locs = [(1,.5), (4,1.), (5,.5), (8,.5)] # fit a tree directly from CompartmentTree greens_tree = self.tree.__copy__(new_tree=GreensTree()) greens_tree.setCompTree() freqs = np.array([0.]) greens_tree.setImpedance(freqs) z_mat = greens_tree.calcImpedanceMatrix(fit_locs)[0] ctree = greens_tree.createCompartmentTree(fit_locs) ctree.computeGMC(z_mat) sov_tree = self.tree.__copy__(new_tree=SOVTree()) sov_tree.calcSOVEquations() alphas, phimat = sov_tree.getImportantModes(locarg=fit_locs) ctree.computeC(-alphas[0:1].real*1e3, phimat[0:1,:].real) # fit a tree with compartmentfitter cm = CompartmentFitter(self.tree) ctree_cm = cm.fitModel(fit_locs) # compare the two trees self._checkPasCondProps(ctree_cm, ctree) self._checkPasCaProps(ctree_cm, ctree) self._checkEL(ctree_cm, -75.) # check active channel self.fitBall() locs = [(1, 0.5)] cm = CompartmentFitter(self.tree) ctree_cm_1 = cm.fitModel(locs, parallel=False, use_all_chans_for_passive=False) ctree_cm_2 = cm.fitModel(locs, parallel=False, use_all_chans_for_passive=True) self._checkAllCurrProps(self.ctree, ctree_cm_1) self._checkAllCurrProps(self.ctree, ctree_cm_2)
def testParallel(self, w_benchmark=False): self.loadTSegmentTree() locs = [(nn.index,0.5) for nn in self.tree.nodes[:30]] cm = CompartmentFitter(self.tree) ctree_cm = cm.fitModel(locs, parallel=False, use_all_chans_for_passive=True) if w_benchmark: from timeit import default_timer as timer t0 = timer() cm.fitChannels(recompute=False, pprint=False, parallel=False) t1 = timer() print('Not parallel: %.8f s'%(t1-t0)) t0 = timer() cm.fitChannels(recompute=False, pprint=False, parallel=True) t1 = timer() print('Parallel: %.8f s'%(t1-t0))
def plotSim(delta_ts=[0., 1., 2., 3., 4., 5., 6., 7., 8.], recompute=False): global SYN_NODE_IND, SYN_XCOMP # initialize the full model simtree = BrancoSimTree() simtree.setSynLocs() simtree.setCompTree() # derive the reduced model retaining only soma and synapse locations fit_locs = simtree.getLocs('soma loc') + simtree.getLocs('syn locs') c_fit = CompartmentFitter(simtree, name='sequence_discrimination', path='data/') ctree = c_fit.fitModel(fit_locs, recompute=recompute) clocs = ctree.getEquivalentLocs() # create the reduced model for NEURON simulation csimtree_ = createReducedNeuronModel(ctree) csimtree = csimtree_.__copy__(new_tree=BrancoReducedTree()) csimtree.setSynLocs(clocs) pl.figure('Branco', figsize=(5, 5)) gs = GridSpec(2, 2) ax0 = pl.subplot(gs[0, 0]) ax_ = pl.subplot(gs[0, 1]) ax1 = myAx(pl.subplot(gs[1, :])) # plot the full morphology locargs = [dict(marker='s', mec='k', mfc=cfl[0], ms=markersize)] locargs.extend([ dict(marker='s', mec='k', mfc=cfl[1], ms=markersize) for ii in range(1, len(fit_locs)) ]) pnodes = [n for n in simtree if n.swc_type != 2] plotargs = {'lw': lwidth / 1.3, 'c': 'DarkGrey'} simtree.plot2DMorphology(ax0, use_radius=False, node_arg=pnodes, plotargs=plotargs, marklocs=fit_locs, locargs=locargs, lims_margin=.01, textargs={'fontsize': ticksize}, labelargs={'fontsize': ticksize}) # plot a schematic of the reduced model labelargs = { 0: { 'marker': 's', 'mfc': cfl[0], 'mec': 'k', 'ms': markersize * 1.2 } } labelargs.update({ ii: { 'marker': 's', 'mfc': cfl[1], 'mec': 'k', 'ms': markersize * 1.2 } for ii in range(1, len(fit_locs)) }) ctree.plotDendrogram(ax_, plotargs={ 'c': 'k', 'lw': lwidth }, labelargs=labelargs) xlim, ylim = np.array(ax_.get_xlim()), np.array(ax_.get_ylim()) pp = np.array([np.mean(xlim), np.mean(ylim)]) dp = np.array([2. * np.abs(xlim[1] - xlim[0]) / 3., 0.]) ax_.annotate( 'Centrifugal', #xycoords='axes points', xy=pp, xytext=pp + dp, size=ticksize, rotation=90, ha='center', va='center') ax_.annotate( 'Centripetal', #xycoords='axes points', xy=pp, xytext=pp - dp, size=ticksize, rotation=90, ha='center', va='center') # plot voltage traces legend_handles = [] for ii, delta_t in enumerate(delta_ts): res_cp, res_cf = simtree.runSim(delta_t=delta_t) ax1.plot(res_cp['t'], res_cp['v_m'][0], c='DarkGrey', lw=lwidth) ax1.plot(res_cf['t'], res_cf['v_m'][0], c='DarkGrey', lw=lwidth) cres_cp, cres_cf = csimtree.runSim(delta_t=delta_t) line = ax1.plot(cres_cp['t'], cres_cp['v_m'][0], c=colours[ii % len(colours)], ls='--', lw=1.6 * lwidth, label=r'$\Delta t = ' + '%.1f$ ms' % delta_t) ax1.plot(cres_cf['t'], cres_cf['v_m'][0], c=colours[ii % len(colours)], ls='-.', lw=1.6 * lwidth) legend_handles.append(line[0]) legend_handles.append( mlines.Line2D([0, 0], [0, 0], ls='--', lw=1.6 * lwidth, c='DarkGrey', label=r'centripetal')) legend_handles.append( mlines.Line2D([0, 0], [0, 0], ls='-.', lw=1.6 * lwidth, c='DarkGrey', label=r'centrifugal')) drawScaleBars(ax1, r' ms', r' mV', b_offset=20, h_offset=15, v_offset=15) myLegend(ax1, loc='upper left', bbox_to_anchor=(.7, 1.3), handles=legend_handles, fontsize=ticksize, handlelength=2.7) pl.tight_layout() pl.show()
def plotSim(delta_ts=[0.,1.,2.,3.,4.,5.,6.,7.,8.], recompute=False): class BrancoSimTree(NeuronSimTree): ''' Inherits from :class:`NeuronSimTree` to implement Branco model ''' def __init__(self): super().__init__() phys_tree = getL23PyramidPas() phys_tree.__copy__(new_tree=self) def setSynLocs(self): global SYN_NODE_IND, SYN_XCOMP # set computational tree self.setCompTree() self.treetype = 'computational' # define the locations locs = [MorphLoc((SYN_NODE_IND, x), self, set_as_comploc=True) for x in SYN_XCOMP] self.storeLocs(locs, name='syn locs') self.storeLocs([(1., 0.5)], name='soma loc') # set treetype back self.treetype = 'original' def deleteModel(self): super(BrancoSimTree, self).deleteModel() self.pres = [] self.nmdas = [] def addAMPASynapse(self, loc, g_max, tau): loc = MorphLoc(loc, self) # create the synapse syn = h.AlphaSynapse(self.sections[loc['node']](loc['x'])) syn.tau = tau syn.gmax = g_max # store the synapse self.syns.append(syn) def addNMDASynapse(self, loc, g_max, e_rev, c_mg, dur_rel, amp_rel): loc = MorphLoc(loc, self) # create the synapse syn = h.NMDA_Mg_T(self.sections[loc['node']](loc['x'])) syn.gmax = g_max syn.Erev = e_rev syn.mg = c_mg # create the presynaptic segment for release pre = h.Section(name='pre %d'%len(self.pres)) pre.insert('release_BMK') pre(0.5).release_BMK.dur = dur_rel pre(0.5).release_BMK.amp = amp_rel # connect h.setpointer(pre(0.5).release_BMK._ref_T, 'C', syn) # store the synapse self.nmdas.append(syn) self.pres.append(pre) # setpointer cNMDA[n].C, PRE[n].T_rel(0.5) # setpointer im_xtra(x), i_membrane(x) # h.setpointer(dend(seg.x)._ref_i_membrane, 'im', dend(seg.x).xtra) def setSpikeTime(self, syn_index, spike_time): spk_tm = spike_time + self.t_calibrate # add spike for AMPA synapse self.syns[syn_index].onset = spk_tm # add spike for NMDA synapse self.pres[syn_index](0.5).release_BMK.delay = spk_tm def addAllSynapses(self): global G_MAX_AMPA, TAU_AMPA, G_MAX_NMDA, E_REV_NMDA, C_MG, DUR_REL, AMP_REL for loc in self.getLocs('syn locs'): # ampa synapse self.addAMPASynapse(loc, G_MAX_AMPA, TAU_AMPA) # nmda synapse self.addNMDASynapse(loc, G_MAX_NMDA, E_REV_NMDA, C_MG, DUR_REL, AMP_REL) def setSequence(self, delta_t, centri='fugal', t0=10., tadd=100.): n_loc = len(self.getLocs('syn locs')) if centri == 'fugal': for ll in range(n_loc): self.setSpikeTime(ll, t0 + ll * delta_t) elif centri == 'petal': for tt, ll in enumerate(range(n_loc)[::-1]): self.setSpikeTime(ll, t0 + tt * delta_t) else: raise IOError('Only centrifugal or centripetal sequences are allowed, ' + \ 'use \'fugal\' resp. \'petal\' as second arg.') return n_loc * delta_t + t0 + tadd def reduceModel(self, pprint=False): global SYN_NODE_IND, SYN_XCOMP locs = [MorphLoc((1, .5), self, set_as_comploc=True)] + \ [MorphLoc((SYN_NODE_IND, x), self, set_as_comploc=True) for x in SYN_XCOMP] # creat the reduced compartment tree ctree = self.createCompartmentTree(locs) # create trees to derive fitting matrices sov_tree, greens_tree = self.getZTrees() # compute the steady state impedance matrix z_mat = greens_tree.calcImpedanceMatrix(locs)[0].real # fit the conductances to steady state impedance matrix ctree.computeGMC(z_mat, channel_names=['L']) if pprint: np.set_printoptions(precision=1, linewidth=200) print(('Zmat original (MOhm) =\n' + str(z_mat))) print(('Zmat fitted (MOhm) =\n' + str(ctree.calcImpedanceMatrix()))) # get SOV constants alphas, phimat = sov_tree.getImportantModes(locarg=locs, sort_type='importance', eps=1e-12) # n_mode = len(locs) # alphas, phimat = alphas[:n_mode], phimat[:n_mode, :] importance = sov_tree.getModeImportance(sov_data=(alphas, phimat), importance_type='full') # fit the capacitances from SOV time-scales # ctree.computeC(-alphas*1e3, phimat, weight=importance) ctree.computeC(-alphas[:1]*1e3, phimat[:1,:], importance=importance[:1]) if pprint: print(('Taus original (ms) =\n' + str(np.abs(1./alphas)))) lambdas, _, _ = ctree.calcEigenvalues() print(('Taus fitted (ms) =\n' + str(np.abs(1./lambdas)))) return ctree def runSim(self, delta_t=12.): try: el = self[0].currents['L'][1] except AttributeError: el = self[1].currents['L'][1] # el=-75. self.initModel(dt=0.025, t_calibrate=0., v_init=el, factor_lambda=10.) # add the synapses self.addAllSynapses() t_max = self.setSequence(delta_t, centri='petal') # set recording locs self.storeLocs(self.getLocs('soma loc') + self.getLocs('syn locs'), name='rec locs') # run the simulation res_centripetal = self.run(t_max, pprint=True) # delete the model self.deleteModel() self.initModel(dt=0.025, t_calibrate=0., v_init=el, factor_lambda=10.) # add the synapses self.addAllSynapses() t_max = self.setSequence(delta_t, centri='fugal') # set recording locs self.storeLocs(self.getLocs('soma loc') + self.getLocs('syn locs'), name='rec locs') # run the simulation res_centrifugal = self.run(t_max, pprint=True) # delete the model self.deleteModel() return res_centripetal, res_centrifugal class BrancoReducedTree(NeuronCompartmentTree, BrancoSimTree): def __init__(self): # call the initializer of :class:`NeuronSimTree`, follows after # :class:`BrancoSimTree` in MRO super(BrancoSimTree, self).__init__(file_n=None, types=[1,3,4]) def setSynLocs(self, equivalent_locs): self.storeLocs(equivalent_locs[1:], name='syn locs') self.storeLocs(equivalent_locs[:1], name='soma loc') global SYN_NODE_IND, SYN_XCOMP # initialize the full model simtree = BrancoSimTree() simtree.setSynLocs() simtree.setCompTree() # derive the reduced model retaining only soma and synapse locations fit_locs = simtree.getLocs('soma loc') + simtree.getLocs('syn locs') c_fit = CompartmentFitter(simtree, name='sequence_discrimination', path='data/') ctree = c_fit.fitModel(fit_locs, recompute=recompute) clocs = ctree.getEquivalentLocs() # create the reduced model for NEURON simulation csimtree_ = createReducedNeuronModel(ctree) csimtree = csimtree_.__copy__(new_tree=BrancoReducedTree()) csimtree.setSynLocs(clocs) pl.figure('Branco', figsize=(5,5)) gs = GridSpec(2,2) ax0 = pl.subplot(gs[0,0]) ax_ = pl.subplot(gs[0,1]) ax1 = myAx(pl.subplot(gs[1,:])) # plot the full morphology locargs = [dict(marker='s', mec='k', mfc=cfl[0], ms=markersize)] locargs.extend([dict(marker='s', mec='k', mfc=cfl[1], ms=markersize) for ii in range(1,len(fit_locs))]) pnodes = [n for n in simtree if n.swc_type != 2] plotargs = {'lw': lwidth/1.3, 'c': 'DarkGrey'} simtree.plot2DMorphology(ax0, use_radius=False,node_arg=pnodes, plotargs=plotargs, marklocs=fit_locs, locargs=locargs, lims_margin=.01, textargs={'fontsize': ticksize}, labelargs={'fontsize': ticksize}) # plot a schematic of the reduced model labelargs = {0: {'marker': 's', 'mfc': cfl[0], 'mec': 'k', 'ms': markersize*1.2}} labelargs.update({ii: {'marker': 's', 'mfc': cfl[1], 'mec': 'k', 'ms': markersize*1.2} for ii in range(1,len(fit_locs))}) ctree.plotDendrogram(ax_, plotargs={'c':'k', 'lw': lwidth}, labelargs=labelargs) xlim, ylim = np.array(ax_.get_xlim()), np.array(ax_.get_ylim()) pp = np.array([np.mean(xlim), np.mean(ylim)]) dp = np.array([2.*np.abs(xlim[1]-xlim[0])/3.,0.]) ax_.annotate('Centrifugal', #xycoords='axes points', xy=pp, xytext=pp+dp, size=ticksize, rotation=90, ha='center', va='center') ax_.annotate('Centripetal', #xycoords='axes points', xy=pp, xytext=pp-dp, size=ticksize, rotation=90, ha='center', va='center') # plot voltage traces legend_handles = [] for ii, delta_t in enumerate(delta_ts): res_cp, res_cf = simtree.runSim(delta_t=delta_t) ax1.plot(res_cp['t'], res_cp['v_m'][0], c='DarkGrey', lw=lwidth) ax1.plot(res_cf['t'], res_cf['v_m'][0], c='DarkGrey', lw=lwidth) cres_cp, cres_cf = csimtree.runSim(delta_t=delta_t) line = ax1.plot(cres_cp['t'], cres_cp['v_m'][0], c=colours[ii%len(colours)], ls='--', lw=1.6*lwidth, label=r'$\Delta t = ' + '%.1f$ ms'%delta_t) ax1.plot(cres_cf['t'], cres_cf['v_m'][0], c=colours[ii%len(colours)], ls='-.', lw=1.6*lwidth) legend_handles.append(line[0]) legend_handles.append(mlines.Line2D([0,0],[0,0], ls='--', lw=1.6*lwidth, c='DarkGrey', label=r'centripetal')) legend_handles.append(mlines.Line2D([0,0],[0,0], ls='-.', lw=1.6*lwidth, c='DarkGrey', label=r'centrifugal')) drawScaleBars(ax1, r' ms', r' mV', b_offset=20, h_offset=15, v_offset=15) myLegend(ax1, loc='upper left', bbox_to_anchor=(.7,1.3), handles=legend_handles, fontsize=ticksize, handlelength=2.7) pl.tight_layout() pl.show()