|
|
(25 intermediate revisions by one other user not shown) |
Line 1: |
Line 1: |
| + | {{Infobox script-repo |
| + | |type = script |
| + | |filename = displacementmap.py |
| + | |author = [[User:Tlinnet|Troels E. Linnet]] |
| + | |license = BSD |
| + | }} |
| + | |
| == Overview == | | == Overview == |
| DisplacementMap is made for easy investigations of suitable positions for site-directed mutagenesis of amino residues into cysteines and FRET/EPR pair labelling. | | DisplacementMap is made for easy investigations of suitable positions for site-directed mutagenesis of amino residues into cysteines and FRET/EPR pair labelling. |
− | A Open and Closed form of a protein should be loaded. New objects should be created for the selected asymmetric unit. | + | |
− | Parts of the protein should be aligned, leaving the flexible part in two different positions. | + | A Open and Closed form of a protein should be loaded. New objects should be created for the selected asymmetric unit. Parts of the protein should be aligned, leaving the flexible part in two different positions. |
− | The input is the the objects, Open (Object1) and Closed (Object2). Further is the criteria for selecting which atom the distance should be calculated between. Standard is atom='CA' (atom). Then one selects the Förster distance R0 (MinResResDist). This is the minimum distance between the residues. This depends of the selection of the FRET pair and protein at hand. But usually in the range 40 - 80 Angstrom is suitable. Then one defines the minimum displacement that is accepted. Usually R0/2 (MinDeltaDist). The script will find the 5 best (MinMaxListLength=5) positive and negative distance displacement between the two objects. It parses the results back to Pymol, that is standard set to show it as sticks (showsticks='yes'). If one is looking for a particular residue range for the fret pair, this can be specified in the last two input. | + | |
− | Res1=24.45-47.86 Res2=100-105.107 Res1 is "from" and Res2 is "to". Individual residues are split by a ".", and ranges are defined with "-".
| + | The input is the objects, Open (molecule1) and Closed (molecule2). <br /> |
| + | Further is the criteria for selecting which atom the distance should be calculated between. Standard is atom='CA' (atom). <br /> |
| + | Then one selects the Förster distance R0 (mindist). This is the minimum distance between the residues. This depends of the selection of the FRET pair and protein at hand. But usually in the range 40 - 80 Angstrom is suitable. <br /> |
| + | Then one defines the minimum displacement that is accepted. Usually R0/2 (mindelta). <br /> |
| + | The script will find the 5 best (listlength=5) positive and negative distance displacement between the two objects. |
| + | |
| + | It parses the results back to Pymol, that is standard set to show it as sticks (showsticks='yes'). <br /> |
| + | If one is looking for a particular residue range for the FRET pair, this can be specified with two input. |
| + | resi1=24.45-47.86 resi2=100-105.107 resi1 is "from" and resi2 is "to". Individual residues are split by a ".", and ranges are defined with "-".<br /> |
| In the end, it makes a large data-matrix with all the distances. It also produces a gnuplot file, for easy visualisation. Just drag the .plt file for win gnuplot command window and it plots your datamatrix. | | In the end, it makes a large data-matrix with all the distances. It also produces a gnuplot file, for easy visualisation. Just drag the .plt file for win gnuplot command window and it plots your datamatrix. |
| | | |
| == Bugs == | | == Bugs == |
| If the criterion is set to low, the memory gets flooded in the data-matrix file, making the file unreadable. No solutions found yet. | | If the criterion is set to low, the memory gets flooded in the data-matrix file, making the file unreadable. No solutions found yet. |
− |
| |
− | == Instructions ==
| |
− | # Make a folder
| |
− | # Copy the code to your machine, and name: DisplacementMap.py
| |
− | # Download the .pdb files of the Open and Closed form of your protein
| |
− | # Make a pymol script file, that makes the alignment and such. See example.
| |
− | # Run the script and see the results in command window and suggestions in pymol window
| |
− | # Run the gnuplot file to see the data-matrix
| |
| | | |
| == Example == | | == Example == |
− | <source lang="python"> | + | <syntaxhighlight lang="python"> |
− | DisplacementMap(Object1, Object2, atom='CA', MinResResDist=40.0, MinDeltaDist=15.0, MinMaxListLength=5, showsticks='yes', Res1=str(0), Res2=str(0)):
| + | dispmap(molecule1="NIL", molecule2="NIL", mindist=30.0, mindelta=15.0, resi1=str(0), resi2=str(0), atom='CA', listlength=5, showsticks='yes'): |
− | DisplacementMap O5NT-1HP1-A, C5NT-1HPU-C, CA, 40.0, 15.0, 5, showsticks=yes, 23.50-500, 40-250.270-550
| + | </syntaxhighlight> |
− | | + | Use of functions |
− | Used for output examples:
| + | <syntaxhighlight lang="python"> |
− | DisplacementMap O5NT, C5NT, CA, 40.0, 15.0, 10, Res2=1-512.515-550
| + | import displacementmap |
− | </source> | + | dispmap Open5NT, Closed5NT, 40.0, 15.0, resi1=206, resi2=1-512.515-550 |
| + | dispmap Open5NT, Closed5NT, 30.0, 15.0, resi2=1-512.515-550, atom=CA, listlength=10 |
| + | </syntaxhighlight> |
| | | |
| == Output == | | == Output == |
− | Suggestions are created in pymol, and gnuplot file is created for easy visualisation of data-matrix. | + | Suggestions are created in pymol, and gnuplot file is created for easy visualisation of pair data-matrix and the general backbone displacement. |
− | <gallery heights="300px" widths="400px"> | + | <gallery heights="200px" widths="200px"> |
| Image:O5NT-C5NT-CA-dist.png| | | Image:O5NT-C5NT-CA-dist.png| |
| Image:O5NT-C5NT-CA-dist-menu.png| | | Image:O5NT-C5NT-CA-dist-menu.png| |
| Image:O5NT-C5NT-CA-dist-gnuplot.png| | | Image:O5NT-C5NT-CA-dist-gnuplot.png| |
| + | Image:O5NT-C5NT-CA-dist-backbone.png |
| </gallery> | | </gallery> |
| | | |
| == Text output == | | == Text output == |
| In the data-matrix.txt file, you find the best suggestions | | In the data-matrix.txt file, you find the best suggestions |
− | <source lang="python"> | + | <syntaxhighlight lang="text"> |
− | # Input 1: O5NT and Input 2: C5NT | + | # Input 1: Open5NT and Input 2: Closed5NT |
− | # Find for: CA with min. residue-residue dist: 40.0 Angstrom | + | # Find for: CA with min. residue-residue dist: 30.0 Angstrom |
| # Looking for min. displacement dist: 15.0 Angstrom | | # Looking for min. displacement dist: 15.0 Angstrom |
− | # I give nr# suggestions: 10, and do I show sticks in pymol?: yes | + | # I give nr# suggestions: 5, and do I show sticks in pymol?: yes |
| # I look for suggestions in the range: ([0]=>means all residues) | | # I look for suggestions in the range: ([0]=>means all residues) |
− | # for Input 1: ['0'] and for Input 2: ['1-512', '515-550'] | + | # for Input 1: ['0'] and for Input 2: ['0'] |
| # Mutation info is BLOSUM62 log-odds likelihood score and PAM250 is probability in % for evolutionary distance | | # Mutation info is BLOSUM62 log-odds likelihood score and PAM250 is probability in % for evolutionary distance |
− | ######################################################################################################### | + | ########################################################################################################### |
− | # Max Negative and positive distances # Mutation info # | + | # Max Negative and positive distances # Mutation info # |
− | ######################################################################################################### | + | ########################################################################################################### |
− | # Obj.1 Obj.2 Delta Op-Op Cl-Cl # Obj.1 Obj.2 Delta Op-Op Cl-Cl # Res.1 Res.2 # Res.1 Res.2 # | + | # Obj.1 Obj.2 Delta Op-Op Cl-Cl # Obj.1 Obj.2 Delta Op-Op Cl-Cl # Res.1 Res.2 # Res.1 Res.2 # |
− | # Res.1 Res.2 -Dist Dist Dist # Res.1 Res.2 +Dist Dist Dist # B62/PAM250% # B62/PAM250% # | + | # Res.1 Res.2 -Dist Dist Dist # Res.1 Res.2 +Dist Dist Dist # B62/PAM250% # B62/PAM250% # |
− | ######################################################################################################### | + | ########################################################################################################### |
− | # GLN205 ASP456 -25.3 68.1 42.8 # ARG303 VAL516 21.5 42.8 64.3 # -3/1 -3/1 # -3/1 -1/2 # | + | # PRO241 ASP456 -25.7 59.1 33.4 # PRO274 PRO513 26.8 31.2 58.0 # -3/ 2 -3/ 1 # -3/ 2 -3/ 2 # |
− | # GLN204 ASP456 -25.1 65.6 40.5 # THR31 VAL516 21.1 44.6 65.7 # -3/1 -3/1 # -1/2 -1/2 # | + | # LYS197 ASP456 -25.6 57.3 31.7 # THR273 PRO513 26.1 31.6 57.7 # -1/ 1 -3/ 1 # -1/ 2 -3/ 2 # |
− | # THR206 ASP456 -24.6 68.3 43.7 # ASN304 VAL516 21.0 44.0 65.0 # -1/2 -3/1 # -3/1 -1/2 # | + | # PRO513 ASP456 -25.4 32.4 7.0 # PRO274 GLY514 24.8 32.9 57.6 # -3/ 2 -3/ 1 # -3/ 2 -3/ 2 # |
− | # LYS208 ASP456 -24.3 67.3 43.0 # GLY305 VAL516 21.0 40.6 61.6 # -1/1 -3/1 # -3/2 -1/2 # | + | # LEU198 ASP456 -25.3 59.0 33.7 # PRO274 LYS512 24.7 30.3 55.0 # -1/ 1 -3/ 1 # -3/ 2 -1/ 1 # |
− | # GLN205 SER457 -24.2 64.9 40.7 # ASP29 VAL516 21.0 48.7 69.7 # -3/1 -1/3 # -3/1 -1/2 # | + | # GLN201 ASP456 -25.2 62.8 37.6 # ASN311 PRO513 24.7 35.6 60.3 # -3/ 1 -3/ 1 # -3/ 1 -3/ 2 # |
− | # GLU207 ASP456 -24.0 67.1 43.2 # GLU301 TYR515 20.8 40.4 61.2 # -4/1 -3/1 # -4/1 -2/4 #
| + | </syntaxhighlight> |
− | # THR206 SER457 -23.7 65.1 41.5 # GLU306 TYR515 20.8 40.4 61.2 # -1/2 -1/3 # -4/1 -2/4 #
| + | The script also automatically make the gnuplot plot file (.plt), with all the defined variables, for easy visualisation of the data-matrix.txt and the backbone displacement. |
− | # PRO209 ASP456 -23.6 64.7 41.1 # GLY243 THR490 20.6 41.2 61.8 # -3/2 -3/1 # -3/2 -1/2 #
| |
− | # GLU306 ASP376 -23.4 66.1 42.8 # ALA242 LYS489 20.6 42.4 62.9 # -4/1 -3/1 # 0/2 -1/1 #
| |
− | # GLY305 ASP456 -23.4 67.1 43.7 # LYS30 VAL516 20.4 47.4 67.8 # -3/2 -3/1 # -1/1 -1/2 #
| |
− | </source>
| |
− | The script also automatically make the gnuplot plot file (.plt), with all the defined variables, for easy visualisation of the data-matrix.txt
| |
− | <source lang="python">
| |
− | reset
| |
− | cd 'C:\Users\tlinnet\Documents\My Dropbox\Speciale\5NT-project\Mutant-construct\Distance-Plot'
| |
− | | |
− | #Title hacks \n is newline, and 0,1 is x,y offset adjustment
| |
− | #set title "Protein CA Displacement matrix map \n ResRes min. 40.0 Ang, Delta min. 15.0 Ang" 0,1
| |
− | set title "Protein CA Displacement matrix map \n ResRes min. 40.0 Ang, Delta min. 15.0 Ang" 0,1 font "Times-Roman,12"
| |
− | # x is column
| |
− | #set xlabel 'Res nr. for C5NT
| |
− | set xlabel 'Res nr. for C5NT' font 'Times-Roman,10'
| |
− | # y is row
| |
− | #set ylabel 'Res nr. for O5NT
| |
− | set ylabel 'Res nr. for O5NT' font 'Times-Roman,10'
| |
− | | |
− | #set xrange [300:550]; set yrange [0:400]
| |
− | set xtics 50 font 'Times-Roman,6'
| |
− | set ytics 50 font 'Times-Roman,6'
| |
− | set mxtics 5
| |
− | set mytics 5
| |
− | set size ratio 1
| |
− | unset key
| |
− | | |
− | set cbrange [-30:30]
| |
− | set palette defined (-30 'blue', 0 'white', 30 'red')
| |
− | set pm3d map
| |
− | | |
− | splot 'O5NT-C5NT-CA-dist.txt' matrix
| |
− | pause -1
| |
− | </source>
| |
− | | |
− | == Pymol script file ==
| |
− | <source lang="python">
| |
− | #cd /homes/linnet/Documents/Speciale/5NT-project/Mutant-construct/Distance-Plot
| |
− | C:\Users\tlinnet\Documents\My Dropbox\Speciale\5NT-project\Mutant-construct\Distance-Plot
| |
− | ### load pdb files and rename
| |
− | load 1HP1.pdb, O5NT-1HP1
| |
− | load 1HPU.pdb, C5NT-1HPU
| |
− | | |
− | hide everything
| |
− | ### Select asymmetric units from pdb file
| |
− | create O5NT, /O5NT-1HP1//A
| |
− | create C5NT, /C5NT-1HPU//A
| |
− | delete O5NT-1HP1
| |
− | delete C5NT-1HPU
| |
− | | |
− | cartoon auto
| |
− | show cartoon, O5NT
| |
− | show cartoon, C5NT
| |
− | set cartoon_fancy_helices=1
| |
− | set bg,[1,1,1]
| |
− | | |
− | ### align
| |
− | #align O5NT and resi 26-355, C5NT and resi 26-355
| |
− | # Super is must faster than align http://www.pymolwiki.org/index.php/Super
| |
− | super O5NT and resi 26-355, C5NT and resi 26-355
| |
− | | |
− | set auto_zoom, off
| |
− | set_view (\
| |
− | -0.374262989, 0.692084968, -0.617209554,\
| |
− | -0.681849480, -0.656483948, -0.322660774,\
| |
− | -0.628496349, 0.300085038, 0.717594206,\
| |
− | 0.000000000, 0.000000000, -258.556884766,\
| |
− | -0.613845825, 0.472507477, 1.410455704,\
| |
− | 205.729583740, 311.384277344, 0.000000000 )
| |
− | | |
− | ### Color
| |
− | set_color goldenrod1, [1.000, 0.757, 0.145]
| |
− | color goldenrod1, resi 26-355
| |
− | set_color darkolivegreen1, [0.792, 1.000, 0.439]
| |
− | color darkolivegreen1, O5NT and resi 356-362
| |
− | set_color darkolivegreen4, [0.431, 0.545, 0.239]
| |
− | color darkolivegreen4, C5NT and resi 356-362
| |
− | set_color chocolate3, [0.804, 0.400, 0.114]
| |
− | color chocolate3, O5NT and resi 363-550
| |
− | set_color purple4, [0.333, 0.102, 0.545]
| |
− | color purple4, C5NT and resi 363-550
| |
− | | |
− | # Select active site
| |
− | select active_site, resi 117+120+252+116+217+84+41+43+254
| |
− | show sticks, active_site
| |
− | | |
− | # Make Cys-Cys bonds
| |
− | create SS, (cys/ca+cb+sg) and byres (cys/sg and bound_to cys/sg)
| |
− | show sticks, SS
| |
− | color yellow, SS
| |
− | | |
− | # Mark water molecules
| |
− | create waters, resn HOH
| |
− | show nb_spheres, waters
| |
− | color blue, waters
| |
− | disable waters
| |
− | | |
− | ### Make sharper, and transparent
| |
− | set fog=0
| |
− | set cartoon_transparency, 0.7
| |
− | | |
− | ### Load my function
| |
− | run DisplacementMap.py
| |
− | #DisplacementMap O5NT, C5NT, CA, 40.0, 15.0, 20, Res1=206, Res2=1-512.515-550
| |
− | # Look for serine
| |
− | #DisplacementMap O5NT, C5NT, CA, 40.0, 15.0, 5, Res1=206, Res2=330.347.350.405.412.419.457.467.533.534.539.548.336.367.383.397.439.448.490.495.501.518
| |
− | DisplacementMap O5NT, C5NT, CA, 30.0, 15.0, 5, Res1=308, Res2=513
| |
− | </source>
| |
− | | |
− | == DisplacementMap.py ==
| |
− | <source lang="python">
| |
− | from pymol import cmd, stored
| |
− | from math import *
| |
− | import os
| |
− | import re
| |
− | | |
− | ## Thx for inspiration from Andreas Henschel
| |
− | ## http://www.mail-archive.com/pymol-users@lists.sourceforge.net/msg05595.html (17 dec 2010)
| |
− | ## And from Simple scriptin PymMOl http://www.pymolwiki.org/index.php/Simple_Scripting
| |
− | ### This is a rather slow version, since many matrix modules is not available on our system
| |
− | ### Ma.Sc student. Troels Linnet, 2010-12-18. troels.linnet@bbz.uni-leipzig.de
| |
− | | |
− | ###Calculates the distance for example between all CA atoms between a closed and open form of a structure.
| |
− | ### Give a data matrix and a gnuplot file, and input to pymol for easy visualisation
| |
− | ### Possible so select interesting residues in ranges. Needs to be separated with a dot '.'
| |
− | ### Example input from pymol. with 2 objects.
| |
− | ### DistMatrix O5NT-1HP1-A, C5NT-1HPU-C, CA, 40.0, 15.0, 5, showsticks=yes, 23-25
| |
− | | |
− | def DisplacementMap(Object1, Object2, atom='CA', MinResResDist=40.0, MinDeltaDist=15.0, MinMaxListLength=5, showsticks='yes', Res1=str(0), Res2=str(0)):
| |
− | print "\n"
| |
− | print "Hello, PyMOLers in Leipzig"
| |
− | print "You passed in %s and %s" % (Object1, Object2)
| |
− | | |
− | ### Open filenames
| |
− | filename = str(Object1) + "-" + str(Object2) + "-" + str(atom) + "-dist"
| |
− | backbonefilename = str(Object1) + "-" + str(Object2) + "-" + str(atom) + "backbone-dist.txt"
| |
− | outfile = open(filename+".txt", "w")
| |
− | backboneoutfile = open(filename+"-backbone.txt", "w")
| |
− | gnuoutfile = open(filename+".plt", "w")
| |
− | print "I have opened matrix %s for you" % (filename+".txt")
| |
− | print "\n"
| |
− | | |
− | ### Sorting for interesting residues for Obj1 and Obj2.
| |
− | ### Input is a string, and need to be sorted.
| |
− | Res1 = Res1.split('.')
| |
− | Res2 = Res2.split('.')
| |
− | Res1List = []
| |
− | Res2List = []
| |
− | for i in Res1:
| |
− | if '-' in i:
| |
− | tmp = i.split('-')
| |
− | Res1List.extend(range(int(tmp[0]),int(tmp[-1])+1))
| |
− | if '-' not in i:
| |
− | Res1List.append(int(i))
| |
− | for i in Res2:
| |
− | if '-' in i:
| |
− | tmp = i.split('-')
| |
− | Res2List.extend(range(int(tmp[0]),int(tmp[-1])+1))
| |
− | if '-' not in i:
| |
− | Res2List.append(int(i))
| |
− | Res1List.sort()
| |
− | Res2List.sort()
| |
− | | |
− | ### Only take the lines where atom is specified in input
| |
− | Object3 = Object1 + " and name " + str(atom)
| |
− | Object4 = Object2 + " and name " + str(atom)
| |
− | | |
− | ### Open 2 name lists
| |
− | ### Append residue and atom name to the lists
| |
− | stored.OpenPDB = []
| |
− | stored.ClosedPDB = []
| |
− | cmd.iterate(Object3, "stored.OpenPDB.append((resi, name, resn))")
| |
− | cmd.iterate(Object4, "stored.ClosedPDB.append((resi, name, resn))")
| |
− | | |
− | ### Open 2 x,y,z position lists
| |
− | ### Append atom position
| |
− | stored.OpenPos = []
| |
− | stored.ClosedPos = []
| |
− | cmd.iterate_state(1, selector.process(Object3), "stored.OpenPos.append((x,y,z))")
| |
− | cmd.iterate_state(1, selector.process(Object4), "stored.ClosedPos.append((x,y,z))")
| |
− | | |
− | ### Sometimes residues gets skipped in X-ray crys, because of low signal or sim. This leads to number conflict.
| |
− | ### Make ordered lists according to residue number. Find largest residue number via -1
| |
− | OpenOrderedPDB = []
| |
− | ClosedOrderedPDB = []
| |
− | OpenOrderedPos = []
| |
− | ClosedOrderedPos = []
| |
− | BackboneDisp = []
| |
− | | |
− | ### First fill lists with zeros
| |
− | for i in range(int(stored.OpenPDB[-1][0])+1):
| |
− | OpenOrderedPDB.append([0,0,0])
| |
− | for i in range(int(stored.ClosedPDB[-1][0])+1):
| |
− | ClosedOrderedPDB.append([0,0,0])
| |
− | for i in range(int(stored.OpenPDB[-1][0])+1):
| |
− | OpenOrderedPos.append((0,0,0))
| |
− | for i in range(int(stored.ClosedPDB[-1][0])+1):
| |
− | ClosedOrderedPos.append((0,0,0))
| |
− | for i in range(int(stored.OpenPDB[-1][0])+1):
| |
− | BackboneDisp.append([i,0,"NIL",atom])
| |
− | | |
− | | |
− | ### Fill in data the right places
| |
− | j=0
| |
− | for i in stored.OpenPDB:
| |
− | OpenOrderedPDB[int(i[0])]=[int(i[0]),i[1],i[2]]
| |
− | OpenOrderedPos[int(i[0])]=stored.OpenPos[j]
| |
− | j = j + 1
| |
− | j=0
| |
− | for i in stored.ClosedPDB:
| |
− | ClosedOrderedPDB[int(i[0])]=[int(i[0]),i[1],i[2]]
| |
− | ClosedOrderedPos[int(i[0])]=stored.ClosedPos[j]
| |
− | j = j + 1
| |
− | | |
− | ### Make a list with the missing residues
| |
− | MissingRes = []
| |
− | for index, resi in enumerate(OpenOrderedPDB):
| |
− | if abs(OpenOrderedPDB[index][0]-ClosedOrderedPDB[index][0]) != 0:
| |
− | MissingRes.append(abs(OpenOrderedPDB[index][0]-ClosedOrderedPDB[index][0]))
| |
− | print "Following residues miss in one of the files, and are discarded for"
| |
− | print "further calculations"
| |
− | print MissingRes
| |
− | print "\n"
| |
− | | |
− | ### Make the data matrix
| |
− | CalcMatrix = create_nXn_matrix(len(OpenOrderedPos))
| |
− | print "Calculate a %s X %s distance Matrix" % (len(OpenOrderedPos), len(ClosedOrderedPos))
| |
− | | |
− | ### Make a list with 10 most negative/positive distances
| |
− | MaxNegDist = []
| |
− | MaxPosDist = []
| |
− | for i in range(int(MinMaxListLength)):
| |
− | MaxNegDist.append([0,0,0,0,0,0,0])
| |
− | MaxPosDist.append([0,0,0,0,0,0,0])
| |
− | | |
− | ### Calculate distances
| |
− | for i in range(len(OpenOrderedPos)):
| |
− | for j in range(len(ClosedOrderedPos)):
| |
− | if OpenOrderedPos[i][0] != 0 and ClosedOrderedPos[j][0] != 0 and OpenOrderedPDB[i][0] not in MissingRes and ClosedOrderedPDB[j][0] not in MissingRes:
| |
− | distOpenOpen = distance(OpenOrderedPos, OpenOrderedPos, i, j)
| |
− | distClosedClosed = distance(ClosedOrderedPos, ClosedOrderedPos, i, j)
| |
− | distOpenClosed = distance(OpenOrderedPos, ClosedOrderedPos, i, j)
| |
− | DeltaDist = distOpenClosed - distOpenOpen
| |
− | if i == j: BackboneDisp[i] = [i, DeltaDist, OpenOrderedPDB[i][2], atom]
| |
− | ###Test if distance is larger than threshold
| |
− | if distOpenOpen >= float(MinResResDist) and distClosedClosed >= float(MinResResDist) and abs(DeltaDist) >= float(MinDeltaDist):
| |
− | CalcMatrix[i][j] = str(round(DeltaDist, 0))
| |
− | if DeltaDist < 0 and DeltaDist < MaxNegDist[-1][0] and (i in Res1List or Res1List[-1]==0) and (j in Res2List or Res2List[-1]==0):
| |
− | MaxNegDist[-1][0] = DeltaDist
| |
− | MaxNegDist[-1][1] = i
| |
− | MaxNegDist[-1][2] = j
| |
− | MaxNegDist[-1][3] = distOpenOpen
| |
− | MaxNegDist[-1][4] = distOpenClosed
| |
− | MaxNegDist[-1][5] = str(OpenOrderedPDB[i][2])
| |
− | MaxNegDist[-1][6] = str(ClosedOrderedPDB[j][2])
| |
− | MaxNegDist = sorted(MaxNegDist)
| |
− | if DeltaDist > 0 and DeltaDist > MaxPosDist[-1][0] and (i in Res1List or Res1List[-1]==0) and (j in Res2List or Res2List[-1]==0):
| |
− | MaxPosDist[-1][0] = DeltaDist
| |
− | MaxPosDist[-1][1] = i
| |
− | MaxPosDist[-1][2] = j
| |
− | MaxPosDist[-1][3] = distOpenOpen
| |
− | MaxPosDist[-1][4] = distOpenClosed
| |
− | MaxPosDist[-1][5] = str(OpenOrderedPDB[i][2])
| |
− | MaxPosDist[-1][6] = str(ClosedOrderedPDB[j][2])
| |
− | MaxPosDist = sorted(MaxPosDist, reverse=True)
| |
− | | |
− | print "I made a datamatrix and backbonetxt file for you"
| |
− | print "matrix: %s backbone: %s " % (filename+".txt",filename+"-backbone.txt")
| |
− | print "I made a gnuplot file for you, to view the datamatrix and the backbone displacement"
| |
− | print "filename: %s" % (filename+".plt")
| |
− | print "\n"
| |
− | | |
− | ###Print distance matrix
| |
− | outfile.write(("# Input 1: %s and Input 2: %s" + '\n') % (Object1, Object2))
| |
− | outfile.write(("# Find for: %s with min. residue-residue dist: %s Angstrom" + '\n') % (atom, MinResResDist))
| |
− | outfile.write(("# Looking for min. displacement dist: %s Angstrom" + '\n') % (MinDeltaDist))
| |
− | outfile.write(("# I give nr# suggestions: %s, and do I show sticks in pymol?: %s" + '\n') % (MinMaxListLength, showsticks))
| |
− | outfile.write("# I look for suggestions in the range: ([0]=>means all residues)" + '\n')
| |
− | outfile.write(("# for Input 1: %s and for Input 2: %s " + '\n') % (Res1, Res2))
| |
− | outfile.write("# Mutation info is BLOSUM62 log-odds likelihood score and PAM250 is probability in % for evolutionary distance" + '\n')
| |
− | outfile.write("#########################################################################################################" + "\n")
| |
− | outfile.write("# Max Negative and positive distances # Mutation info #" + "\n")
| |
− | outfile.write("#########################################################################################################" + "\n")
| |
− | outfile.write("# Obj.1 Obj.2 Delta Op-Op Cl-Cl # Obj.1 Obj.2 Delta Op-Op Cl-Cl # Res.1 Res.2 # Res.1 Res.2 #" + "\n")
| |
− | outfile.write("# Res.1 Res.2 -Dist Dist Dist # Res.1 Res.2 +Dist Dist Dist # B62/PAM250% # B62/PAM250% #" + "\n")
| |
− | outfile.write("#########################################################################################################" + "\n")
| |
− | print("# Input 1: %s and Input 2: %s") % (Object1, Object2)
| |
− | print("# Find for: %s with min. residue-residue dist: %s Angstrom") % (atom, MinResResDist)
| |
− | print("# Looking for min. displacement dist: %s Angstrom") % (MinDeltaDist)
| |
− | print("# I give nr# suggestions: %s, and do I show sticks in pymol?: %s") % (MinMaxListLength, showsticks)
| |
− | print("# I look for suggestions in the range: ([0]=>means all residues)")
| |
− | print("# for Input 1: %s and for Input 2: %s ") % (Res1, Res2)
| |
− | print("# Mutation info is BLOSUM62 log-odds likelihood score and PAM250 is probability in % for evolutionary distance")
| |
− | print("#########################################################################################################")
| |
− | print("# Max Negative and positive distances # Mutation info #")
| |
− | print("#########################################################################################################")
| |
− | print("# Obj.1 Obj.2 Delta Op-Op Cl-Cl # Obj.1 Obj.2 Delta Op-Op Cl-Cl # Res.1 Res.2 # Res.1 Res.2 #")
| |
− | print("# Res.1 Res.2 -Dist Dist Dist # Res.1 Res.2 +Dist Dist Dist # B62/PAM250% # B62/PAM250% #")
| |
− | print("#########################################################################################################")
| |
− | for i in range(len(MaxNegDist)):
| |
− | outfile.write("# " + str(MaxNegDist[i][5]) + str(MaxNegDist[i][1]) + (5-len(str(MaxNegDist[i][1])))*" " + str(MaxNegDist[i][6]) + str(MaxNegDist[i][2]) + (5-len(str(MaxNegDist[i][2])))*" " + str(round(MaxNegDist[i][0], 1)) + " " + str(round(MaxNegDist[i][3], 1)) + " " + str(round(MaxNegDist[i][4], 1)) + " # " + str(MaxPosDist[i][5]) + str(MaxPosDist[i][1]) + (5-len(str(MaxPosDist[i][1])))*" " + str(MaxPosDist[i][6]) + str(MaxPosDist[i][2]) + (5-len(str(MaxPosDist[i][2])))*" " + str(round(MaxPosDist[i][0], 1)) + " " + str(round(MaxPosDist[i][3], 1)) + " " + str(round(MaxPosDist[i][4], 1)) + " # " + cysb62(shortaa(str(MaxNegDist[i][5]))) + "/" + pam250(shortaa(str(MaxNegDist[i][5]))) + " " + cysb62(shortaa(str(MaxNegDist[i][6]))) + "/" + pam250(shortaa(str(MaxNegDist[i][6]))) + " # "+ cysb62(shortaa(str(MaxPosDist[i][5]))) + "/" + pam250(shortaa(str(MaxPosDist[i][5]))) + " " + cysb62(shortaa(str(MaxPosDist[i][6]))) + "/" + pam250(shortaa(str(MaxPosDist[i][6]))) + " #" + "\n")
| |
− | print("# " + str(MaxNegDist[i][5]) + str(MaxNegDist[i][1]) + (5-len(str(MaxNegDist[i][1])))*" " + str(MaxNegDist[i][6]) + str(MaxNegDist[i][2]) + (5-len(str(MaxNegDist[i][2])))*" " + str(round(MaxNegDist[i][0], 1)) + " " + str(round(MaxNegDist[i][3], 1)) + " " + str(round(MaxNegDist[i][4], 1)) + " # " + str(MaxPosDist[i][5]) + str(MaxPosDist[i][1]) + (5-len(str(MaxPosDist[i][1])))*" " + str(MaxPosDist[i][6]) + str(MaxPosDist[i][2]) + (5-len(str(MaxPosDist[i][2])))*" " + str(round(MaxPosDist[i][0], 1)) + " " + str(round(MaxPosDist[i][3], 1)) + " " + str(round(MaxPosDist[i][4], 1)) + " # " + cysb62(shortaa(str(MaxNegDist[i][5]))) + "/" + pam250(shortaa(str(MaxNegDist[i][5]))) + " " + cysb62(shortaa(str(MaxNegDist[i][6]))) + "/" + pam250(shortaa(str(MaxNegDist[i][6]))) + " # "+ cysb62(shortaa(str(MaxPosDist[i][5]))) + "/" + pam250(shortaa(str(MaxPosDist[i][5]))) + " " + cysb62(shortaa(str(MaxPosDist[i][6]))) + "/" + pam250(shortaa(str(MaxPosDist[i][6]))) + " #")
| |
− | for i in range(len(CalcMatrix)):
| |
− | writing = ""
| |
− | for j in range(len(CalcMatrix)):
| |
− | if str(CalcMatrix[i][j]) == "0.0":
| |
− | writing = writing + " " + "?"
| |
− | else:
| |
− | writing = writing + " " + str(CalcMatrix[i][j])
| |
− | ### Add break line
| |
− | writing = writing + " " + "\n"
| |
− | outfile.write(writing)
| |
− | outfile.close()
| |
− | print "\n"
| |
− | | |
− | for i in range(len(BackboneDisp)):
| |
− | backboneoutfile.write(str(BackboneDisp[i][0])+(5-len(str(BackboneDisp[i][0])))*" "+str(round(BackboneDisp[i][1],1))+(5-len(str(round(BackboneDisp[i][1],1))))*" "+str(BackboneDisp[i][2])+(5-len(str(BackboneDisp[i][2])))*" "+str(BackboneDisp[i][3]) + "\n")
| |
− | backboneoutfile.close()
| |
− | | |
− | ###Make gnuplot plot file
| |
− | gnuoutfile.write("reset" + "\n")
| |
− | gnuoutfile.write("cd " + "'" + os.getcwd() + "'" + "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("#Title hacks \\n is newline, and 0,1 is x,y offset adjustment" + "\n")
| |
− | gnuoutfile.write('set title "Protein ' + str(atom) + ' Displacement matrix map \\n ResRes min. ' + str(MinResResDist) + ' Ang, ' + 'Delta min. ' + str(MinDeltaDist) + ' Ang" 0,1' + "\n")
| |
− | gnuoutfile.write("# x is column" + "\n")
| |
− | gnuoutfile.write("set xlabel 'Res nr. for " + str(Object2) +"'"+ "\n")
| |
− | gnuoutfile.write("# y is row" + "\n")
| |
− | gnuoutfile.write("set ylabel 'Res nr. for " + str(Object1) +"'"+ "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("#set xrange [300:550]; set yrange [0:400]" + "\n")
| |
− | gnuoutfile.write("#set xtics 50" + "\n")
| |
− | gnuoutfile.write("#set ytics 50" + "\n")
| |
− | gnuoutfile.write("#set mxtics 5" + "\n")
| |
− | gnuoutfile.write("#set mytics 5" + "\n")
| |
− | gnuoutfile.write("set size ratio 1" + "\n")
| |
− | gnuoutfile.write("unset key" + "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("set cbrange [-30:30]" + "\n")
| |
− | gnuoutfile.write("set palette defined (-30 'blue', 0 'white', 30 'red')" + "\n")
| |
− | gnuoutfile.write("set pm3d map" + "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("#set term postscript eps enhanced color" + "\n")
| |
− | gnuoutfile.write('#set output "'+ filename + '.eps"' + "\n")
| |
− | gnuoutfile.write("set term png" + "\n")
| |
− | gnuoutfile.write('set output "'+ filename + '.png"' + "\n")
| |
− | gnuoutfile.write("splot '" + str(filename+".txt") + "' matrix" + "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("#For the backbone displacement"+"\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write('set title "Protein ' + str(atom) + ' Backbone displacement" 0,1' + "\n")
| |
− | gnuoutfile.write("set xlabel 'Residue number'" + "\n")
| |
− | gnuoutfile.write("set ylabel '" +str(atom) + " displacement (Ang)'" + "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("#set xrange [0:550]; set yrange [0:40]" + "\n")
| |
− | gnuoutfile.write("#set xtics 50" + "\n")
| |
− | gnuoutfile.write("#set ytics 10" + "\n")
| |
− | gnuoutfile.write("#set mxtics 5" + "\n")
| |
− | gnuoutfile.write("#set mytics 5" + "\n")
| |
− | gnuoutfile.write("set size ratio 0.75" + "\n")
| |
− | gnuoutfile.write("unset key" + "\n")
| |
− | gnuoutfile.write("\n")
| |
− | gnuoutfile.write("#set term postscript eps enhanced color" + "\n")
| |
− | gnuoutfile.write('#set output "'+ filename + '-backbone.eps"' + "\n")
| |
− | gnuoutfile.write("set term png" + "\n")
| |
− | gnuoutfile.write('set output "'+ filename + '-backbone.png"' + "\n")
| |
− | gnuoutfile.write("plot '" + str(filename+"-backbone.txt") + "' using 1:2 title 'Backbone displacement' with lines" + "\n")
| |
− | gnuoutfile.close()
| |
− | | |
− | ###Create stick residue objects
| |
− | for i in range(len(MaxNegDist)):
| |
− | name = str(i) + "_" + str(round(MaxNegDist[i][0],1))+"_"+shortaa(str(MaxNegDist[i][5]))+str(MaxNegDist[i][1])+shortaa(str(MaxNegDist[i][6]))+str(MaxNegDist[i][2])
| |
− | selection = str(Object1)+" and resi "+str(MaxNegDist[i][1]) + "+"+str(MaxNegDist[i][2])+" + "+str(Object2)+" and resi "+str(MaxNegDist[i][2])
| |
− | cmd.create(name, selection)
| |
− | if showsticks=='yes' or showsticks=='y':
| |
− | cmd.show("sticks", name)
| |
− | for i in range(len(MaxPosDist)):
| |
− | name = str(i) + "_" + str(round(MaxPosDist[i][0],1))+"_"+shortaa(str(MaxPosDist[i][5]))+str(MaxPosDist[i][1])+shortaa(str(MaxPosDist[i][6]))+str(MaxPosDist[i][2])
| |
− | selection = str(Object1)+" and resi " + str(MaxPosDist[i][1])+"+" + str(MaxPosDist[i][2])+" + " + str(Object2)+" and resi "+str(MaxPosDist[i][2])
| |
− | cmd.create(name, selection)
| |
− | if showsticks=='yes' or showsticks=='y':
| |
− | cmd.show("sticks", name)
| |
− | print "Done"
| |
− | print "\n"
| |
− | cmd.extend("DisplacementMap",DisplacementMap)
| |
− | | |
− | def create_nXn_matrix(n):
| |
− | return [[0.0 for x in range(n)] for x in range(n)]
| |
− | | |
− | def distance(array1, array2, i, j):
| |
− | i = int(i); j = int(j)
| |
− | dist = sqrt((array1[i][0] - array2[j][0])**2 + (array1[i][1] - array2[j][1])**2 + (array1[i][2] - array2[j][2])**2)
| |
− | return dist
| |
− | | |
− | def Coord(Input):
| |
− | print cmd.get_atom_coords(Input)
| |
− | cmd.extend("Coord",Coord)
| |
− | | |
− | def replace_words(text, word_dic):
| |
− | rc = re.compile('|'.join(map(re.escape, word_dic)))
| |
− | def translate(match):
| |
− | return word_dic[match.group(0)]
| |
− | return rc.sub(translate, text)
| |
− | | |
− | def shortaa(longaa):
| |
− | aa_dic = {'ARG':'R','HIS':'H','LYS':'K',
| |
− | 'ASP':'D','GLU':'E',
| |
− | 'SER':'S','THR':'T','ASN':'N','GLN':'Q',
| |
− | 'CYS':'C','SEC':'U','GLY':'G','PRO':'P',
| |
− | 'ALA':'A','ILE':'I','LEU':'L','MET':'M','PHE':'F','TRP':'W','TYR':'Y','VAL':'V'}
| |
− | return(replace_words(longaa, aa_dic))
| |
− | cmd.extend("shortaa", shortaa)
| |
− | | |
− | def cysb62(aa):
| |
− | #BLOSUM62 cys mutation
| |
− | # C S T P A G N D E Q H R K M I L V F Y W
| |
− | #C9 -1 -1 -3 0 -3 -3 -3 -4 -3 -3 -3 -3 -1 -1 -1 -1 -2 -2 -2
| |
− | b62_dic = {'R':'-3','H':'-3','K':'-1',
| |
− | 'D':'-3','E':'-4',
| |
− | 'S':'-1','T':'-1','N':'-3','Q':'-3',
| |
− | 'C':'9','U':'9','G':'-3','P':'-3',
| |
− | 'A':'0','I':'-1','L':'-1','M':'-1','F':'-2','W':'-2','Y':'-2','V':'-1'}
| |
− | return(replace_words(aa, b62_dic))
| |
− | cmd.extend("cysb62", cysb62)
| |
− | | |
− | def pam250(aa):
| |
− | # A R N D C Q E G H I L K M F P S T W Y V
| |
− | #C 2 1 1 1 52 1 1 2 2 2 1 1 1 1 2 3 2 1 4 2
| |
− | # Mutation probability matrix for the evolutionary distance of 250 PAMs.
| |
− | # To simplify the appearance, the elements are shown multiplied by 100.
| |
− | # In comparing two sequences of average amino acid frequency at this evolutionary distance,
| |
− | # there is a 13% probability that a position containing Ala in the first sequence will contain Ala in the second.
| |
− | # There is a 3% chance that it will contain Arg, and so forth.
| |
− | # (Adapted from Figure 83. Atlas of Protein Sequence and Structure, Suppl 3, 1978, M.O. Dayhoff, ed. National Biomedical Research Foundation, 1979.)
| |
− | pam250_dic = {'R':'1','H':'2','K':'1',
| |
− | 'D':'1','E':'1',
| |
− | 'S':'3','T':'2','N':'1','Q':'1',
| |
− | 'C':'52','U':'52','G':'2','P':'2',
| |
− | 'A':'2','I':'2','L':'1','M':'1','F':'1','W':'1','Y':'4','V':'2'}
| |
− | return(replace_words(aa, pam250_dic))
| |
− | cmd.extend("pam250", pam250)
| |
− | </source>
| |
| | | |
− | == Author == | + | == Example 1 == |
− | Troels Emtekær Linnet, tlinnet (at) gmail. co m
| + | {{Template:PymolScriptRepoDownload|examples/displacementmap_1.pml}} |
− | Master Thesis student
| + | <include src="https://raw.github.com/Pymol-Scripts/Pymol-script-repo/master/examples/displacementmap_1.pml" highlight="python" /> |
| | | |
| == References == | | == References == |
Line 527: |
Line 95: |
| [[Category:Script_Library|DisplacementMap]] | | [[Category:Script_Library|DisplacementMap]] |
| [[Category:Structural_Biology_Scripts]] | | [[Category:Structural_Biology_Scripts]] |
| + | [[Category:Pymol-script-repo]] |