Difference between revisions of "User:Remig/plico/convert"
< User:Remig | plico
Jump to navigation
Jump to search
(Jmol script to convert residues) |
m |
||
Line 10: | Line 10: | ||
<pre># convert_residue - Jmol script by Ron Mignery | <pre># convert_residue - Jmol script by Ron Mignery | ||
− | # v1. | + | # v1.1 beta 7/23/2014 -better rna detection |
# | # | ||
# Converts a selected residue base from one form to another. | # Converts a selected residue base from one form to another. | ||
Line 17: | Line 17: | ||
# One of ACDEFGHIKLMNPQRSTUVWXY for polypeptide or | # One of ACDEFGHIKLMNPQRSTUVWXY for polypeptide or | ||
# One of ACGUT for nucleotides | # One of ACGUT for nucleotides | ||
− | gAppendNew = | + | gAppendNew = true |
g1from3 = {"ALA":"A", "GLX":"B","CYS":"C", "ASP":"D","GLU":"E", "PHE":"F", | g1from3 = {"ALA":"A", "GLX":"B","CYS":"C", "ASP":"D","GLU":"E", "PHE":"F", | ||
"GLY":"G", "HIS":"H","ILE":"I", "LYS":"K","LEU":"L", "MET":"M", | "GLY":"G", "HIS":"H","ILE":"I", "LYS":"K","LEU":"L", "MET":"M", | ||
Line 24: | Line 24: | ||
function convert_aa(iResno, iChain, newres) { | function convert_aa(iResno, iChain, newres) { | ||
− | gBusy = | + | gBusy = true |
background ECHO pink | background ECHO pink | ||
refresh | refresh | ||
Line 30: | Line 30: | ||
# Collect data | # Collect data | ||
− | var f = | + | var f = {atomIndex=_atomPicked}.file |
− | var m = | + | var m = {atomIndex=_atomPicked}.model |
var topno = {(resno=iResno) and (chain=iChain) | var topno = {(resno=iResno) and (chain=iChain) | ||
and (file=f) and (model=m)}.atomno.max + 0 | and (file=f) and (model=m)}.atomno.max + 0 | ||
Line 50: | Line 50: | ||
# Gen AA ================================================== | # Gen AA ================================================== | ||
gAppendNew = appendNew | gAppendNew = appendNew | ||
− | set appendNew | + | set appendNew false |
gA = "data \"append aa\"\n" | gA = "data \"append aa\"\n" | ||
gA += gen_aa(iResno, newres); | gA += gen_aa(iResno, newres); | ||
Line 70: | Line 70: | ||
# Reconstruct side-chain position on backbone | # Reconstruct side-chain position on backbone | ||
select ((atomIndex > idmax) and sidechain and (file=f) and (model=m)) | select ((atomIndex > idmax) and sidechain and (file=f) and (model=m)) | ||
− | color | + | color {selected} @gAltScheme |
if (aCB.size > 0) { | if (aCB.size > 0) { | ||
set_distance_atoms( aCA, aCB, 1.5) | set_distance_atoms( aCA, aCB, 1.5) | ||
Line 106: | Line 106: | ||
background ECHO yellow | background ECHO yellow | ||
refresh | refresh | ||
− | gBusy = | + | gBusy = false |
} | } | ||
Line 115: | Line 115: | ||
function convert_nt(iResno, iChain, newres) { | function convert_nt(iResno, iChain, newres) { | ||
− | gBusy = | + | gBusy = true |
background ECHO pink | background ECHO pink | ||
refresh | refresh | ||
gChain1 = iChain | gChain1 = iChain | ||
− | var f = | + | var f = {atomIndex=_atomPicked}.file |
− | var m = | + | var m = {atomIndex=_atomPicked}.model |
# Collect data | # Collect data | ||
Line 145: | Line 145: | ||
var N1or9 = (isR ? "N9" : "N1") | var N1or9 = (isR ? "N9" : "N1") | ||
var C6or8 = (isR ? "C8" : "C6") | var C6or8 = (isR ? "C8" : "C6") | ||
+ | if (aC1.group="PSU") { | ||
+ | N1or9 = "C5" | ||
+ | } | ||
var aN = atom_rcn(iResno, iChain, N1or9) | var aN = atom_rcn(iResno, iChain, N1or9) | ||
var aC = atom_rcn(iResno, iChain, C6or8) | var aC = atom_rcn(iResno, iChain, C6or8) | ||
Line 155: | Line 158: | ||
# Delete the original | # Delete the original | ||
delete {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} | delete {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} | ||
− | + | refresh | |
+ | |||
# Gen NT ================================================== | # Gen NT ================================================== | ||
− | var isRna = ( | + | var isRna = (aO2xyz != {0 0 0}) |
− | set appendNew | + | gAppendNew = appendNew |
+ | set appendNew false | ||
gA = "data \"append nt\"\n" | gA = "data \"append nt\"\n" | ||
− | gA += gen_nt(iResno, newres, isRna, | + | gA += gen_nt(iResno, newres, isRna, false); |
gA += "end \"append nt\"" | gA += "end \"append nt\"" | ||
script inline @{gA} | script inline @{gA} | ||
+ | appendNew = gAppendNew | ||
# Recollect data and move new NT to coords of old | # Recollect data and move new NT to coords of old | ||
Line 192: | Line 198: | ||
# Reconstruct base position on backbone | # Reconstruct base position on backbone | ||
select ((atomIndex > idmax) and base and (file=f) and (model=m)) | select ((atomIndex > idmax) and base and (file=f) and (model=m)) | ||
− | color | + | color {selected} @gAltScheme |
set_distance_atoms( aC1, aN, dist) | set_distance_atoms( aC1, aN, dist) | ||
set_angle_atoms( aO4, aC1, aN, bang) | set_angle_atoms( aO4, aC1, aN, bang) | ||
Line 221: | Line 227: | ||
background ECHO yellow | background ECHO yellow | ||
refresh | refresh | ||
− | gBusy = | + | gBusy = false |
} | } | ||
function convert_mb() { | function convert_mb() { | ||
− | + | if (gBusy == false) { | |
− | |||
− | if (gBusy == | ||
var idx = _atomPicked | var idx = _atomPicked | ||
var isAmino = (({(atomIndex=idx) and amino}.size > 0) | var isAmino = (({(atomIndex=idx) and amino}.size > 0) | ||
Line 236: | Line 240: | ||
var iGroup = {atomIndex=idx}.group | var iGroup = {atomIndex=idx}.group | ||
var iChain = {atomIndex=idx}.chain | var iChain = {atomIndex=idx}.chain | ||
+ | var f = {atomIndex=idx}.file | ||
+ | var m = {atomIndex=idx}.model | ||
var sels = "" | var sels = "" | ||
select {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} | select {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} | ||
Line 310: | Line 316: | ||
# Top level of Modify | # Top level of Modify | ||
function plico_convert() { | function plico_convert() { | ||
− | gBusy = | + | gBusy = false |
gSelsave = {selected} | gSelsave = {selected} | ||
gPlico = "CONVERT RESIDUE" | gPlico = "CONVERT RESIDUE" |
Revision as of 16:23, 23 July 2014
Convert_residue allows the user to change polypeptide or polynucleotide residues from one type to another. When the residue to change is selected with a mouse click, the user is prompted for the amino-acid or nucleotide to replace the selected residue.
Convert_residue is a member of the Plico suite of protein folding tools described here. It may be installed and accessed as a macro with the file:
Title=PLICO Convert residue Script=script <path to your scripts directory>/convert_residue.spt;plico_convert
saved as plicoConvert.macro in your .jmol/macros directory as described in Macro.
Copy and paste the following to a text editor and save to your scripts directory as convert_residue.spt:
# convert_residue - Jmol script by Ron Mignery # v1.1 beta 7/23/2014 -better rna detection # # Converts a selected residue base from one form to another. # Click to select a residue # Then enter new residue type: # One of ACDEFGHIKLMNPQRSTUVWXY for polypeptide or # One of ACGUT for nucleotides gAppendNew = true g1from3 = {"ALA":"A", "GLX":"B","CYS":"C", "ASP":"D","GLU":"E", "PHE":"F", "GLY":"G", "HIS":"H","ILE":"I", "LYS":"K","LEU":"L", "MET":"M", "ASN":"N", "PYL":"O","PRO":"P", "GLN":"Q","ARG":"R", "SER":"S", "THR":"T", "SEC":"U","VAL":"V", "TRP":"W","UNK":"X", "TYR":"Y", "ASX":"Z"} function convert_aa(iResno, iChain, newres) { gBusy = true background ECHO pink refresh gCHAIN = iChain # Collect data var f = {atomIndex=_atomPicked}.file var m = {atomIndex=_atomPicked}.model var topno = {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)}.atomno.max + 0 var idmax = {(file=f) and (model=m)}.atomIndex.max var aN = atom_rcn(iResno, iChain, "N") var aCA = atom_rcn(iResno, iChain, "CA") var aC = atom_rcn(iResno, iChain, "C") var aO = atom_rcn(iResno, iChain, "O") var aNxyz = aN.xyz + {0 0 0} var aCAxyz = aCA.xyz + {0 0 0} var aCxyz = aC.xyz + {0 0 0} var aOxyz = aO.xyz + {0 0 0} gN = aN.atomno # Delete the original delete {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} # Gen AA ================================================== gAppendNew = appendNew set appendNew false gA = "data \"append aa\"\n" gA += gen_aa(iResno, newres); gA += "end \"append aa\"" script inline @{gA} appendNew = gAppendNew # Recollect data and move backbone to coords of old aa aN = atom_rcn(iResno, iChain, "N") aCA = atom_rcn(iResno, iChain, "CA") aC = atom_rcn(iResno, iChain, "C") aO = atom_rcn(iResno, iChain, "O") var aCB = atom_rcn(iResno, iChain, "CB") aN.xyz = aNxyz aCA.xyz = aCAxyz aC.xyz = aCxyz aO.xyz = aOxyz # Reconstruct side-chain position on backbone select ((atomIndex > idmax) and sidechain and (file=f) and (model=m)) color {selected} @gAltScheme if (aCB.size > 0) { set_distance_atoms( aCA, aCB, 1.5) set_angle_atoms( aC, aCA, aCB, 115.9) set_dihedral_atoms( aO, aC, aCA, aCB, -100.2) var aCG = atom_rcn(iResno, iChain, "*G*") if (aCG.size > 0) { var nno = aCG[0].atomno+1 set_dihedral_atoms( aC, aCA, aCB, aCG[1], -172.9) set_angle_atoms( aCA, aCB, aCG[1], 113.2) aCD = {(atomno=nno) and (chain=iChain) and (file=f) and (model=m)} if (aCD.size > 0) { set_dihedral_atoms( aCA, aCB, aCG[1], aCD, 179.4) } } } # Connect the new AA var aCm = atom_rcn(iResno-1, iChain, "C") var aNp = atom_rcn(iResno+1, iChain, "N") connect @aN @aCm connect @aC @aNp # Update atomnos var topdif = {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)}.atomno.max - topno if (topdif != 0) { topmax = {(chain=iChain) and (file=f) and (model=m)}.atomno.max for (var i=(topno+1); i <= topmax; i++) { {(atomno=i) and (chain=iChain) and (file=f) and (model=m)}.atomno += topdif } } set echo TOP LEFT background ECHO yellow refresh gBusy = false } function atom_rcn_xyz(iResno, iChain, iName, xyz) { var a = atom_rcn(iResno, iChain, iName) a.xyz = xyz } function convert_nt(iResno, iChain, newres) { gBusy = true background ECHO pink refresh gChain1 = iChain var f = {atomIndex=_atomPicked}.file var m = {atomIndex=_atomPicked}.model # Collect data var topno = {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)}.atomno.max + 0 var idmax = {(file=f) and (model=m)}.atomIndex.max var aO4 = atom_rcn(iResno, iChain, "O4\'") var aC1 = atom_rcn(iResno, iChain, "C1\'") var aC4 = atom_rcn(iResno, iChain, "C4\'") var aP = atom_rcn(iResno, iChain, "P") var aPxyz = aP.xyz + {0 0 0} var aOP1xyz = atom_rcn(iResno, iChain, "OP1").xyz + {0 0 0} var aOP2xyz = atom_rcn(iResno, iChain, "OP2").xyz + {0 0 0} var aC1xyz = aC1.xyz + {0 0 0} var aO4xyz = aO4.xyz + {0 0 0} var aO3xyz = atom_rcn(iResno, iChain, "O3\'").xyz + {0 0 0} var aC3xyz = atom_rcn(iResno, iChain, "C3\'").xyz + {0 0 0} var aC2xyz = atom_rcn(iResno, iChain, "C2\'").xyz + {0 0 0} var aO2xyz = atom_rcn(iResno, iChain, "O2\'").xyz + {0 0 0} var aC4xyz = aC4.xyz + {0 0 0} var aC5xyz = atom_rcn(iResno, iChain, "C5\'").xyz + {0 0 0} var aO5xyz = atom_rcn(iResno, iChain, "O5\'").xyz + {0 0 0} var isR = ((aC1 and {purine}).size > 0) var N1or9 = (isR ? "N9" : "N1") var C6or8 = (isR ? "C8" : "C6") if (aC1.group="PSU") { N1or9 = "C5" } var aN = atom_rcn(iResno, iChain, N1or9) var aC = atom_rcn(iResno, iChain, C6or8) var chi = angle(aO4, aC1, aN, aC) var dist = distance( aC1, aN) var bang = angle( aO4, aC1, aN) var bdh = angle( aC4, aO4, aC1, aN) gNa = aP.atomno # Delete the original delete {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} refresh # Gen NT ================================================== var isRna = (aO2xyz != {0 0 0}) gAppendNew = appendNew set appendNew false gA = "data \"append nt\"\n" gA += gen_nt(iResno, newres, isRna, false); gA += "end \"append nt\"" script inline @{gA} appendNew = gAppendNew # Recollect data and move new NT to coords of old isR = ((newres="A") or (newres="G")) N1or9 = (isR ? "N9" : "N1") C6or8 = (isR ? "C8" : "C6") N3or7 = (isR ? "N7" : "N3") aN = atom_rcn(iResno, iChain, N1or9) aC = atom_rcn(iResno, iChain, C6or8) var aN3or7 = atom_rcn(iResno, iChain, N3or7) var aC4 = atom_rcn(iResno, iChain, "C4\'") aO4 = atom_rcn(iResno, iChain, "O4\'") aC1 = atom_rcn(iResno, iChain, "C1\'") aP = atom_rcn(iResno, iChain, "P") var aO3 = atom_rcn(iResno, iChain, "O3\'") aP.xyz = aPxyz atom_rcn_xyz(iResno, iChain, "OP1", aOP1xyz) atom_rcn_xyz(iResno, iChain, "OP2", aOP2xyz) aC1.xyz = aC1xyz aO4.xyz = aO4xyz aO3.xyz = aO3xyz atom_rcn_xyz(iResno, iChain, "C3\'", aC3xyz) atom_rcn_xyz(iResno, iChain, "C2\'", aC2xyz) atom_rcn_xyz(iResno, iChain, "O2\'", aO2xyz) aC4.xyz = aC4xyz atom_rcn_xyz(iResno, iChain, "C5\'", aC5xyz) atom_rcn_xyz(iResno, iChain, "O5\'", aO5xyz) # Reconstruct base position on backbone select ((atomIndex > idmax) and base and (file=f) and (model=m)) color {selected} @gAltScheme set_distance_atoms( aC1, aN, dist) set_angle_atoms( aO4, aC1, aN, bang) set_dihedral_atoms( aC4, aO4, aC1, aN, bdh) set_angle_atoms( aC1, aN, aC, (isR ? 128.5 : 121.4)) set_dihedral_atoms( aC1, aN, aC, aN3or7, 180.0) set_dihedral_atoms( aO4, aC1, aN, aC, chi) # Connect the new NT var aO3m = atom_rcn(iResno-1, iChain, "O3\'") var aPp = atom_rcn(iResno+1, iChain, "P") connect @aP @aO3m connect @aO3 @aPp # Update atomnos topdif = {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)}.atomno.max - topno if (topdif != 0) { topmax = {(chain=iChain) and (file=f) and (model=m)}.atomno.max for (var i=(topno+1); i <= topmax; i++) { {(atomno=i) and (chain=iChain) and (file=f) and (model=m)}.atomno += topdif } } set echo TOP LEFT background ECHO yellow refresh gBusy = false } function convert_mb() { if (gBusy == false) { var idx = _atomPicked var isAmino = (({(atomIndex=idx) and amino}.size > 0) or ({atomIndex=idx}.group="SEC") or ({atomIndex=idx}.group="PYL")) var isNT = ({(atomIndex=idx) and (rna or dna)}.size > 0) var iResno = {atomIndex=idx}.resno var iGroup = {atomIndex=idx}.group var iChain = {atomIndex=idx}.chain var f = {atomIndex=idx}.file var m = {atomIndex=idx}.model var sels = "" select {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} halo on refresh if (isAmino) { if (kPHI.size == 0) { script $SCRIPT_PATH$ribozome.spt if (kPHI.size == 0) { prompt ("The Plico script ribozome.spt is required") quit } } sels = "ABCDEFGHIKLMNOPQRSTUVWXYZ" selp = " (enter 1 or 3 characters)" } else if (isNT) { if (kPu.size == 0) { script $SCRIPT_PATH$polymeraze.spt if (kPu.size == 0) { prompt ("The Plico script polymeraze.spt is required") quit } } sels = "ACGTU" selp = " (enter A, C, G, T, or U)" } if (sels.size > 0) { var ps = format("Change residue %d from %s to ?\n%s", iResno, iGroup, selp) newres = prompt(ps, "")%9999%0 if (isAmino and (newres.size==3)) { newres = g1from3[newres] } else if (newres.size==2) { newres = newres[2] } if ((newres != "") and (newres != "NULL")) { if (sels.find(newres[1]) > 0) { if (isAmino) { convert_aa(iResno, iChain, newres[1]) } else { convert_nt(iResno, iChain, newres[1]) } } else { prompt("Invalid entry") } } } else { prompt("Not a polypeptide or polynucleotide") } select {(resno=iResno) and (chain=iChain) and (file=f) and (model=m)} halo off } } function convert_exit_mb() { var f = (_frameID/1000000) var m = (_frameID%1000000) unbind set echo TOP LEFT echo set allowRotateSelected gAllowRotateSelected set allowMoveAtoms gAllowMoveAtoms select ((file=f) and (model=m)) color {selected} @gScheme select {gSelsave} } # Top level of Modify function plico_convert() { gBusy = false gSelsave = {selected} gPlico = "CONVERT RESIDUE" # Load common functions if not already if (kCommon < 3) { script $SCRIPT_PATH$plicoCommon.spt if (kCommon < 3) { prompt ("A newer version of plicoCommon.SPT is required") quit } } if (kNTcommon < 4) { script $SCRIPT_PATH$plicoNTcommon.spt if (kNTcommon < 4) { prompt ("A newer version of plicoNTcommon.SPT is required") quit } } set echo TOP LEFT background ECHO yellow gEcho = ("____CONVERT_RESIDUE____|ALT-CLICK=select|DOUBLE-CLICK=exit") echo @gEcho gChain = "" unbind bind "ALT-LEFT-CLICK" "_pickAtom"; bind "ALT-LEFT-CLICK" "+:convert_mb"; bind "DOUBLE" "convert_exit_mb"; } # End of CONVERT_RESIDUE.SPT