This is a read-only mirror of pymolwiki.org
Difference between revisions of "User:Speleo3"
Jump to navigation
Jump to search
(my scripts) |
m (1 revision) |
||
(30 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | My name is Thomas Holder and I | + | My name is Thomas Holder and I work for PyMOL at [http://schrodinger.com Schrödinger]. |
− | + | I was awarded the [http://pymol.org/fellowship Warren L. DeLano Memorial PyMOL Open-Source Fellowship] for 2011-2012. | |
+ | |||
+ | == Contact == | ||
* speleo3/users.sourceforge.net | * speleo3/users.sourceforge.net | ||
− | * thomas.holder/ | + | * thomas.holder/schrodinger.com |
− | + | == Scripts written by me == | |
* [[AAindex]] | * [[AAindex]] | ||
* [[AngleBetweenHelices]] | * [[AngleBetweenHelices]] | ||
+ | * [[Extra fit]] | ||
+ | * [[PluginDirectory]] | ||
+ | * [[Pml2py]] | ||
+ | * [[Polarpairs]] | ||
+ | * [[Save settings]] | ||
+ | * [[Show bumps]] | ||
* [[Sidechaincenters]] | * [[Sidechaincenters]] | ||
* [[Spectrumany]] | * [[Spectrumany]] | ||
+ | * [[Spectrum states]] | ||
* [[Supercell]] | * [[Supercell]] | ||
+ | |||
+ | == Scripts Pastebin == | ||
+ | |||
+ | Some random scripts with no dedicated PyMOLWiki page. | ||
+ | |||
+ | Launch interactive python terminal with PyMOL process: | ||
+ | (see also [[Launching From a Script]]) | ||
+ | |||
+ | <source lang="python"> | ||
+ | #!/usr/bin/ipython2.7 -i | ||
+ | |||
+ | import threading | ||
+ | import pymol._cmd | ||
+ | |||
+ | pymol.invocation.parse_args(['pymol', '-qc']) | ||
+ | |||
+ | with threading.RLock(): | ||
+ | _COb = pymol._cmd._new(pymol, pymol.invocation.options) | ||
+ | pymol._cmd._start(_COb, pymol.cmd) | ||
+ | pymol.cmd._COb = _COb | ||
+ | |||
+ | from pymol import cmd | ||
+ | </source> | ||
+ | |||
+ | <source lang="python"> | ||
+ | #!/usr/bin/python2.6 -i | ||
+ | |||
+ | import sys, os | ||
+ | |||
+ | # autocompletion | ||
+ | import readline | ||
+ | import rlcompleter | ||
+ | readline.parse_and_bind('tab: complete') | ||
+ | |||
+ | # pymol environment | ||
+ | moddir='/opt/pymol-svn/modules' | ||
+ | sys.path.insert(0, moddir) | ||
+ | os.putenv('PYMOL_PATH', os.path.join(moddir, 'pymol/pymol_path')) | ||
+ | |||
+ | # pymol launching | ||
+ | import pymol | ||
+ | pymol.pymol_argv = ['pymol','-qc'] + sys.argv[1:] | ||
+ | pymol.finish_launching() | ||
+ | cmd = pymol.cmd | ||
+ | </source> | ||
+ | |||
+ | Build FREEMOL (see also [[MovieSchool 6]]) | ||
+ | |||
+ | <source lang="bash"> | ||
+ | #!/bin/bash -e | ||
+ | |||
+ | src=/tmp | ||
+ | prefix=/opt/pymol-git | ||
+ | export FREEMOL=$prefix/freemol | ||
+ | |||
+ | freemoltrunk=$src/freemol-trunk | ||
+ | if [[ ! -e $freemoltrunk ]]; then | ||
+ | svn co svn://bioinformatics.org/svnroot/freemol/trunk $freemoltrunk | ||
+ | fi | ||
+ | |||
+ | cd $freemoltrunk | ||
+ | |||
+ | sed -i 's/vdwtype\[11\]/vdwtype[14]/' src/mengine/src/field.h | ||
+ | |||
+ | for name in mpeg_encode mengine apbs pdb2pqr; do | ||
+ | (cd src/$name && ./configure && make && make install) | ||
+ | done | ||
+ | |||
+ | cp -na freemol/libpy/freemol $prefix/modules/ | ||
+ | |||
+ | ln -sfT $FREEMOL $prefix/modules/pymol/pymol_path/freemol | ||
+ | </source> | ||
+ | |||
+ | Download all PyMOL scripts from Robert L. Campbell's website: | ||
+ | |||
+ | <source lang="bash"> | ||
+ | wget -r -np -nd --level=1 -A .py \ | ||
+ | http://pldserver1.biochem.queensu.ca/~rlc/work/pymol/ | ||
+ | </source> | ||
+ | |||
+ | Render movie from PNG files (save as <code>png2mpeg1.sh</code>): | ||
+ | |||
+ | <source lang="bash"> | ||
+ | #!/bin/bash | ||
+ | |||
+ | set -e | ||
+ | |||
+ | usage="usage: $(basename $0) [-w width] [-f fps] [-b vbitrate] <indir> <outfile.mpeg>" | ||
+ | width="" | ||
+ | fps=25 | ||
+ | vbitrate=16000 | ||
+ | |||
+ | args="$(getopt w:f:b:h "$@")" || args="-h" | ||
+ | set -- $args | ||
+ | |||
+ | while [[ $# > 0 ]]; do | ||
+ | case "$1" in | ||
+ | --) shift; break ;; | ||
+ | -w) width=$2; shift 2 ;; | ||
+ | -f) fps=$2; shift 2 ;; | ||
+ | -b) vbitrate=$2; shift 2 ;; | ||
+ | -h) echo $usage; exit 1 ;; | ||
+ | *) echo "argument error: $1"; exit 1 ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | if [[ $# > 2 ]]; then | ||
+ | echo "too many arguments: $3 ..." | ||
+ | echo $usage | ||
+ | exit 1 | ||
+ | fi | ||
+ | |||
+ | indir="$1" | ||
+ | outfile="$2" | ||
+ | |||
+ | if [[ -z "$indir" ]]; then | ||
+ | echo "error: indir missing" | ||
+ | echo $usage | ||
+ | exit 2 | ||
+ | fi | ||
+ | |||
+ | if [[ -z "$outfile" ]]; then | ||
+ | echo "error: outfile missing" | ||
+ | echo $usage | ||
+ | exit 3 | ||
+ | fi | ||
+ | |||
+ | MENCODER="mencoder -quiet" | ||
+ | MPEG1ARGS="-mf type=png:fps=$fps -ovc lavc -forceidx -noskip \ | ||
+ | -of rawvideo -mpegopts format=mpeg1 \ | ||
+ | -lavcopts vcodec=mpeg1video:vbitrate=$vbitrate:vhq:trell:keyint=25" | ||
+ | |||
+ | if [[ -n "$width" ]]; then | ||
+ | MPEG1ARGS="-zoom -xy $width -sws 9 $MPEG1ARGS" | ||
+ | fi | ||
+ | |||
+ | pattern="mf://$indir/*.png" | ||
+ | $MENCODER "$pattern" $MPEG1ARGS:vpass=1 -o /dev/null | ||
+ | $MENCODER "$pattern" $MPEG1ARGS:vpass=2 -o "$outfile" | ||
+ | </source> | ||
+ | |||
+ | === Export movie with transparent background === | ||
+ | |||
+ | <source lang="python"> | ||
+ | # make transparent pngs | ||
+ | set opaque_background, off | ||
+ | set ray_trace_frames | ||
+ | mpng foo | ||
+ | |||
+ | # create movie file (use codec "qtrle" or "png") | ||
+ | system ffmpeg -i foo%04d.png -vcodec qtrle foo.mov | ||
+ | |||
+ | # clean up | ||
+ | system rm -f foo????.png | ||
+ | </source> | ||
+ | |||
+ | === load_mtz_cctbx: Load MTZ files with a [[CCTBX]] wrapper (3 files) === | ||
+ | |||
+ | 1) ~/bin/mtz2ccp4.sh | ||
+ | |||
+ | <source lang="bash"> | ||
+ | #!/bin/bash | ||
+ | export PATH=/opt/ccp4/ccp4-6.5/bin:$PATH | ||
+ | exec cctbx.python ~/bin/mtz2ccp4.py "$@" | ||
+ | </source> | ||
+ | |||
+ | 2) ~/bin/mtz2ccp4.py | ||
+ | |||
+ | <source lang="python"> | ||
+ | #!/opt/ccp4/ccp4-6.5/bin/cctbx.python | ||
+ | |||
+ | import os | ||
+ | import sys | ||
+ | import tempfile | ||
+ | |||
+ | def mtz2ccp4maps(filename, prefix='map'): | ||
+ | ''' | ||
+ | Creates a temporary directory and dumps all maps from the given MTZ file | ||
+ | into this directory as CCP4 maps files. Returns the path of the temporary | ||
+ | directory. | ||
+ | ''' | ||
+ | from iotbx.reflection_file_reader import any_reflection_file | ||
+ | |||
+ | hkl_in = any_reflection_file(file_name=filename) | ||
+ | |||
+ | temp_dir = tempfile.mkdtemp() | ||
+ | |||
+ | for i_map, array in enumerate(hkl_in.as_miller_arrays()): | ||
+ | if array.is_complex_array(): | ||
+ | fft_map = array.fft_map(resolution_factor=0.25).apply_sigma_scaling() | ||
+ | map_filename = os.path.join(temp_dir, | ||
+ | prefix + '_' + '_'.join(array.info().labels) + '.ccp4') | ||
+ | fft_map.as_ccp4_map(file_name=map_filename) | ||
+ | |||
+ | return temp_dir | ||
+ | |||
+ | # print the name of the temporary directory to standard output | ||
+ | print mtz2ccp4maps(*sys.argv[1:]) | ||
+ | </source> | ||
+ | |||
+ | 3) ~/.pymolrc.py | ||
+ | |||
+ | <source lang="python"> | ||
+ | @cmd.extend | ||
+ | def load_mtz_cctbx(filename, prefix=''): | ||
+ | ''' | ||
+ | DESCRIPTION | ||
+ | |||
+ | Load all maps from an MTZ file, using the mtz2ccp4.sh wrapper which | ||
+ | uses iotbx (cctbx). | ||
+ | ''' | ||
+ | import subprocess | ||
+ | import glob | ||
+ | import shutil | ||
+ | |||
+ | if not prefix: | ||
+ | prefix = os.path.basename(filename).rpartition('.')[0] | ||
+ | |||
+ | outdir = subprocess.Popen([os.path.expanduser('~/bin/mtz2ccp4.sh'), | ||
+ | filename, prefix], stdout=subprocess.PIPE).stdout.readlines()[0].strip() | ||
+ | |||
+ | for mapfilename in glob.glob(os.path.join(outdir, '*.ccp4')): | ||
+ | cmd.load(mapfilename) | ||
+ | |||
+ | shutil.rmtree(outdir) | ||
+ | </source> | ||
+ | |||
+ | === ccmutate === | ||
+ | |||
+ | <source lang="python"> | ||
+ | @cmd.extend | ||
+ | def ccmutate(code, selection='??sele|?pk1', sculpt=1): | ||
+ | ''' | ||
+ | DESCRIPTION | ||
+ | |||
+ | Mutate selected residue. | ||
+ | |||
+ | ARGUMENTS | ||
+ | |||
+ | code = str: 3-letter PDBeChem chemical component identifier | ||
+ | |||
+ | selection = str: single residue selection {default: pk1 or sele} | ||
+ | |||
+ | sculpt = 0/1: try to adopt conformation of replaced sidechain, followed | ||
+ | by relaxation using sculpting {default: 1} | ||
+ | |||
+ | EXAMPLE | ||
+ | |||
+ | fetch 1ubq, async=0 | ||
+ | ccmutate 0HG, resi 24 | ||
+ | |||
+ | SEE ALSO | ||
+ | |||
+ | fetch ..., type=cc | ||
+ | wizard mutagenesis | ||
+ | ''' | ||
+ | code = code.upper() | ||
+ | |||
+ | tmp_sele = cmd.get_unused_name('_sele') | ||
+ | tmp_frag = cmd.get_unused_name('_frag') | ||
+ | tmp_Nnbr = cmd.get_unused_name('_Nnbr') | ||
+ | tmp_back = cmd.get_unused_name('_back') | ||
+ | tmp_tmpl = cmd.get_unused_name('_tmpl') | ||
+ | tmp_sc_o = cmd.get_unused_name('_sc_o') | ||
+ | tmp_sc_n = cmd.get_unused_name('_sc_n') | ||
+ | |||
+ | try: | ||
+ | cmd.select(tmp_sele, 'byres (' + selection + ')', 0) | ||
+ | |||
+ | # check input selection | ||
+ | if cmd.count_atoms('name CA & ?' + tmp_sele) != 1: | ||
+ | raise pymol.CmdException('selection must include exactly one residue') | ||
+ | if cmd.count_atoms('name N+CA+C & ?' + tmp_sele) != 3: | ||
+ | raise pymol.CmdException("selected residue doesn't have N+CA+C atoms") | ||
+ | |||
+ | # PDBeChem fragment | ||
+ | cmd.fetch(code, tmp_frag, type='cc', zoom=0) | ||
+ | |||
+ | # check if fragment is amino acid | ||
+ | if cmd.count_atoms('name N+CA+C & ?' + tmp_frag) != 3: | ||
+ | raise pymol.CmdException("residue '%s' doesn't have N+CA+C atoms" % (code)) | ||
+ | |||
+ | # only keep hydrogens if target also has hydrogens | ||
+ | if cmd.count_atoms('hydro & ?' + tmp_sele) == 0: | ||
+ | cmd.remove('hydro & ?' + tmp_frag) | ||
+ | |||
+ | # update residue name for old residue | ||
+ | cmd.alter(tmp_sele, 'resn = ' + repr(code)) | ||
+ | |||
+ | # superpose fragment on backbone | ||
+ | cmd.align( | ||
+ | 'name N+CA+C & ?' + tmp_frag, | ||
+ | 'name N+CA+C & ?' + tmp_sele) | ||
+ | |||
+ | # extra N bonds, like in PRO | ||
+ | cmd.select(tmp_Nnbr, 'neighbor (name N & ?' + tmp_frag + ')', 0) | ||
+ | |||
+ | # backbone selection | ||
+ | cmd.select(tmp_back, 'name CA+C+O+N+OXT', 0) | ||
+ | cmd.select(tmp_back, 'hydro & neighbor ?' + tmp_back, 0, merge=1) | ||
+ | |||
+ | # remove complementary atoms | ||
+ | cmd.remove( '?' + tmp_frag + ' & ' + tmp_back) | ||
+ | cmd.extract(tmp_tmpl, '?' + tmp_sele + ' & !' + tmp_back, zoom=0) | ||
+ | |||
+ | if cmd.count_atoms(tmp_frag): | ||
+ | # attach new sidechain | ||
+ | cmd.fuse('name CB & ?' + tmp_frag, 'name CA & ?' + tmp_sele, mode=1, move=0) | ||
+ | cmd.unpick() | ||
+ | |||
+ | # new atom selections | ||
+ | cmd.select(tmp_sc_n, '(byres ?' + tmp_sele + ') & !?' + tmp_sele, 0) | ||
+ | cmd.select(tmp_sc_o, '?' + tmp_sc_n + ' like ?' + tmp_tmpl, 0) | ||
+ | |||
+ | # extra N bonds, like in PRO | ||
+ | if cmd.count_atoms(tmp_Nnbr): | ||
+ | cmd.bond('?' + tmp_sc_n + ' like ?' + tmp_Nnbr, 'name N & ?' + tmp_sele) | ||
+ | |||
+ | # adopt old conformation, if possible | ||
+ | if int(sculpt): | ||
+ | model = cmd.get_object_list('?' + tmp_sele)[0] | ||
+ | cmd.protect(model) | ||
+ | cmd.deprotect('?' + tmp_sc_n + ' & !?' + tmp_sc_o) | ||
+ | cmd.sculpt_activate(model) | ||
+ | if cmd.count_atoms(tmp_sc_o): | ||
+ | cmd.update(tmp_sc_o, tmp_tmpl) | ||
+ | cmd.set('sculpt_field_mask', 63) # local geom + vdw | ||
+ | cmd.sculpt_iterate(model, cycles=100) | ||
+ | cmd.deprotect(tmp_sc_o) | ||
+ | cmd.set('sculpt_field_mask', 0xff) # all | ||
+ | cmd.sculpt_iterate(model, cycles=200) | ||
+ | cmd.set('sculpt_field_mask', 31) # local geom | ||
+ | cmd.sculpt_iterate(model, cycles=200) | ||
+ | |||
+ | finally: | ||
+ | cmd.delete(tmp_sele) | ||
+ | cmd.delete(tmp_frag) | ||
+ | cmd.delete(tmp_Nnbr) | ||
+ | cmd.delete(tmp_back) | ||
+ | cmd.delete(tmp_tmpl) | ||
+ | cmd.delete(tmp_sc_o) | ||
+ | cmd.delete(tmp_sc_n) | ||
+ | </source> | ||
+ | |||
+ | === CTRL-L ligand zoom === | ||
+ | |||
+ | <source lang="python"> | ||
+ | @cmd.set_key('CTRL-L') | ||
+ | def ligand_zoom(): | ||
+ | global _current_ligand | ||
+ | s = {'ligand_set': set()} | ||
+ | if cmd.iterate('organic', 'ligand_set.add((model,segi,chain,resi))', | ||
+ | space=s) < 1: | ||
+ | return | ||
+ | ligands = sorted(s["ligand_set"]) | ||
+ | try: | ||
+ | i = ligands.index(_current_ligand) | ||
+ | except (ValueError, NameError): | ||
+ | i = -1 | ||
+ | i = (i + 1) % len(ligands) | ||
+ | _current_ligand = ligands[i] | ||
+ | # use "do" for feedback | ||
+ | cmd.do('zoom /%s/%s/%s & resi %s, animate=1, buffer=2' % ligands[i]) | ||
+ | </source> | ||
+ | |||
+ | === Compile on FreeBSD === | ||
+ | |||
+ | pkg upgrade | ||
+ | pkg install subversion py27-Pmw glew freeglut png freetype2 libxml2 msgpack | ||
+ | python2 setup.py install --prefix=$HOME/opt/pymol-svn |
Latest revision as of 04:03, 8 January 2018
My name is Thomas Holder and I work for PyMOL at Schrödinger.
I was awarded the Warren L. DeLano Memorial PyMOL Open-Source Fellowship for 2011-2012.
Contact
- speleo3/users.sourceforge.net
- thomas.holder/schrodinger.com
Scripts written by me
- AAindex
- AngleBetweenHelices
- Extra fit
- PluginDirectory
- Pml2py
- Polarpairs
- Save settings
- Show bumps
- Sidechaincenters
- Spectrumany
- Spectrum states
- Supercell
Scripts Pastebin
Some random scripts with no dedicated PyMOLWiki page.
Launch interactive python terminal with PyMOL process: (see also Launching From a Script)
#!/usr/bin/ipython2.7 -i
import threading
import pymol._cmd
pymol.invocation.parse_args(['pymol', '-qc'])
with threading.RLock():
_COb = pymol._cmd._new(pymol, pymol.invocation.options)
pymol._cmd._start(_COb, pymol.cmd)
pymol.cmd._COb = _COb
from pymol import cmd
#!/usr/bin/python2.6 -i
import sys, os
# autocompletion
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
# pymol environment
moddir='/opt/pymol-svn/modules'
sys.path.insert(0, moddir)
os.putenv('PYMOL_PATH', os.path.join(moddir, 'pymol/pymol_path'))
# pymol launching
import pymol
pymol.pymol_argv = ['pymol','-qc'] + sys.argv[1:]
pymol.finish_launching()
cmd = pymol.cmd
Build FREEMOL (see also MovieSchool 6)
#!/bin/bash -e
src=/tmp
prefix=/opt/pymol-git
export FREEMOL=$prefix/freemol
freemoltrunk=$src/freemol-trunk
if [[ ! -e $freemoltrunk ]]; then
svn co svn://bioinformatics.org/svnroot/freemol/trunk $freemoltrunk
fi
cd $freemoltrunk
sed -i 's/vdwtype\[11\]/vdwtype[14]/' src/mengine/src/field.h
for name in mpeg_encode mengine apbs pdb2pqr; do
(cd src/$name && ./configure && make && make install)
done
cp -na freemol/libpy/freemol $prefix/modules/
ln -sfT $FREEMOL $prefix/modules/pymol/pymol_path/freemol
Download all PyMOL scripts from Robert L. Campbell's website:
wget -r -np -nd --level=1 -A .py \
http://pldserver1.biochem.queensu.ca/~rlc/work/pymol/
Render movie from PNG files (save as png2mpeg1.sh
):
#!/bin/bash
set -e
usage="usage: $(basename $0) [-w width] [-f fps] [-b vbitrate] <indir> <outfile.mpeg>"
width=""
fps=25
vbitrate=16000
args="$(getopt w:f:b:h "$@")" || args="-h"
set -- $args
while [[ $# > 0 ]]; do
case "$1" in
--) shift; break ;;
-w) width=$2; shift 2 ;;
-f) fps=$2; shift 2 ;;
-b) vbitrate=$2; shift 2 ;;
-h) echo $usage; exit 1 ;;
*) echo "argument error: $1"; exit 1 ;;
esac
done
if [[ $# > 2 ]]; then
echo "too many arguments: $3 ..."
echo $usage
exit 1
fi
indir="$1"
outfile="$2"
if [[ -z "$indir" ]]; then
echo "error: indir missing"
echo $usage
exit 2
fi
if [[ -z "$outfile" ]]; then
echo "error: outfile missing"
echo $usage
exit 3
fi
MENCODER="mencoder -quiet"
MPEG1ARGS="-mf type=png:fps=$fps -ovc lavc -forceidx -noskip \
-of rawvideo -mpegopts format=mpeg1 \
-lavcopts vcodec=mpeg1video:vbitrate=$vbitrate:vhq:trell:keyint=25"
if [[ -n "$width" ]]; then
MPEG1ARGS="-zoom -xy $width -sws 9 $MPEG1ARGS"
fi
pattern="mf://$indir/*.png"
$MENCODER "$pattern" $MPEG1ARGS:vpass=1 -o /dev/null
$MENCODER "$pattern" $MPEG1ARGS:vpass=2 -o "$outfile"
Export movie with transparent background
# make transparent pngs
set opaque_background, off
set ray_trace_frames
mpng foo
# create movie file (use codec "qtrle" or "png")
system ffmpeg -i foo%04d.png -vcodec qtrle foo.mov
# clean up
system rm -f foo????.png
load_mtz_cctbx: Load MTZ files with a CCTBX wrapper (3 files)
1) ~/bin/mtz2ccp4.sh
#!/bin/bash
export PATH=/opt/ccp4/ccp4-6.5/bin:$PATH
exec cctbx.python ~/bin/mtz2ccp4.py "$@"
2) ~/bin/mtz2ccp4.py
#!/opt/ccp4/ccp4-6.5/bin/cctbx.python
import os
import sys
import tempfile
def mtz2ccp4maps(filename, prefix='map'):
'''
Creates a temporary directory and dumps all maps from the given MTZ file
into this directory as CCP4 maps files. Returns the path of the temporary
directory.
'''
from iotbx.reflection_file_reader import any_reflection_file
hkl_in = any_reflection_file(file_name=filename)
temp_dir = tempfile.mkdtemp()
for i_map, array in enumerate(hkl_in.as_miller_arrays()):
if array.is_complex_array():
fft_map = array.fft_map(resolution_factor=0.25).apply_sigma_scaling()
map_filename = os.path.join(temp_dir,
prefix + '_' + '_'.join(array.info().labels) + '.ccp4')
fft_map.as_ccp4_map(file_name=map_filename)
return temp_dir
# print the name of the temporary directory to standard output
print mtz2ccp4maps(*sys.argv[1:])
3) ~/.pymolrc.py
@cmd.extend
def load_mtz_cctbx(filename, prefix=''):
'''
DESCRIPTION
Load all maps from an MTZ file, using the mtz2ccp4.sh wrapper which
uses iotbx (cctbx).
'''
import subprocess
import glob
import shutil
if not prefix:
prefix = os.path.basename(filename).rpartition('.')[0]
outdir = subprocess.Popen([os.path.expanduser('~/bin/mtz2ccp4.sh'),
filename, prefix], stdout=subprocess.PIPE).stdout.readlines()[0].strip()
for mapfilename in glob.glob(os.path.join(outdir, '*.ccp4')):
cmd.load(mapfilename)
shutil.rmtree(outdir)
ccmutate
@cmd.extend
def ccmutate(code, selection='??sele|?pk1', sculpt=1):
'''
DESCRIPTION
Mutate selected residue.
ARGUMENTS
code = str: 3-letter PDBeChem chemical component identifier
selection = str: single residue selection {default: pk1 or sele}
sculpt = 0/1: try to adopt conformation of replaced sidechain, followed
by relaxation using sculpting {default: 1}
EXAMPLE
fetch 1ubq, async=0
ccmutate 0HG, resi 24
SEE ALSO
fetch ..., type=cc
wizard mutagenesis
'''
code = code.upper()
tmp_sele = cmd.get_unused_name('_sele')
tmp_frag = cmd.get_unused_name('_frag')
tmp_Nnbr = cmd.get_unused_name('_Nnbr')
tmp_back = cmd.get_unused_name('_back')
tmp_tmpl = cmd.get_unused_name('_tmpl')
tmp_sc_o = cmd.get_unused_name('_sc_o')
tmp_sc_n = cmd.get_unused_name('_sc_n')
try:
cmd.select(tmp_sele, 'byres (' + selection + ')', 0)
# check input selection
if cmd.count_atoms('name CA & ?' + tmp_sele) != 1:
raise pymol.CmdException('selection must include exactly one residue')
if cmd.count_atoms('name N+CA+C & ?' + tmp_sele) != 3:
raise pymol.CmdException("selected residue doesn't have N+CA+C atoms")
# PDBeChem fragment
cmd.fetch(code, tmp_frag, type='cc', zoom=0)
# check if fragment is amino acid
if cmd.count_atoms('name N+CA+C & ?' + tmp_frag) != 3:
raise pymol.CmdException("residue '%s' doesn't have N+CA+C atoms" % (code))
# only keep hydrogens if target also has hydrogens
if cmd.count_atoms('hydro & ?' + tmp_sele) == 0:
cmd.remove('hydro & ?' + tmp_frag)
# update residue name for old residue
cmd.alter(tmp_sele, 'resn = ' + repr(code))
# superpose fragment on backbone
cmd.align(
'name N+CA+C & ?' + tmp_frag,
'name N+CA+C & ?' + tmp_sele)
# extra N bonds, like in PRO
cmd.select(tmp_Nnbr, 'neighbor (name N & ?' + tmp_frag + ')', 0)
# backbone selection
cmd.select(tmp_back, 'name CA+C+O+N+OXT', 0)
cmd.select(tmp_back, 'hydro & neighbor ?' + tmp_back, 0, merge=1)
# remove complementary atoms
cmd.remove( '?' + tmp_frag + ' & ' + tmp_back)
cmd.extract(tmp_tmpl, '?' + tmp_sele + ' & !' + tmp_back, zoom=0)
if cmd.count_atoms(tmp_frag):
# attach new sidechain
cmd.fuse('name CB & ?' + tmp_frag, 'name CA & ?' + tmp_sele, mode=1, move=0)
cmd.unpick()
# new atom selections
cmd.select(tmp_sc_n, '(byres ?' + tmp_sele + ') & !?' + tmp_sele, 0)
cmd.select(tmp_sc_o, '?' + tmp_sc_n + ' like ?' + tmp_tmpl, 0)
# extra N bonds, like in PRO
if cmd.count_atoms(tmp_Nnbr):
cmd.bond('?' + tmp_sc_n + ' like ?' + tmp_Nnbr, 'name N & ?' + tmp_sele)
# adopt old conformation, if possible
if int(sculpt):
model = cmd.get_object_list('?' + tmp_sele)[0]
cmd.protect(model)
cmd.deprotect('?' + tmp_sc_n + ' & !?' + tmp_sc_o)
cmd.sculpt_activate(model)
if cmd.count_atoms(tmp_sc_o):
cmd.update(tmp_sc_o, tmp_tmpl)
cmd.set('sculpt_field_mask', 63) # local geom + vdw
cmd.sculpt_iterate(model, cycles=100)
cmd.deprotect(tmp_sc_o)
cmd.set('sculpt_field_mask', 0xff) # all
cmd.sculpt_iterate(model, cycles=200)
cmd.set('sculpt_field_mask', 31) # local geom
cmd.sculpt_iterate(model, cycles=200)
finally:
cmd.delete(tmp_sele)
cmd.delete(tmp_frag)
cmd.delete(tmp_Nnbr)
cmd.delete(tmp_back)
cmd.delete(tmp_tmpl)
cmd.delete(tmp_sc_o)
cmd.delete(tmp_sc_n)
CTRL-L ligand zoom
@cmd.set_key('CTRL-L')
def ligand_zoom():
global _current_ligand
s = {'ligand_set': set()}
if cmd.iterate('organic', 'ligand_set.add((model,segi,chain,resi))',
space=s) < 1:
return
ligands = sorted(s["ligand_set"])
try:
i = ligands.index(_current_ligand)
except (ValueError, NameError):
i = -1
i = (i + 1) % len(ligands)
_current_ligand = ligands[i]
# use "do" for feedback
cmd.do('zoom /%s/%s/%s & resi %s, animate=1, buffer=2' % ligands[i])
Compile on FreeBSD
pkg upgrade pkg install subversion py27-Pmw glew freeglut png freetype2 libxml2 msgpack python2 setup.py install --prefix=$HOME/opt/pymol-svn