This is a read-only mirror of pymolwiki.org
Difference between revisions of "Spectrumbar"
m (25 revisions) |
|||
(7 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
+ | {{Infobox script-repo | ||
+ | |type = script | ||
+ | |filename = spectrumbar.py | ||
+ | |author = [[User:Slaw|Sean M. Law]] | ||
+ | |license = - | ||
+ | }} | ||
+ | |||
==Description== | ==Description== | ||
Line 10: | Line 17: | ||
<source lang="python"> | <source lang="python"> | ||
− | spectrumbar (RGB_Colors,radius=1.0,name=spectrumbar,head=(0.0,0.0,0.0),tail=(10.0,0.0,0.0),length=10.0) | + | spectrumbar (RGB_Colors,radius=1.0,name=spectrumbar,head=(0.0,0.0,0.0),tail=(10.0,0.0,0.0),length=10.0, ends=square) |
</source> | </source> | ||
Line 28: | Line 35: | ||
||[[Image:sb_radius.png|thumb|300px|left|Fig.6 - spectrum red,radius=2]] | ||[[Image:sb_radius.png|thumb|300px|left|Fig.6 - spectrum red,radius=2]] | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:sb_long_red_orange_long_yellow.png|thumb|300px|left|Fig 7 - spectrumbar red, red, red, orange, yellow, yellow]] |
+ | |[[Image:sb_rounded.png|thumb|300px|left|Fig 8 - spectrumbar red, radius=2, ends=rounded]] | ||
|} | |} | ||
Line 43: | Line 51: | ||
""" | """ | ||
− | Author Sean Law | + | Author Sean M. Law |
− | Michigan | + | University of Michigan |
− | + | seanlaw_(at)_umich_dot_edu | |
USAGE | USAGE | ||
Line 53: | Line 61: | ||
run spectrumbar.py | run spectrumbar.py | ||
− | spectrumbar (RGB_Colors,radius=1.0,name=spectrumbar,head=(0.0,0.0,0.0),tail=(10.0,0.0,0.0),length=10.0) | + | spectrumbar (RGB_Colors,radius=1.0,name=spectrumbar,head=(0.0,0.0,0.0),tail=(10.0,0.0,0.0),length=10.0, ends=square) |
Parameter Preset Type Description | Parameter Preset Type Description | ||
Line 64: | Line 72: | ||
tail (10.0,0.0,0.0) float Ending coordinate for spectrum bar | tail (10.0,0.0,0.0) float Ending coordinate for spectrum bar | ||
length 10.0 float Length of spectrum bar | length 10.0 float Length of spectrum bar | ||
+ | ends square string For rounded ends use ends=rounded | ||
Examples: | Examples: | ||
Line 80: | Line 89: | ||
name="spectrumbar" | name="spectrumbar" | ||
radius=1.0 | radius=1.0 | ||
+ | ends="square" | ||
x1=0 | x1=0 | ||
y1=0 | y1=0 | ||
Line 92: | Line 102: | ||
if (key == "radius"): | if (key == "radius"): | ||
radius = float(kwargs["radius"]) | radius = float(kwargs["radius"]) | ||
− | |||
elif (key == "name"): | elif (key == "name"): | ||
name=kwargs["name"] | name=kwargs["name"] | ||
Line 109: | Line 118: | ||
else: | else: | ||
x2=float(kwargs["length"]); | x2=float(kwargs["length"]); | ||
+ | elif (key == "ends"): | ||
+ | ends=kwargs["ends"] | ||
elif (key != "_self"): | elif (key != "_self"): | ||
print "Ignoring unknown option \""+key+"\"" | print "Ignoring unknown option \""+key+"\"" | ||
Line 119: | Line 130: | ||
while (len(args)>=1): | while (len(args)>=1): | ||
if (num.search(args[0]) and abc.search(args[0])): | if (num.search(args[0]) and abc.search(args[0])): | ||
− | + | if (str(cmd.get_color_tuple(args[0])) != "None"): | |
− | return | + | rgb.extend(cmd.get_color_tuple(args.pop(0))) |
+ | else: | ||
+ | return | ||
elif (num.search(args[0])): | elif (num.search(args[0])): | ||
− | rgb.extend(args.pop(0)) | + | rgb.extend([float(args.pop(0))]) |
+ | elif (abc.search(args[0])): | ||
+ | if (str(cmd.get_color_tuple(args[0])) != "None"): | ||
+ | rgb.extend(cmd.get_color_tuple(args.pop(0))) | ||
+ | else: | ||
+ | return | ||
else: | else: | ||
− | + | print "Error: Unrecognized color format \""+args[0]+"\"" | |
+ | return | ||
if (len(rgb) % 3): | if (len(rgb) % 3): | ||
Line 134: | Line 153: | ||
dy=y2-y1 | dy=y2-y1 | ||
dz=z2-z1 | dz=z2-z1 | ||
− | + | if (len(rgb) == 3): | |
+ | rgb.extend([rgb[0]]) | ||
+ | rgb.extend([rgb[1]]) | ||
+ | rgb.extend([rgb[2]]) | ||
t=1.0/(len(rgb)/3.0-1) | t=1.0/(len(rgb)/3.0-1) | ||
c=len(rgb)/3-1 | c=len(rgb)/3-1 | ||
s=0 | s=0 | ||
bar=[] | bar=[] | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
while (s < c): | while (s < c): | ||
if (len(rgb) >0): | if (len(rgb) >0): | ||
Line 149: | Line 167: | ||
g=rgb.pop(0) | g=rgb.pop(0) | ||
b=rgb.pop(0) | b=rgb.pop(0) | ||
+ | if (s == 0 and ends == "rounded"): | ||
+ | bar.extend([COLOR, float(r), float(g), float(b), SPHERE, x1+(s*t)*dx, y1+(s*t)*dy, z1+(s*t)*dz, radius]) | ||
bar.extend([CYLINDER]) | bar.extend([CYLINDER]) | ||
bar.extend([x1+(s*t)*dx, y1+(s*t)*dy, z1+(s*t)*dz]) | bar.extend([x1+(s*t)*dx, y1+(s*t)*dy, z1+(s*t)*dz]) | ||
Line 155: | Line 175: | ||
if (len(rgb) >= 3): | if (len(rgb) >= 3): | ||
bar.extend([float(rgb[0]), float(rgb[1]), float(rgb[2])]) | bar.extend([float(rgb[0]), float(rgb[1]), float(rgb[2])]) | ||
+ | r=rgb[0] | ||
+ | g=rgb[1] | ||
+ | b=rgb[2] | ||
else: | else: | ||
bar.extend([float(r), float(g), float(b)]) | bar.extend([float(r), float(g), float(b)]) | ||
+ | if (s == c-1 and ends == "rounded"): | ||
+ | bar.extend([COLOR, float(r), float(g), float(b), SPHERE, x1+(s+1)*t*dx, y1+(s+1)*t*dy, z1+(s+1)*t*dz, radius]) | ||
s=s+1 | s=s+1 | ||
Line 165: | Line 190: | ||
return | return | ||
cmd.extend("spectrumbar",spectrumbar) | cmd.extend("spectrumbar",spectrumbar) | ||
− | |||
</source> | </source> | ||
[[Category:Script_Library]] | [[Category:Script_Library]] | ||
[[Category:UI_Scripts]] | [[Category:UI_Scripts]] |
Latest revision as of 01:44, 28 March 2014
Type | Python Script |
---|---|
Download | spectrumbar.py |
Author(s) | Sean M. Law |
License | - |
This code has been put under version control in the project Pymol-script-repo |
Description
Often times one may color their structure based upon some predefined color spectrum. However, this alone is not helpful when dealing with publication images. The purpose of this script is to allow the user to draw their own custom spectrum bar to accompany their structural images.
Further work will be done to improve the functionality of this script. Please feel free to contact the author for function requests.
USAGE
load the script using the run command
spectrumbar (RGB_Colors,radius=1.0,name=spectrumbar,head=(0.0,0.0,0.0),tail=(10.0,0.0,0.0),length=10.0, ends=square)
Please see the script comments for further custom options. Once the script completes, it will generate a new object called "spectrumbar" (which can be changed through the options) which is a cylinder colored according to the user-specified colors.
Note: It is strongly recommended to turn off the specular reflections before ray tracing
EXAMPLES
Script
load the script using the run command
from pymol.cgo import *
from math import *
from pymol import cmd
from re import *
def spectrumbar (*args, **kwargs):
"""
Author Sean M. Law
University of Michigan
seanlaw_(at)_umich_dot_edu
USAGE
While in PyMOL
run spectrumbar.py
spectrumbar (RGB_Colors,radius=1.0,name=spectrumbar,head=(0.0,0.0,0.0),tail=(10.0,0.0,0.0),length=10.0, ends=square)
Parameter Preset Type Description
RGB_Colors [1.0,1.0,1.0] N/A RGB colors can be specified as a
triplet RGB value or as PyMOL
internal color name (i.e. red)
radius 1.0 float Radius of cylindrical spectrum bar
name spectrumbar string CGO object name for spectrum bar
head (0.0,0.0,0.0) float Starting coordinate for spectrum bar
tail (10.0,0.0,0.0) float Ending coordinate for spectrum bar
length 10.0 float Length of spectrum bar
ends square string For rounded ends use ends=rounded
Examples:
spectrumbar red, green, blue
spectrumbar 1.0,0.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0
The above two examples produce the same spectrumbar!
spectrumbar radius=5.0
spectrumbar length=20.0
"""
rgb=[1.0, 1.0, 1.0]
name="spectrumbar"
radius=1.0
ends="square"
x1=0
y1=0
z1=0
x2=10
y2=0
z2=0
num=re.compile('[0-9]')
abc=re.compile('[a-z]')
for key in kwargs:
if (key == "radius"):
radius = float(kwargs["radius"])
elif (key == "name"):
name=kwargs["name"]
elif (key == "head"):
head=kwargs["head"]
head=head.strip('" []()')
x1,y1,z1=map(float,head.split(','))
elif (key == "tail"):
tail=kwargs["tail"]
tail=tail.strip('" []()')
x2,y2,z2=map(float,tail.split(','))
elif (key == "length"):
if (abc.search(kwargs["length"])):
print "Error: The length must be a value"
return
else:
x2=float(kwargs["length"]);
elif (key == "ends"):
ends=kwargs["ends"]
elif (key != "_self"):
print "Ignoring unknown option \""+key+"\""
else:
continue
args=list(args)
if (len(args)>=1):
rgb=[]
while (len(args)>=1):
if (num.search(args[0]) and abc.search(args[0])):
if (str(cmd.get_color_tuple(args[0])) != "None"):
rgb.extend(cmd.get_color_tuple(args.pop(0)))
else:
return
elif (num.search(args[0])):
rgb.extend([float(args.pop(0))])
elif (abc.search(args[0])):
if (str(cmd.get_color_tuple(args[0])) != "None"):
rgb.extend(cmd.get_color_tuple(args.pop(0)))
else:
return
else:
print "Error: Unrecognized color format \""+args[0]+"\""
return
if (len(rgb) % 3):
print "Error: Missing RGB value"
print "Please double check RGB values"
return
dx=x2-x1
dy=y2-y1
dz=z2-z1
if (len(rgb) == 3):
rgb.extend([rgb[0]])
rgb.extend([rgb[1]])
rgb.extend([rgb[2]])
t=1.0/(len(rgb)/3.0-1)
c=len(rgb)/3-1
s=0
bar=[]
while (s < c):
if (len(rgb) >0):
r=rgb.pop(0)
g=rgb.pop(0)
b=rgb.pop(0)
if (s == 0 and ends == "rounded"):
bar.extend([COLOR, float(r), float(g), float(b), SPHERE, x1+(s*t)*dx, y1+(s*t)*dy, z1+(s*t)*dz, radius])
bar.extend([CYLINDER])
bar.extend([x1+(s*t)*dx, y1+(s*t)*dy, z1+(s*t)*dz])
bar.extend([x1+(s+1)*t*dx, y1+(s+1)*t*dy, z1+(s+1)*t*dz])
bar.extend([radius, float(r), float(g), float(b)])
if (len(rgb) >= 3):
bar.extend([float(rgb[0]), float(rgb[1]), float(rgb[2])])
r=rgb[0]
g=rgb[1]
b=rgb[2]
else:
bar.extend([float(r), float(g), float(b)])
if (s == c-1 and ends == "rounded"):
bar.extend([COLOR, float(r), float(g), float(b), SPHERE, x1+(s+1)*t*dx, y1+(s+1)*t*dy, z1+(s+1)*t*dz, radius])
s=s+1
cmd.delete(name)
cmd.load_cgo(bar,name)
return
cmd.extend("spectrumbar",spectrumbar)