Exemple #1
0
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)
Exemple #3
0
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)
Exemple #4
0
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)