Helicity check

From PyMOLWiki
Revision as of 10:44, 31 July 2007 by Inchoate (talk | contribs)
Jump to navigation Jump to search

helicity_check shows the evolution of O -- N distances over an amino acid sequence

See for further info:

Protein Sci ROHL and DOIG 5 (8) 1687

"Models for the 3(10)-helix/coil, pi-helix/coil, and alpha-helix/3(10)-helix/coil transitions in isolated peptides."

uses:

  • in the pymol console:
 >run pymol_helicity_check.py
   ----> select some consecutive amino acids
          - this is nicely done with the Display->Sequence tool
 >helicity_check()
  • installing helicity_check
 copy pymol_helicity_check.py in $PYMOL_INSTALL_DIR/modules/pmg_tk/startup
 launch Pymol: you now have a new option in the Plugin menu

helicity_check uses gnuplot (http://www.gnuplot.info) to display its results. As a consequence gnuplot needs to be installed.

This plugin was tested on linux only, it might need some modifications to run on other OSes. (hints: launching gnuplot and path to dumpfile)


# pymol_helicity_check.py
# Copyright (c) 2006-2007 Julien Lefeuvre <lefeuvrejulien@yahoo.fr>
#

"""
Pymol plugin for checking helicity type

helicity_check() takes as input a selection ('sele' by default)
of at least 5 amino acids and computes the distances between
O(i) - N(i+3)
O(i) - N(i+4)
O(i) - N(i+5)
See for further info:
Protein Sci ROHL and DOIG 5 (8) 1687
'Models for the 3(10)-helix/coil, pi-helix/coil,
and alpha-helix/3(10)-helix/coil transitions in isolated peptides.'

uses:
*in the pymol console:
  >run pymol_helicity_check.py
    ----> select some consecutive amino acids
           - this is nicely done with the Display->Sequence tool
  >helicity_check()
*installing helicity_check
  copy pymol_helicity_check.py in $PYMOL_INSTALL_DIR/modules/pmg_tk/startup
  launch Pymol: you now have a new option in the Plugin menu

helicity_check uses gnuplot (http://www.gnuplot.info) to display its results
As a consequence gnuplot needs to be installed.

This plugin was tested on linux only, it my need some modifications to run on
other OSes (hints: launching gnuplot and path to dumpfile)
"""

__author__ =    "Julien Lefeuvre <lefeuvrejulien@yahoo.fr>"
__version__ =   "1.0"
__date__ =      "2007-04-02"
__copyright__ = "Copyright (c) 2007 %s. All rights reserved." % __author__
__licence__ =   "BSD"

from pymol import cmd
from math import sqrt
import sys
import os
import subprocess
import time

def __init__(self):
    """init function in order to have a nice menu option in Pymol"""
    self.menuBar.addmenuitem('Plugin', 'command', 'Helicity Check',
             label='Helicity Check', command = lambda: helicity_check())


class Residue(object):

    def __init__(self):
        self.name=None
        self.index=None
        self.Ocoord=None
        self.Ncoord=None


def calc_distON(Ocoord,Ncoord):
    """return the distance between 2 atoms given their coordinates"""
    sum = 0
    for o, n in zip(Ocoord, Ncoord):
        sum += (o - n)**2
    return sqrt(sum)


def helicity_check(selection='sele'):
    """calcultate distance O[res i]-N[res i+3]
                           O[res i]-N[res i+4]
                           O[res i]-N[res i+5]
    """
    seq_model = cmd.get_model(selection) #get info from selection
    res_lim = seq_model.get_residues()

    if len(res_lim)<5:
        sys.stderr.write("\nPlease select at least 5 residues\n")
        return

    atom_list = seq_model.atom
    res_data=[]

    for start,end in res_lim:   #extract the data we are interested in
        res=Residue()
        for atom in atom_list[start:end]:
            if atom.name == 'N':
                res.name = atom.resn
                res.index = atom.resi
                res.Ncoord = atom.coord
            elif atom.name == 'O':
                res.Ocoord = atom.coord
        if res.Ocoord and res.Ncoord and res.name and res.index:
            res_data.append(res)
        else:
            sys.stderr.write("\nPlease select complete protein residues\n")
            return

    res_list = [int(res.index) for res in res_data]

    if res_list != range(res_list[0], res_list[-1]+1):
        sys.stderr.write("\nPlease select a unbrocken residue sequence\n")
        return

    distON3 = []
    distON4 = []
    distON5 = []
    distONs = [distON3, distON4, distON5]

    for i,res in enumerate(res_data[:-5]): #distances calculations
        resis = res_data[i+3:i+6]
        for resi, distONi in zip(resis, distONs):
            distONi.append(calc_distON(res.Ocoord, resi.Ncoord))

    dump = os.tmpnam()+'.dat'
    dumpfile = file(dump, 'w')

    sys.stdout.write('\n#Distances O(i)---N(i+n)\n'
           '#ResNum , d(O(i)-N(i+3)) , d(O(i)-N(i+4)) , d(O(i)-N(i+4))\n')
    for i, d3, d4, d5 in zip(res_list, distON3, distON4, distON5):
        #writing console output
        sys.stdout.write(
              '  %i ,      %f ,       %f ,       %f \n'%(i, d3, d4, d5))
        #writing data to a dump file for use by gnuplot
        dumpfile.write(
              '  %i       %f        %f        %f \n'%(i, d3, d4, d5))
    dumpfile.flush()

    #launch a gnuplot window to show the distances
    gnuplotcmd = subprocess.Popen(['/usr/bin/gnuplot'], shell=True,
                               stdin=subprocess.PIPE)
    gnuplotcmd.stdin.write('set autoscale\n')
    gnuplotcmd.stdin.write("plot "
         "'%s' using 1:2 title 'd(O(i)-N(i+3))' with lines, "
         "'%s' using 1:3 title 'd(O(i)-N(i+4))' with lines, "
         "'%s' using 1:4 title 'd(O(i)-N(i+5))' with lines\n'"
                          % (dump, dump, dump))
    time.sleep(3)
    dumpfile.close()
    os.remove(dump)