This is a read-only mirror of pymolwiki.org
Difference between revisions of "AutoMultiFit"
Jump to navigation
Jump to search
m (3 revisions) |
(No difference)
|
Latest revision as of 01:31, 28 March 2014
OVERVIEW
AutoMultiFit will fit all given chain(s) in all given state(s) to any other given chain(s) in any other given state(s) for some given selection within a homo-oligomer. So, if you have an MD trajectory or NMR ensemble of a tertramer, for example, over 20 states this program could calculate the RMS values for residues 10-30 in chain A's state 17, against all of chain C. Or all states in all chains against each other.
See the notes in the code for usage.
The Code
#
# autoMultiFit.py -- Given a homo-oligomer in N-states, fit any combination of chains across states
#
# AUTHOR: Jason Vertrees
# DATE : 2009-11-02
#
import pymol
from pymol import cmd
def autoMultiFit(sel, fromChain="*", fromState="*", toChain="*", toState="*", verbose=None):
"""
FUNCTION
Given a homo-oligomer in N-states (say from MD), fit any
combination of chains/selections across states. See Usage, Examples and Notes.
USAGE
autoMultiFit sel, [fromChain[, fromState[, toChain[, toState[, verbose ]]]]]
sel
The selection that must exist in all chains (what you're fitting)
fromChain
Fit from this chain, leave blank or use '*' for all chains;
fromState
Fit from this state, leave blank or use '*' for all states;
toChain
Fit to this chain only, use '*' or leave blank for all chains;
toState
Fit to this state only, use '*' or leave blank for all states
verbose
If turned on, this prints the fit for all pairs; this could be VERY slow.
RETURNS
A hash of hashes of hashes of hashes. :-) Access the results like this:
fitValues = autoMultiFit( mySelection )
#fitValues[fromChain][fromState][toChain][toState]
# to get the result of the fit from chain A, state 4 to chain C, state 17 type,
fitValues['A']['4']['C']['17']
EXAMPLES
* Fit ALL chains to each other across ALL STATES for PDB 2kb1
autoMultiFit 2kb1
* Fit chain A's residue 22-34 against all states
autoMutliFit 2kb1 and i. 22-34, fromChain=A
* Fit chain A, B and C's residues 8-17, states 10 and 11, against chain D's state 8
myVals = autoMultiFit("2kb1 and i. 8-17", fromChain="a b c", fromState="10 11", toChain="d", toState=8)
myVals['B']['10']['D']['8']
NOTES
* The return value uses UPPERCASE and STRINGS for ALL hash keys, so if you used chain 'a' it will
be 'A' in the map; if you used 'chainXX' it will be 'CHAINXX' in the map.
* Continuing from the above note, all statese are accessible by their strings, so '17' gets state
17 from the hash, not just the number 17.
* This can be very slow: it's O( nFromChains * nFromStates * nToChains * nToStates )
* fromChain, toChain, fromStates and toStates can all be single values, like "8", they can be a SPACE
separated list of values, like "2 4 5", or they can be "*" which means ALL.
"""
fromChain = processChain(fromChain,sel)
fromState = processState(fromState, sel)
toChain = processChain(toChain, sel)
toState = processState(toState, sel)
res = {}
for frC in fromChain:
res[frC] = {}
for frS in fromState:
res[frC][str(frS)] = {}
cmd.create( "__tmpA", sel + " and c. " + frC, frS, 1 )
for toC in toChain:
res[frC][str(frS)][toC] = {}
for toS in toState:
cmd.create("__tmpB", sel + " and c. " + toC, toS, 1 )
curVal = cmd.pair_fit( "__tmpA", "__tmpB", quiet=1 )
res[frC][str(frS)][toC][str(toS)] = curVal
if verbose!=None:
print "Pair Fitted: from (chain: %s, state: %s) to (chain: %s, states %s) with RMSD %s" % (frC, frS, toC, toS, curVal)
cmd.delete("__tmpB")
cmd.delete("__tmpA")
return res
def processChain(ch, sel):
"""Turn a string-based space separated list into an array of chains"""
if ch == "*":
# just in case
return map(str.upper, cmd.get_chains(sel))
else:
return map(str.upper, processTextList(ch))
def processState(st, sel):
"""Tur a string-based space separated list into an array of states"""
if st == "*":
# assumes that if there is a state X, there is a state, X-1
return range(cmd.count_states(sel))
else:
return map(int, processTextList(st))
def processTextList(t):
""" make a space-separated list into a real Python list, eg.
input: a b c d
output: [ 'a', 'b', 'c', 'd' ]
"""
t = str(t).split()
return t
if __name__ == "__main__":
assert processTextList( "a b c d" ) == ['a', 'b', 'c', 'd']
assert processTextList( " 1 45 s s s s j p k") == [ '1', '45', 's', 's', 's', 's', 'j', 'p', 'k' ]
assert processChain( "a b c dd", "blankSel" ) == ["a", "b", "c", "dd"]
assert processState( "1 2 3 44 5", "blankSel" ) == [ 1, 2, 3, 44, 5 ]
cmd.extend( "autoMultiFit", autoMultiFit )