def symexpcell(prefix='mate', object=None, a=0, b=0, c=0): """ DESCRIPTION Creates all symmetry-related objects for the specified object that occur with their bounding box center within the unit cell. USAGE symexpcell prefix, object, [a, b, c] ARGUMENTS prefix = string: prefix of new objects object = string: object for which to create symmetry mates a, b, c = integer: create neighboring cell {default: 0,0,0} SEE ALSO symexp, http://www.pymolwiki.org/index.php/SuperSym """ if object is None: object = cmd.get_object_list()[0] sym = cmd.get_symmetry(object) cell_edges = sym[0:3] cell_angles = sym[3:6] spacegroup = sym[6] basis = cellbasis(cell_angles, cell_edges) basis = numpy.matrix(basis) extent = cmd.get_extent(object) center = sum(numpy.array(extent)) * 0.5 center = numpy.matrix(center.tolist() + [1.0]).T center_cell = basis.I * center extra_shift = [[float(i)] for i in (a,b,c)] i = 0 matrices = xray.sg_sym_to_mat_list(spacegroup) for mat in matrices: i += 1 mat = numpy.matrix(mat) shift = numpy.floor(mat * center_cell) mat[0:3,3] -= shift[0:3,0] mat[0:3,3] += extra_shift mat = basis * mat * basis.I mat_list = list(mat.flat) name = '%s%d' % (prefix, i) cmd.create(name, object) cmd.transform_object(name, mat_list, 0) cmd.color(i+1, name)
def symexpcell(prefix='mate', object=None, a=0, b=0, c=0): ''' DESCRIPTION Creates all symmetry-related objects for the specified object that occur with their bounding box center within the unit cell. USAGE symexpcell prefix, object, [a, b, c] ARGUMENTS prefix = string: prefix of new objects object = string: object for which to create symmetry mates a, b, c = integer: create neighboring cell {default: 0,0,0} SEE ALSO symexp, http://www.pymolwiki.org/index.php/SuperSym ''' if object is None: object = cmd.get_object_list()[0] sym = cmd.get_symmetry(object) cell_edges = sym[0:3] cell_angles = sym[3:6] spacegroup = sym[6] basis = cellbasis(cell_angles, cell_edges) basis = numpy.matrix(basis) extent = cmd.get_extent(object) center = sum(numpy.array(extent)) * 0.5 center = numpy.matrix(center.tolist() + [1.0]).T center_cell = basis.I * center extra_shift = [[float(i)] for i in (a,b,c)] i = 0 matrices = xray.sg_sym_to_mat_list(spacegroup) for mat in matrices: i += 1 mat = numpy.matrix(mat) shift = numpy.floor(mat * center_cell) mat[0:3,3] -= shift[0:3,0] mat[0:3,3] += extra_shift mat = basis * mat * basis.I mat_list = list(mat.flat) name = '%s%d' % (prefix, i) cmd.create(name, object) cmd.transform_object(name, mat_list) cmd.color(i+1, name)
def symexpcell(prefix='mate', object=None, a=0, b=0, c=0,transformation=None,cutoff=None): ''' DESCRIPTION Creates all symmetry-related objects for the specified object that occur with their bounding box center within the unit cell. USAGE symexpcell prefix, object, [a, b, c] ARGUMENTS prefix = string: prefix of new objects object = string: object for which to create symmetry mates a, b, c = integer: create neighboring cell {default: 0,0,0} transformation = list: list of 16 floats giving the transformation matrix to apply to the generated symmetry mates {default: identity matrix} cutoff = int: restrict symmetry mates to within cutoff angstroms of the origin. Use 0 to generate all symmetry mates. {default: 0} SEE ALSO symexp, http://www.pymolwiki.org/index.php/SuperSym ''' #print "symexpcell %s,%s,%d,%d,%d,%s"%(prefix,object,int(a),int(b),int(c),transformation) if object is None: object = cmd.get_object_list()[0] if cutoff is not None: cutoff = int(cutoff) if cutoff <= 0: cutoff = None sym = cmd.get_symmetry(object) cell_edges = sym[0:3] cell_angles = sym[3:6] spacegroup = sym[6] basis = cellbasis(cell_angles, cell_edges) extent = cmd.get_extent(object) center = sum(numpy.array(extent)) * 0.5 center = numpy.append(center,1.0).reshape(4,1) center_cell = numpy.linalg.inv(basis) * center extra_shift = numpy.array([[float(i)] for i in (a,b,c)]) origin = numpy.array([[0,0,0,1]]).T if transformation is not None: transmat = transformation_to_numpy(transformation) #print "%s\n*\n%s\n=\n%s\n" % (origin,transmat, # numpy.dot(numpy.linalg.inv(transmat),origin) ) origin = numpy.dot(numpy.linalg.inv(transmat),origin) i = 0 matrices = xray.sg_sym_to_mat_list(spacegroup) for mat in matrices: i += 1 mat = numpy.array(mat) shift = numpy.floor(numpy.dot(mat, center_cell)) mat[0:3,3] -= shift[0:3,0] mat[0:3,3] += extra_shift[0:3,0] mat = numpy.dot(numpy.dot(basis, mat), numpy.linalg.inv(basis) ) mat_list = list(mat.flat) new_center = numpy.dot(mat,center) #print "%s\n* (%d)\n%s\n=\n%s\n" % (center,i,mat, new_center) if cutoff is not None: dist = new_center - origin dist = numpy.dot(dist.T,dist) if dist > cutoff**2: #print "Skipping %d%d%d_%d at distance %f" % (a,b,c,i,sqrt(dist)) continue name = '%s%d' % (prefix, i) cmd.create(name, object) cmd.transform_object(name, mat_list) # Apply extra transformation afterwards if transformation is not None: cmd.transform_object(name, transformation) cmd.color(i+1, name)
def symexpcell(prefix='mate', object=None, a=0, b=0, c=0, *, _self=cmd): ''' DESCRIPTION Creates all symmetry-related objects for the specified object that occur with their bounding box center within the unit cell. USAGE symexpcell prefix, object, [a, b, c] ARGUMENTS prefix = string: prefix of new objects object = string: object for which to create symmetry mates a, b, c = integer: create neighboring cell {default: 0,0,0} SEE ALSO symexp ''' import numpy from pymol import xray if object is None: object = _self.get_object_list()[0] sym = _self.get_symmetry(object) cell_edges = sym[0:3] cell_angles = sym[3:6] spacegroup = sym[6] basis = cellbasis(cell_angles, cell_edges) basis = numpy.matrix(basis) extent = _self.get_extent(object) center = sum(numpy.array(extent)) * 0.5 center = numpy.matrix(center.tolist() + [1.0]).T center_cell = basis.I * center spacegroup = xray.space_group_map.get(spacegroup, spacegroup) i = 0 matrices = xray.sg_sym_to_mat_list(spacegroup) for mat in matrices: i += 1 mat = numpy.matrix(mat) shift = -numpy.floor(numpy.array(mat * center_cell)[0:3, 0]) shift = shift.flatten().astype(int) shift += [a, b, c] mat[0:3, 3] += shift.reshape((3, 1)) mat = basis * mat * basis.I mat_list = list(mat.flat) name = '%s%d' % (prefix, i) _self.create(name, object) _self.transform_object(name, mat_list, 0) _self.set_title(name, 1, "{}_{}{}{}".format(i, *(shift + 5).tolist())) if len(matrices) > 1: _self.color(i + 1, name)