This is a read-only mirror of pymolwiki.org
Difference between revisions of "User:Mglerner"
Line 118: | Line 118: | ||
f.close() | f.close() | ||
cmd.extend('togrp',togrp) | cmd.extend('togrp',togrp) | ||
+ | |||
+ | def rayy(width=-1,height=-1,units='in',dpi=-1,**kwargs): | ||
+ | """ | ||
+ | Slightly better version of the ray command. | ||
+ | You can specify width and height in the units of your choice, e.g. | ||
+ | |||
+ | rayy 3,2,units=in,dpi=300 | ||
+ | rayy 3in,2in | ||
+ | rayy 1in, 2 cm, dpi=600 | ||
+ | |||
+ | Extra keyword arguments get passed on to the normal ray command. | ||
+ | |||
+ | Units can be 'in' or 'cm'. | ||
+ | |||
+ | For backwards compatibility, the conversion to dpi (or dots per | ||
+ | centimeter) is only performed when dpi is specified. | ||
+ | """ | ||
+ | if type(dpi) in [type('')]: dpi = int(dpi) | ||
+ | in_per_cm = 0.393700787 | ||
+ | def todots(x,units,dpi): | ||
+ | if type(x) in [type('')]: | ||
+ | x = x.lower() | ||
+ | if 'in' in x: | ||
+ | units = 'in' | ||
+ | elif 'cm' in x: | ||
+ | units = 'cm' | ||
+ | x = float(x.replace(units,'').strip()) | ||
+ | if (dpi == -1): | ||
+ | return x | ||
+ | if units == 'cm': x = x * in_per_cm | ||
+ | elif units == 'in': pass | ||
+ | else: raise ValueError('Unknown units (%s)'%units) | ||
+ | print '%s%s at %sdpi'%(x,units,dpi) | ||
+ | return int(x * dpi) | ||
+ | # How do we get current width/height of viewport? MainSceneGetSize perhaps | ||
+ | # But it doesn't matter, as PyMOL will autoscale internally for us when given -1. | ||
+ | try: | ||
+ | width,height = todots(width,units,dpi),todots(height,units,dpi) | ||
+ | except ValueError: | ||
+ | print "Unknown units" | ||
+ | return | ||
+ | print 'width',width,'height',height | ||
+ | cmd.ray(width=width,height=height,**kwargs) | ||
+ | cmd.extend('rayy',rayy) | ||
+ | |||
</source> | </source> | ||
Revision as of 01:53, 22 January 2010
My name is Michael Lerner. I'm currently an IRTA postdoctoral fellow at NIH in the NHLBI's Laboratory of Computational Biology. Before that, I was a member of Heather Carlson's lab at the University of Michigan.
I wrote the PyMOL/APBS plugin.
-- Michael G. Lerner, PhD
m dot g dot lerner (_at-) gmail dot com
APBS Plugin FAQ
There is an issue with the freemol version of APBS shipped with PyMOL 1.2r2 for OS X.
Leopard and Snow Leopard (10.5 and 10.6)
There are three fairly easy ways to resolve it
1. Download and install the most recent (post Dec. 1 2009) version of APBS from [1]. Then copy the apbs binary into the freemol directory (mv it to /Applications/PyMOLX11Hybrid.app/pymol/freemol/bin/apbs.exe, overwriting the version that comes installed with PyMOL).
2. Download File:Libgfortran.3.dylib.bz2, unzip it ("bunzip2 libgfortran.3.dylib.gz2") and move it to /usr/local/lib ("mv libgfortran.3.dylib /usr/local/lib" ... on some machines, you may need "sudo mv libgfortran.3.dylib /usr/local/lib").
bunzip2 libgfortran.3.dylib.gz2
mv libgfortran.3.dylib /usr/local/lib
3. Use macports to install gcc 4.4.2 and link the appropriate library ("ln -s /opt/local/lib/gcc44/libgfortran.3.dylib /usr/local/lib/libgfortran.3.dylib" ... on some machines, you may need "sudo ln -s /opt/local/lib/gcc44/libgfortran.3.dylib /usr/local/lib/libgfortran.3.dylib").
ln -s /opt/local/lib/gcc44/libgfortran.3.dylib /usr/local/lib/libgfortran.3.dylib
sudo ln -s /opt/local/lib/gcc44/libgfortran.3.dylib /usr/local/lib/libgfortran.3.dylib
If you're curious, the problem is that APBS is dynamically linked, but Apple does not provide FORTRAN libraries.
The version of libgfortran above is covered by the GNU General Public License (GPL). A copy of the GPL may be found at [2], and the source may be obtained from MacPorts ([3]).
Tiger (10.4)
You'll need to install APBS yourself via MacPorts or via fink. Fink instructions may be found on the APBS page. Installation via MacPorts requires first installing MacPorts from [4] and then typing
sudo port install apbs
from the command line. This process could easily take several hours on an older machine, as MacPorts will recompile gcc, gfortran, and several other packages along the way.
My open-source toolchain
- PyMOL (visualization, system setup, etc)
- Python (all scripting/automation tasks)
- numpy (efficient numerical library)
- scipy (including traits for simple GUIs)
- matplotlib (2D plotting)
- GROMACS (simulations)
I also make significant use of CHARMM and Amber.
My ~/.pymolrc runs this .py script
#!/usr/bin/env python
from pymol import cmd,stored
cmd.set('pdb_retain_ids',1)
cmd.set('retain_order',1)
import os
def gro(fnm,name=None):
os.system("/usr/local/bin/editconf -f %s -o /tmp/tmp.pdb" % fnm)
print "Just did","/usr/local/bin/editconf -f %s -o /tmp/tmp.pdb" % fnm
if name is None:
name = fnm[:-4]
cmd.load("/tmp/tmp.pdb",name)
cmd.extend("gro",gro)
def splitseq(seq,size):
""" Split up seq in pieces of size """
return [seq[i:i+size] for i in range(0, len(seq), size)]
def getIDsInSel(sel, sorted=True, reversed=False):
"""
PARAMETERS
sel,
The selection, object or group to iterate over
sorted (boolean),
Should the list be sorted?
reversed (boolean)
Should the list be reversed before returned? (Combined
with the above, you can return a decreasing-sorted list
of names
RETURNS
list[] of strings, representing the object IDs desired.
CREDITS
This is a very slightly modified version of getNamesInSel
from http://pymolwiki.org/index.php/GetNamesInSel
"""
stored.tempNames = set()
cmd.iterate(sel, "stored.tempNames.add(ID)")
rList = list(stored.tempNames)
# if you want the list reversed or sorted,
# uncomment the following lines
if sorted:
rList.sort()
if reversed:
rList.reverse()
return rList
cmd.extend("getIDsInSel", getIDsInSel)
def togrp(selname,fname):
'''Make a GROMACS index group from a selection'''
f = file(fname,'w')
f.write('[ %s ]\n'%selname)
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281
idxs = getIDsInSel(selname)
for g in splitseq(idxs,15):
line = ' '.join(['%4s'%i for i in g])
line = line + '\n'
f.write(line)
f.write('\n')
f.close()
cmd.extend('togrp',togrp)
def rayy(width=-1,height=-1,units='in',dpi=-1,**kwargs):
"""
Slightly better version of the ray command.
You can specify width and height in the units of your choice, e.g.
rayy 3,2,units=in,dpi=300
rayy 3in,2in
rayy 1in, 2 cm, dpi=600
Extra keyword arguments get passed on to the normal ray command.
Units can be 'in' or 'cm'.
For backwards compatibility, the conversion to dpi (or dots per
centimeter) is only performed when dpi is specified.
"""
if type(dpi) in [type('')]: dpi = int(dpi)
in_per_cm = 0.393700787
def todots(x,units,dpi):
if type(x) in [type('')]:
x = x.lower()
if 'in' in x:
units = 'in'
elif 'cm' in x:
units = 'cm'
x = float(x.replace(units,'').strip())
if (dpi == -1):
return x
if units == 'cm': x = x * in_per_cm
elif units == 'in': pass
else: raise ValueError('Unknown units (%s)'%units)
print '%s%s at %sdpi'%(x,units,dpi)
return int(x * dpi)
# How do we get current width/height of viewport? MainSceneGetSize perhaps
# But it doesn't matter, as PyMOL will autoscale internally for us when given -1.
try:
width,height = todots(width,units,dpi),todots(height,units,dpi)
except ValueError:
print "Unknown units"
return
print 'width',width,'height',height
cmd.ray(width=width,height=height,**kwargs)
cmd.extend('rayy',rayy)
To Do
- Update the PyMOL/APBS plugin page
mglerner Tue Nov 17 14:46:42 EST 2009