def initialise_opengl(self): self.ellipsoid_proto = quadrics.proto_ellipsoid(slices=32, stacks=32) self.principal_ellipses_tex = \ quadrics.ellipsoid_principal_sections_texture(darkening=0.75, n_s=64, n_t=64) self.cylindre_proto = quadrics.proto_cylinder(slices=16) self.bond_material = gl_managed.material_model( ambient_front_colour=(0.2, ) * 3, diffuse_front_colour=(0.1, ) * 3) glEnable(GL_TEXTURE_2D) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
def initialise_opengl(self): glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_NORMAL_ARRAY) self.material = gl_managed.material_model( ambient_front_colour=(0, 0.25, 0, 1), ambient_back_colour=(0., 0.25, 0, 1), diffuse_front_colour=(0, 1, 0, 1), diffuse_back_colour=(0, 0.75, 0, 1), specular_front_colour=(0.5, 0, 0.5, 1), specular_focus=100) self.wire_colour = (0, 1, 0, 1)
def initialise_opengl(self): self.ellipsoid_proto = quadrics.proto_ellipsoid( slices=32, stacks=32) self.principal_ellipses_tex = \ quadrics.ellipsoid_principal_sections_texture(darkening=0.75, n_s=64, n_t=64) self.cylindre_proto = quadrics.proto_cylinder(slices=16) self.bond_material = gl_managed.material_model( ambient_front_colour=(0.2,)*3, diffuse_front_colour=(0.1,)*3) glEnable(GL_TEXTURE_2D) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
class xray_structure_viewer(qttbx.widget): material_for = ( [ ('Br', (0.97, 0.86, 0.03), (1, 0.5, 0)), ('C', (0.32, ) * 3, (0.75, ) * 3), ('N', (0, 0, 1), (0.37, 0.37, 0.63)), ('O', (0.91, 0, 0), (0.63, 0.37, 0.37)), ('F', (0, 1, 0), (0.07, 0.35, 0.07)), ('Al', (0, 0.5, 0.5), (0.37, 0.87, 0.87)), ('Si', (0.98, 0.42, 0.01), (0.62, 0.62, 0.37)), ('P', (0.5, 0, 0.5), (0.5, ) * 3), ('S', (0.97, 0.85, 0.03), (0.5, ) * 3), ('Cl', (0, 0.25, 0), (0.13, 0.65, 0.13)), ('Br', (0.51, 0, 0), (0.72, 0.53, 0.53)), ('I', (0.27, 0, 0.27), (0.87, 0.37, 0.87)), ] # Metals (1st row) + [(elt, (0, 0, 0.49), (0.37, 0.37, 0.62)) for elt in ('Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn')]) default_material = gl_managed.material_model( ambient_front_colour=(0.2, ) * 3, diffuse_front_colour=(0.1, ) * 3) material_for = dict([(elt, gl_managed.material_model(ambient_front_colour=a, diffuse_front_colour=b)) for (elt, a, b) in material_for]) covalent_bond_tolerance = 0.5 # Angstrom distance_cutoff = None bonding = "covalent" 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) def initialise_opengl(self): self.ellipsoid_proto = quadrics.proto_ellipsoid(slices=32, stacks=32) self.principal_ellipses_tex = \ quadrics.ellipsoid_principal_sections_texture(darkening=0.75, n_s=64, n_t=64) self.cylindre_proto = quadrics.proto_cylinder(slices=16) self.bond_material = gl_managed.material_model( ambient_front_colour=(0.2, ) * 3, diffuse_front_colour=(0.1, ) * 3) glEnable(GL_TEXTURE_2D) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) def draw_object_in_cartesian_coordinates(self): self.principal_ellipses_tex.bind() for element, transforms in six.iteritems( self.ellipsoid_to_sphere_transforms): material = self.material_for.get(element, self.default_material) material.execute() transforms.draw(self.ellipsoid_proto) self.principal_ellipses_tex.unbind() self.bond_material.execute() for i in range(0, len(self.bonds), 2): start, end = self.bonds[i], self.bonds[i + 1] self.cylindre_proto.draw(start, end, base_radius=0.05) if self.labels is not None: glPushAttrib(GL_LIGHTING_BIT) glDisable(GL_LIGHTING) glPushAttrib(GL_DEPTH_BUFFER_BIT) glDisable(GL_DEPTH_TEST) glColor3f(1, 1, 1) e = 0.1 for x, lbl in zip(self.sites_cart, self.labels): self.renderText(x[0] - e, x[1] + e, x[2] - e, lbl, self.label_font) glPopAttrib() glPopAttrib() def set_labels_type(self, kind): self.labels = getattr(self, str(kind).lower().replace(' ', '_'), None) self.updateGL() def set_font_size(self, s): self.label_font.setPointSize(s) self.updateGL()