def testChannelFitMats(self): self.loadBall() cm = CompartmentFitter(self.tree) cm.setCTree([(1, .5)]) # check if reversals are correct for key in set(cm.ctree[0].currents) - {'L'}: assert np.abs(cm.ctree[0].currents[key][1] - \ self.tree[1].currents[key][1]) < 1e-10 # fit the passive model cm.fitPassive(use_all_channels=False) fit_mats_cm_na = cm.evalChannel('Na_Ta', parallel=False) fit_mats_cm_k = cm.evalChannel('Kv3_1', parallel=False) fit_mats_control_na, fit_mats_control_k = self.reduceExplicit() # test whether potassium fit matrices agree for fm_cm, fm_control in zip(fit_mats_cm_k, fit_mats_control_k): assert np.allclose(np.sum(fm_cm[0]), fm_control[0][0, 0]) # feature matrices assert np.allclose(fm_cm[1], fm_control[1]) # target vectors # test whether sodium fit matrices agree for fm_cm, fm_control in zip(fit_mats_cm_na[4:], fit_mats_control_na): assert np.allclose(np.sum(fm_cm[0]), fm_control[0][0, 0]) # feature matrices assert np.allclose(fm_cm[1], fm_control[1]) # target vectors
def testPassiveFit(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].real 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 compartment fitter cm = CompartmentFitter(self.tree) cm.setCTree(fit_locs) cm.fitPassive() cm.fitCapacitance() cm.fitEEq() # check whether both trees are the same self._checkPasCondProps(ctree, cm.ctree) self._checkPasCaProps(ctree, cm.ctree) self._checkEL(cm.ctree, -75.) # test whether all channels are used correctly for passive fit self.loadBall() fit_locs = [(1, .5)] # fit ball model with only leak greens_tree = self.tree.__copy__(new_tree=GreensTree()) greens_tree.channel_storage = {} for n in greens_tree: n.currents = {'L': n.currents['L']} greens_tree.setCompTree() freqs = np.array([0.]) greens_tree.setImpedance(freqs) z_mat = greens_tree.calcImpedanceMatrix(fit_locs)[0].real ctree_leak = greens_tree.createCompartmentTree(fit_locs) ctree_leak.computeGMC(z_mat) sov_tree = greens_tree.__copy__(new_tree=SOVTree()) sov_tree.calcSOVEquations() alphas, phimat = sov_tree.getImportantModes(locarg=fit_locs) ctree_leak.computeC(-alphas[0:1].real * 1e3, phimat[0:1, :].real) # make ball model with leak based on all channels tree = self.tree.__copy__() tree.asPassiveMembrane() greens_tree = tree.__copy__(new_tree=GreensTree()) greens_tree.setCompTree() freqs = np.array([0.]) greens_tree.setImpedance(freqs) z_mat = greens_tree.calcImpedanceMatrix(fit_locs)[0].real ctree_all = greens_tree.createCompartmentTree(fit_locs) ctree_all.computeGMC(z_mat) sov_tree = tree.__copy__(new_tree=SOVTree()) sov_tree.calcSOVEquations() alphas, phimat = sov_tree.getImportantModes(locarg=fit_locs) ctree_all.computeC(-alphas[0:1].real * 1e3, phimat[0:1, :].real) # new compartment fitter cm = CompartmentFitter(self.tree) cm.setCTree(fit_locs) # test fitting cm.fitPassive(use_all_channels=False) cm.fitCapacitance() cm.fitEEq() self._checkPasCondProps(ctree_leak, cm.ctree) self._checkPasCaProps(ctree_leak, cm.ctree) with pytest.raises(AssertionError): self._checkEL(cm.ctree, self.tree[1].currents['L'][1]) cm.fitPassive(use_all_channels=True) cm.fitCapacitance() cm.fitEEq() self._checkPasCondProps(ctree_all, cm.ctree) self._checkPasCaProps(ctree_all, cm.ctree) self._checkEL(cm.ctree, greens_tree[1].currents['L'][1]) with pytest.raises(AssertionError): self._checkEL(cm.ctree, self.tree[1].currents['L'][1]) with pytest.raises(AssertionError): self._checkPasCondProps(ctree_leak, ctree_all)