def exercise_ellipsoid(n_trials=100, n_sub_trials=10): from gltbx import quadrics rnd = random.Random(0) for i in range(n_trials): centre = matrix.col([rnd.random() for k in range(3)]) half_lengths = matrix.col([0.1 + rnd.random() for k in range(3)]) r = scitbx.math.euler_angles_as_matrix( [rnd.uniform(0, 360) for i in range(3)], deg=True) metrics = r * matrix.diag([x**2 for x in half_lengths]) * r.transpose() t = quadrics.ellipsoid_to_sphere_transform(centre, metrics.as_sym_mat3()) assert approx_equal(t.translation_part(), centre) m = matrix.sqr(t.linear_part()) assert m.determinant() > 0 for j in range(n_sub_trials): y = matrix.col([rnd.random() for k in range(3)]) c_y = y.transpose() * y x = m * y c_x = x.transpose() * metrics.inverse() * x assert approx_equal(c_x, c_y) r = scitbx.math.euler_angles_as_matrix((30, 115, 260), deg=True) centre = matrix.col((-1, 2, 3)) metrics = r * matrix.diag((-1, 0.1, 1)) * r.transpose() t = quadrics.ellipsoid_to_sphere_transform(centre, metrics.as_sym_mat3()) assert t.non_positive_definite() x = r * matrix.col((1, 0, 0)) assert x.transpose() * metrics.inverse() * x > 0
def exercise_ellipsoid(n_trials=100, n_sub_trials=10): from gltbx import quadrics rnd = random.Random(0) for i in xrange(n_trials): centre = matrix.col([ rnd.random() for k in xrange(3) ]) half_lengths = matrix.col([ 0.1 + rnd.random() for k in xrange(3) ]) r = scitbx.math.euler_angles_as_matrix( [ rnd.uniform(0, 360) for i in xrange(3) ], deg=True) metrics = r * matrix.diag([ x**2 for x in half_lengths ]) * r.transpose() t = quadrics.ellipsoid_to_sphere_transform(centre, metrics.as_sym_mat3()) assert approx_equal(t.translation_part(), centre) m = matrix.sqr(t.linear_part()) assert m.determinant() > 0 for j in xrange(n_sub_trials): y = matrix.col([ rnd.random() for k in xrange(3) ]) c_y = y.transpose() * y x = m*y c_x = x.transpose() * metrics.inverse() * x assert approx_equal(c_x, c_y) r = scitbx.math.euler_angles_as_matrix((30, 115, 260), deg=True) centre = matrix.col((-1, 2, 3)) metrics = r * matrix.diag((-1, 0.1, 1)) * r.transpose() t = quadrics.ellipsoid_to_sphere_transform(centre, metrics.as_sym_mat3()) assert t.non_positive_definite() x = r * matrix.col((1,0,0)) assert x.transpose() * metrics.inverse() * x > 0
def __init__(self, xray_structure, name='??', **kwds): super(xray_structure_viewer, self).__init__( unit_cell=xray_structure.unit_cell(), orthographic=True, light_position=(-1, 1, 1, 0), **kwds) assert self.bonding in ("covalent", "all") assert self.bonding != "all" or self.distance_cutoff is not None self.xray_structure = xs = xray_structure self.setWindowTitle("%s in %s" % (name, xs.space_group().type().hall_symbol())) sites_frac = xs.sites_frac() self.set_extent(sites_frac.min(), sites_frac.max()) self.is_unit_cell_shown = False sites_cart = self.sites_cart = xs.sites_cart() thermal_tensors = xs.extract_u_cart_plus_u_iso() self.ellipsoid_to_sphere_transforms = {} self.scatterer_indices = flex.std_string() self.scatterer_labels = flex.std_string() for i, (sc, site, u_cart) in enumerate(itertools.izip(xs.scatterers(), sites_cart, thermal_tensors)): t = quadrics.ellipsoid_to_sphere_transform(site, u_cart) self.ellipsoid_to_sphere_transforms.setdefault( sc.element_symbol(), quadrics.shared_ellipsoid_to_sphere_transforms()).append(t) self.scatterer_indices.append("# %i" % i) self.scatterer_labels.append(sc.label) self.labels = None self.label_font = QtGui.QFont("Arial Black", pointSize=18) if self.bonding == "covalent": radii = [ covalent_radii.table(elt).radius() for elt in xs.scattering_type_registry().type_index_pairs_as_dict() ] buffer_thickness = 2*max(radii) + self.covalent_bond_tolerance asu_mappings = xs.asu_mappings(buffer_thickness=buffer_thickness) bond_table = crystal.pair_asu_table(asu_mappings) bond_table.add_covalent_pairs(xs.scattering_types(), tolerance=self.covalent_bond_tolerance) elif self.bonding == "all": asu_mappings = xs.asu_mappings(buffer_thickness=self.distance_cutoff) bond_table = crystal.pair_asu_table(asu_mappings) bond_table.add_all_pairs(self.distance_cutoff) pair_sym_table = bond_table.extract_pair_sym_table( all_interactions_from_inside_asu=True) self.bonds = flex.vec3_double() self.bonds.reserve(len(xs.scatterers())) uc = self.xray_structure.unit_cell() frac = mat.rec(uc.fractionalization_matrix(), (3,3)) inv_frac = frac.inverse() site_symms = xs.site_symmetry_table() scatt = self.xray_structure.scatterers() for i, neighbours in enumerate(pair_sym_table): x0 = sites_cart[i] sc0 = scatt[i] for j, ops in neighbours.items(): sc1 = scatt[j] if sc0.scattering_type == 'H' and sc1.scattering_type == 'H': continue for op in ops: if op.is_unit_mx(): x1 = sites_cart[j] else: x1 = uc.orthogonalize(op*sites_frac[j]) op_cart = inv_frac*mat.rec(op.r().as_double(), (3,3))*frac u1 = (op_cart *mat.sym(sym_mat3=thermal_tensors[j]) *op_cart.transpose()) t = quadrics.ellipsoid_to_sphere_transform(x1, u1.as_sym_mat3()) self.ellipsoid_to_sphere_transforms[sc1.element_symbol()].append(t) self.sites_cart.append(x1) op_lbl = (" [%s]" % op).lower() self.scatterer_indices.append("# %i%s" % (j, op_lbl)) self.scatterer_labels.append("%s%s" % (sc1.label, op_lbl)) self.bonds.append(x0) self.bonds.append(x1)
def __init__(self, xray_structure, name='??', **kwds): super(xray_structure_viewer, self).__init__(unit_cell=xray_structure.unit_cell(), orthographic=True, light_position=(-1, 1, 1, 0), **kwds) assert self.bonding in ("covalent", "all") assert self.bonding != "all" or self.distance_cutoff is not None self.xray_structure = xs = xray_structure self.setWindowTitle("%s in %s" % (name, xs.space_group().type().hall_symbol())) sites_frac = xs.sites_frac() self.set_extent(sites_frac.min(), sites_frac.max()) self.is_unit_cell_shown = False sites_cart = self.sites_cart = xs.sites_cart() thermal_tensors = xs.extract_u_cart_plus_u_iso() self.ellipsoid_to_sphere_transforms = {} self.scatterer_indices = flex.std_string() self.scatterer_labels = flex.std_string() for i, (sc, site, u_cart) in enumerate( zip(xs.scatterers(), sites_cart, thermal_tensors)): t = quadrics.ellipsoid_to_sphere_transform(site, u_cart) self.ellipsoid_to_sphere_transforms.setdefault( sc.element_symbol(), quadrics.shared_ellipsoid_to_sphere_transforms()).append(t) self.scatterer_indices.append("# %i" % i) self.scatterer_labels.append(sc.label) self.labels = None self.label_font = QtGui.QFont("Arial Black", pointSize=18) if self.bonding == "covalent": radii = [ covalent_radii.table(elt).radius() for elt in xs.scattering_type_registry().type_index_pairs_as_dict() ] buffer_thickness = 2 * max(radii) + self.covalent_bond_tolerance asu_mappings = xs.asu_mappings(buffer_thickness=buffer_thickness) bond_table = crystal.pair_asu_table(asu_mappings) bond_table.add_covalent_pairs( xs.scattering_types(), tolerance=self.covalent_bond_tolerance) elif self.bonding == "all": asu_mappings = xs.asu_mappings( buffer_thickness=self.distance_cutoff) bond_table = crystal.pair_asu_table(asu_mappings) bond_table.add_all_pairs(self.distance_cutoff) pair_sym_table = bond_table.extract_pair_sym_table( all_interactions_from_inside_asu=True) self.bonds = flex.vec3_double() self.bonds.reserve(len(xs.scatterers())) uc = self.xray_structure.unit_cell() frac = mat.rec(uc.fractionalization_matrix(), (3, 3)) inv_frac = frac.inverse() site_symms = xs.site_symmetry_table() scatt = self.xray_structure.scatterers() for i, neighbours in enumerate(pair_sym_table): x0 = sites_cart[i] sc0 = scatt[i] for j, ops in neighbours.items(): sc1 = scatt[j] if sc0.scattering_type == 'H' and sc1.scattering_type == 'H': continue for op in ops: if op.is_unit_mx(): x1 = sites_cart[j] else: x1 = uc.orthogonalize(op * sites_frac[j]) op_cart = inv_frac * mat.rec(op.r().as_double(), (3, 3)) * frac u1 = (op_cart * mat.sym(sym_mat3=thermal_tensors[j]) * op_cart.transpose()) t = quadrics.ellipsoid_to_sphere_transform( x1, u1.as_sym_mat3()) self.ellipsoid_to_sphere_transforms[ sc1.element_symbol()].append(t) self.sites_cart.append(x1) op_lbl = (" [%s]" % op).lower() self.scatterer_indices.append("# %i%s" % (j, op_lbl)) self.scatterer_labels.append("%s%s" % (sc1.label, op_lbl)) self.bonds.append(x0) self.bonds.append(x1)