Supercell: Difference between revisions

From PyMOLWiki
Jump to navigation Jump to search
(link to mailing list)
(remove code)
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
= Overview =
{{Infobox psico
|module    = psico.xtal
}}


Can display multiple copies of the unit cell.
[[File:SupercellExample.png|200px|thumb|right|Example with 2 unit cells in c-direction, created with: supercell 1,1,2,2x19]]
 
'''supercell''' can display multiple copies of the unit cell.
Can also fill the unit cell (and its copies) with symmetry mates.


See [http://sourceforge.net/mailarchive/forum.php?thread_name=l2vdcf611bd1004140816zeca28714mf76b9f72008099ab%40mail.gmail.com&forum_name=pymol-users thread on pymol-users mailing list].
See [http://sourceforge.net/mailarchive/forum.php?thread_name=l2vdcf611bd1004140816zeca28714mf76b9f72008099ab%40mail.gmail.com&forum_name=pymol-users thread on pymol-users mailing list].


= Example =
Requires [http://numpy.scipy.org numpy].
 
== Example ==


<source lang="python">
<source lang="python">
run supercell.py
# import psico.xtal, or run the standalone script:
run https://raw.githubusercontent.com/speleo3/pymol-psico/master/psico/xtal.py
 
fetch 2x19, async=0
fetch 2x19, async=0
supercell 2,1,1, 2x19, green
supercell 2,1,1, 2x19, green
Line 14: Line 23:
</source>
</source>


= The Code =
== See Also ==


<source lang="python">
* [[SuperSym]]
'''
* [[symexp]]
(c) 2010 Thomas Holder


PyMOL python script (load with `run supercell.py`)
[[Category:Script_Library]]
Usage: See "help supercell"
[[Category:Math_Scripts]]
'''
 
from pymol import cmd, cgo
from math import cos, sin, radians, sqrt
import numpy
 
def cellbasis(angles, edges):
'''
For the unit cell with given angles and edge lengths calculate the basis
transformation (vectors) as a 4x4 numpy.array
'''
rad = [radians(i) for i in angles]
basis = numpy.identity(4)
basis[0][1] = cos(rad[2])
basis[1][1] = sin(rad[2])
basis[0][2] = cos(rad[1])
basis[1][2] = (cos(rad[0]) - basis[0][1]*basis[0][2])/basis[1][1]
basis[2][2] = sqrt(1 - basis[0][2]**2 - basis[1][2]**2)
edges.append(1.0)
return basis * edges # numpy.array multiplication!
 
def supercell(a=1, b=1, c=1, object=None, color='blue', name='supercell'):
'''
DESCRIPTION
 
    Draw a supercell, as requested by Nicolas Bock on the pymol-users
    mailing list (Subject: [PyMOL] feature request: supercell construction
    Date: 04/12/2010 10:12:17 PM (Mon, 12 Apr 2010 14:12:17 -0600))
 
USAGE
 
    supercell a, b, c [, object [, color [, name]]]
 
ARGUMENTS
 
    a, b, c = integer: repeat cell in x,y,z direction a,b,c times
    {default: 1,1,1}
 
    object = string: name of object to take cell definition from
 
    color = string: color of cell {default: blue}
 
    name = string: name of the cgo object to create {default: supercell}
 
SEE ALSO
 
    show cell
 
'''
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]
 
basis = cellbasis(cell_angles, cell_edges)
assert isinstance(basis, numpy.ndarray)
 
ts = list()
for i in range(int(a)):
for j in range(int(b)):
for k in range(int(c)):
ts.append([i,j,k])
 
obj = [
cgo.BEGIN,
cgo.LINES,
cgo.COLOR,
]
obj.extend(cmd.get_color_tuple(color))
for t in ts:
shift = basis[0:3,0:3] * t
shift = shift[:,0] + shift[:,1] + shift[:,2]
for i in range(3):
vi = basis[0:3,i]
vj = [
numpy.array([0.,0.,0.]),
basis[0:3,(i+1)%3],
basis[0:3,(i+2)%3],
basis[0:3,(i+1)%3] + basis[0:3,(i+2)%3]
]
for j in range(4):
obj.append(cgo.VERTEX)
obj.extend((shift + vj[j]).tolist())
obj.append(cgo.VERTEX)
obj.extend((shift + vj[j] + vi).tolist())
 
cmd.delete(name)
cmd.load_cgo(obj, name)
 
cmd.extend('supercell', supercell)
</source>

Latest revision as of 03:24, 1 July 2020

Included in psico
This command or function is available from psico, which is a PyMOL extension.

Module psico.xtal
Example with 2 unit cells in c-direction, created with: supercell 1,1,2,2x19

supercell can display multiple copies of the unit cell. Can also fill the unit cell (and its copies) with symmetry mates.

See thread on pymol-users mailing list.

Requires numpy.

Example

# import psico.xtal, or run the standalone script:
run https://raw.githubusercontent.com/speleo3/pymol-psico/master/psico/xtal.py

fetch 2x19, async=0
supercell 2,1,1, 2x19, green
supercell 1,1,2, 2x19, orange, name=super2

See Also