Ccp4 contact

From PyMOLWiki
Revision as of 15:34, 19 June 2011 by Dalyte (talk | contribs) (added a new script to parse and select CONTACT output)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Interface residues (at cutoff <4A) in the 2c7r.pdb were found using NCONT, but similar results can be obtained using this script and CONTACT output. Usage of selectCONTACTContacts script in PyMOL allows easy selection of residues and atoms listed in the output file. Interacting protein and DNA residues are colored in red and slate, respectively. Atoms in contact are shown in dots.

Overview

The script selects residues and atoms from the list of the contacts found by CONTACT from CCP4 Program Suite (CONTACT analyses contacts between subsets of atoms in a PDB file). First, we run CONTACT on our pdb file to find interface residues. Then by using the selectCONTACTContacts script in PyMOL we separately select residues and atoms listed in a ncont.log file. This generates two selections (atoms and residues) for each interacting chain, allowing quick manipulation of (sometimes) extensive lists in CONTACT log file.

Usage

selectCONTACTContacts( contactsfile, selName1 = "source", selName2 = "target" )


Examples

First use CONTACT to find interface residues/atoms in the pdb file. Once you have ncont.log file proceed to PyMOL. Make sure you've run the selectCONTACTContacts script first.

fetch 2c7r
selectCONTACTContacts ncont.log, selName1=prot, selName2=dna
Quick and easy selection of interacting residues and atoms listed in the CONTACT log file. Protein and DNA residues are colored in red and slate, respectively. Atoms in contact are shown in dots.

The Code

import re

def parseCONTACTContacts( f ):
    # Lys    24A  ca  Asp   263D  CG   ...  4.94    [   -1B   ]   3: -X,  Y+1/2,  -Z+1/2
    conParser = re.compile("(\S*)\s*(\d+)([A-Z])\s*(\w+)")
    s1 = []
    s2 = []
    for line in f:
        if line.startswith('#'):
            continue
        matches = conParser.findall(line)
        if len(matches) == 2:
            s1.append(matches[0])
            s2.append(matches[1])
        elif len(matches) == 1:
            s2.append(matches[0])
            
    return (s1, s2)

def selectCONTACTContacts( contactsfile, selName1 = "source", selName2 = "target" ):
    """
    selectCONTACTContacts -- parses CCP4/CONTACT log file and selects residues and atoms.
    http://www.ccp4.ac.uk/html/contact.html
 
    PARAMS
        contactsfile
            filename of the CCP4/CONTACT log file
 
        selName1
            the name prefix for the _res and _atom selections returned for the
            source set of chain
 
        selName2
            the name prefix for the _res and _atom selections returned for the 
            target set of chain

    RETURNS
        4 selections of interface residues and atoms are created and named
        depending on what you passed into selName1 and selName2

    REPOSITORY
        https://github.com/GerhardR/pymol-scripts

    AUTHOR
        Gerhard Reitmayr and Dalia Daujotyte, 2011.
    """
    # read and parse contacts file into two lists of contact atoms and contact pair list
    s1, s2 = parseCONTACTContacts(open(contactsfile))
    
    # create a selection for the first contact list
    
    # create the PYMOL selection macros for the residues 
    resNames = [chain+"/"+residue+"/" for (type, residue, chain, atom) in s1]
    # put them in a set to remove duplicates and then join with 'or'
    resSel = " or ".join(frozenset(resNames))
    # finally select them under the new name
    cmd.select(selName1 + "_res", resSel)
    
    atomNames = [chain+"/"+residue+"/"+atom for (type, residue, chain, atom) in s1]
    atomSel = " or ".join(frozenset(atomNames))
    cmd.select(selName1 + "_atom", atomSel)
    
    # create a selection for the second contact list

    resNames = [chain+"/"+residue+"/" for (type, residue, chain, atom) in s2]
    resSel = " or ".join(frozenset(resNames))
    cmd.select(selName2 + "_res", resSel)
    
    atomNames = [chain+"/"+residue+"/"+atom for (type, residue, chain, atom) in s2]
    atomSel = " or ".join(frozenset(atomNames))
    cmd.select(selName2 + "_atom", atomSel)

cmd.extend("selectCONTACTContacts", selectCONTACTContacts)

Code repository

The latest version of this script and related scripts is available at https://github.com/GerhardR/pymol-scripts.