def testGamma(self): """ The posterior of a gaussian scale mixture with gamma prior is a Student's t distribution, with parameters alpha and beta. Give enough samples, we shoud be able to estimate these parameters """ pdbfile = self.config.getTestFile('ake-xray-ensemble-ca.pdb') ensemble = LegacyStructureParser(pdbfile).parse_models() X = numpy.array(ensemble[0].get_coordinates(['CA'], True)) Y = numpy.array(ensemble[13].get_coordinates(['CA'], True)) mixture = ScaleMixture(scales=X.shape[0], prior=GammaPrior(), d=3) from csb.bio.utils import fit R, t = fit(X, Y) #numpy.random.seed(100) # gibbs sampling cycle for i in range(200): # apply rotation data = numpy.sum((X - numpy.dot(Y, numpy.transpose(R)) - t) ** 2, axis= -1) ** (1. / 2) # sample scales mixture.estimate(data) # sample rotations R, t = probabilistic_fit(X, Y, mixture.scales) self.assertEqual(mixture.scales.shape, (211,)) R_opt = numpy.eye(3) t_opt = numpy.zeros((3,)) for i in range(3): self.assertAlmostEqual(t[i], t_opt[i], delta=2.) for j in range(3): self.assertAlmostEqual(R_opt[i, j], R[i, j], delta=1e-1)
def xfit(mobile, target, mobile_state=-1, target_state=-1, load_b=0, cycles=10, match='align', guide=1, seed=0, quiet=1, bfit=0, distribution='student', _self=cmd): ''' DESCRIPTION Weighted superposition of the model in the first selection on to the model in the second selection. The weights are estimated with maximum likelihood. The result should be very similar to "theseus". Requires CSB, https://github.com/csb-toolbox/CSB ARGUMENTS mobile = string: atom selection target = string: atom selection mobile_state = int: object state of mobile selection {default: current} target_state = int: object state of target selection {default: current} load_b = 0 or 1: save -log(weights) into B-factor column {default: 0} SEE ALSO intra_xfit, align, super, fit, cealign, theseus ''' from numpy import asarray, identity, log, dot, zeros from csb.bio.utils import distance_sq, wfit, fit from . import querying cycles, quiet = int(cycles), int(quiet) mobile_state, target_state = int(mobile_state), int(target_state) mobile_obj = querying.get_object_name(mobile, 1) if mobile_state < 1: mobile_state = querying.get_object_state(mobile_obj) if target_state < 1: target_state = querying.get_selection_state(target) if int(guide): mobile = '(%s) and guide' % (mobile) target = '(%s) and guide' % (target) mm = MatchMaker(mobile, target, match) Y = asarray(querying.get_coords(mm.mobile, mobile_state)) X = asarray(querying.get_coords(mm.target, target_state)) if int(seed): R, t = identity(3), zeros(3) else: R, t = fit(X, Y) if int(bfit): # adapted from csb.apps.bfit from csb.bio.utils import distance, probabilistic_fit from csb.statistics.scalemixture import ScaleMixture mixture = ScaleMixture(scales=X.shape[0], prior=_bfit_get_prior(distribution), d=3) for _ in range(cycles): data = distance(Y, dot(X - t, R)) mixture.estimate(data) R, t = probabilistic_fit(X, Y, mixture.scales) scales = mixture.scales else: for _ in range(cycles): data = distance_sq(Y, dot(X - t, R)) scales = 1.0 / data.clip(1e-3) R, t = wfit(X, Y, scales) m = identity(4) m[0:3,0:3] = R m[0:3,3] = t cmd.transform_object(mobile_obj, list(m.flat)) if int(load_b): b_iter = iter(-log(scales)) cmd.alter(mm.mobile, 'b = next(b_iter)', space={'b_iter': b_iter, 'next': next}) if not quiet: print(' xfit: %d atoms aligned' % (len(X)))
def xfit(mobile, target, mobile_state=-1, target_state=-1, load_b=0, cycles=10, match='align', guide=1, seed=0, quiet=1, bfit=0, distribution='student', _self=cmd): ''' DESCRIPTION Weighted superposition of the model in the first selection on to the model in the second selection. The weights are estimated with maximum likelihood. The result should be very similar to "theseus". Requires CSB, https://github.com/csb-toolbox/CSB ARGUMENTS mobile = string: atom selection target = string: atom selection mobile_state = int: object state of mobile selection {default: current} target_state = int: object state of target selection {default: current} load_b = 0 or 1: save -log(weights) into B-factor column {default: 0} SEE ALSO intra_xfit, align, super, fit, cealign, theseus ''' from numpy import asarray, identity, log, dot, zeros from csb.bio.utils import distance_sq, wfit, fit from . import querying cycles, quiet = int(cycles), int(quiet) mobile_state, target_state = int(mobile_state), int(target_state) mobile_obj = querying.get_object_name(mobile, 1, _self=_self) if mobile_state < 1: mobile_state = querying.get_object_state(mobile_obj, _self=_self) if target_state < 1: target_state = querying.get_selection_state(target, _self=_self) if int(guide): mobile = '(%s) and guide' % (mobile) target = '(%s) and guide' % (target) mm = MatchMaker(mobile, target, match, _self=_self) Y = asarray(_self.get_coords(mm.mobile, mobile_state)) X = asarray(_self.get_coords(mm.target, target_state)) if int(seed): R, t = identity(3), zeros(3) else: R, t = fit(X, Y) if int(bfit): # adapted from csb.apps.bfit from csb.bio.utils import distance, probabilistic_fit from csb.statistics.scalemixture import ScaleMixture mixture = ScaleMixture(scales=X.shape[0], prior=_bfit_get_prior(distribution), d=3) for _ in range(cycles): data = distance(Y, dot(X - t, R)) mixture.estimate(data) R, t = probabilistic_fit(X, Y, mixture.scales) scales = mixture.scales else: for _ in range(cycles): data = distance_sq(Y, dot(X - t, R)) scales = 1.0 / data.clip(1e-3) R, t = wfit(X, Y, scales) m = identity(4) m[0:3,0:3] = R m[0:3,3] = t _self.transform_object(mobile_obj, list(m.flat)) if int(load_b): b_iter = iter(-log(scales)) _self.alter(mm.mobile, 'b = next(b_iter)', space={'b_iter': b_iter, 'next': next}) if not quiet: print(' xfit: %d atoms aligned' % (len(X)))