User:Speleo3: Difference between revisions
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
No edit summary  | 
				No edit summary  | 
				||
| (7 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
My name is Thomas Holder and I   | My name is Thomas Holder and I worked on PyMOL for [https://www.schrodinger.com Schrödinger] 2012-2021.  | ||
I was awarded the [http://pymol.org/fellowship Warren L. DeLano Memorial PyMOL Open-Source Fellowship] for 2011-2012.  | I was awarded the [http://pymol.org/fellowship Warren L. DeLano Memorial PyMOL Open-Source Fellowship] for 2011-2012.  | ||
== Scripts written by me ==  | |||
* [[AAindex]]  | * [[AAindex]]  | ||
| Line 24: | Line 18: | ||
* [[Supercell]]  | * [[Supercell]]  | ||
== Scripts Pastebin ==  | |||
Some random scripts with no dedicated PyMOLWiki page.  | Some random scripts with no dedicated PyMOLWiki page.  | ||
| Line 30: | Line 24: | ||
Launch interactive python terminal with PyMOL process:  | Launch interactive python terminal with PyMOL process:  | ||
(see also [[Launching From a Script]])  | (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">  | <source lang="python">  | ||
| Line 51: | Line 61: | ||
pymol.finish_launching()  | pymol.finish_launching()  | ||
cmd = pymol.cmd  | cmd = pymol.cmd  | ||
</source>  | </source>  | ||
| Line 177: | Line 157: | ||
$MENCODER "$pattern" $MPEG1ARGS:vpass=2 -o "$outfile"  | $MENCODER "$pattern" $MPEG1ARGS:vpass=2 -o "$outfile"  | ||
</source>  | </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 16:55, 23 November 2021
My name is Thomas Holder and I worked on PyMOL for Schrödinger 2012-2021.
I was awarded the Warren L. DeLano Memorial PyMOL Open-Source Fellowship for 2011-2012.
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