Difference between revisions of "User:Remig/plico/remapNT"
(Add menu toggle) |
m |
||
| Line 12: | Line 12: | ||
Copy and paste the following to a text editor and save to your scripts directory as remapNT.spt: | Copy and paste the following to a text editor and save to your scripts directory as remapNT.spt: | ||
| − | <pre># | + | <pre># remap - Jmol script by Ron Mignery |
| − | # v1. | + | # v1.9 beta 9/11/2015 -use thisModel |
# | # | ||
| − | # Calculate or change | + | # Calculate or change polypeptide chain, atom number, residue names and/or residue |
| − | + | # numbers and print the resultant 1 char string | |
# | # | ||
| + | gAppendNew = false | ||
gBusy = false | gBusy = false | ||
| − | |||
| − | function | + | # Search for N-C-C-0 |
| − | + | function get_bb_nward_ca_idx(idx) { | |
| − | + | if ({atomIndex=idx}.element == "N") { | |
| − | + | var c1 = (connected({atomIndex=idx}) and not {hydrogen}) | |
| − | var | + | for (var i1 = 1; i1 <= c1.size; i1++) { |
| − | + | if (c1[i1].element == "C") { | |
| − | + | var c2 = (connected({atomIndex=@{c1[i1].atomIndex}}) and not {hydrogen}) | |
| − | for (var | + | for (var i2 = 1; i2 <= c2.size; i2++) { |
| − | + | if (c2[i2].element == "C") { | |
| − | + | var c3 = (connected({atomIndex=@{c2[i2].atomIndex}}) | |
| − | var | + | and not {hydrogen}) |
| − | for (var | + | for (var i3 = 1; i3 <= c3.size; i3++) { |
| − | if ( | + | if (c3[i3].element == "O") { |
| − | + | return c1[i1].atomIndex | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | |||
} | } | ||
} | } | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
} | } | ||
| − | |||
return -1 | return -1 | ||
} | } | ||
| − | function | + | # Find N-terminal N |
| − | select {atomIndex= | + | function find_n0_idx(aIdx) { |
| − | var | + | |
| − | while ( | + | select {atomIndex=aIdx} |
| − | for (var i = 1; i <= | + | var sSet = {selected} |
| − | + | while (sSet) { | |
| − | return | + | for (var i = 1; i <= sSet.size; i++) { |
| + | var idx = sSet[i].atomIndex | ||
| + | var caIdx = get_bb_nward_ca_idx(idx) | ||
| + | if (caIdx >= 0) { | ||
| + | var cset = connected({atomIndex=idx}) and not {hydrogen} | ||
| + | var ccset = connected(cset) and not {hydrogen} | ||
| + | if (cset.size < 2) { | ||
| + | return idx #*** | ||
| + | } | ||
| + | else if (({ccset and {carbon}}.size = 3) and (ccset.size == 4)) { | ||
| + | return idx #*** | ||
| + | } | ||
} | } | ||
| − | } | + | } # endfor |
| − | + | ||
| − | select {selected} or | + | sSet = connected({selected}) and not {selected} and not {hydrogen} |
| − | } | + | select {selected} or sSet |
| + | } # endwhile | ||
| + | |||
return -1 | return -1 | ||
} | } | ||
| − | # | + | # Bound to ALT-LEFT-CLICK by plico_remap |
| − | function | + | function remap_cargo_mb() { |
| − | + | var idx =_atomPicked | |
| − | |||
| − | |||
| − | var | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
if ({atomIndex=idx}.element == "H") { | if ({atomIndex=idx}.element == "H") { | ||
idx = connected({atomIndex=idx})[1].atomIndex | idx = connected({atomIndex=idx})[1].atomIndex | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | # If | + | # If n-terminal N can be found |
| − | var | + | var n0idx = find_n0_idx(idx) |
var isValid = false | var isValid = false | ||
var newResno = 1 | var newResno = 1 | ||
var newChain = "A" | var newChain = "A" | ||
var newAtomno = 1 | var newAtomno = 1 | ||
| − | + | if (n0idx >= 0) { | |
| − | if ( | ||
| − | + | # Prompt for new designators | |
| − | + | f = {atomIndex=n0idx}.file | |
| − | + | m = {atomIndex=n0idx}.model | |
| − | + | var iResno = {atomIndex=n0idx}.resno | |
| − | + | var iChain = {atomIndex=n0idx}.chain | |
| − | + | var iNo = {atomIndex=n0idx}.atomno | |
| − | + | select {thisModel} | |
| − | + | color {selected} @gScheme | |
| − | + | select {(chain=iChain) and thisModel} | |
| − | + | color {selected} @gAltScheme | |
| − | + | refresh | |
| − | + | var p = prompt("Enter n-terminal atom designator as\n" | |
| + | + " <resno>:<chain>.N#<atomno>", | ||
| + | format("%d:%s.N#%d", iResno, iChain, iNo)%0) | ||
| − | + | # If valid | |
| − | + | var iColon = p.find(":") | |
| − | + | if (iColon > 0) { | |
| − | + | var iDot = p.find(".") | |
| − | + | if (iDot > 0) { | |
| − | + | var iHash = p.find("#") | |
| − | + | if (iHash > 0) { | |
| − | + | newResno = 0 + (p[1][iColon-1]) | |
| − | + | newChain = p[iColon+1][iDot-1] | |
| − | + | newAtomno = 0 + (p[iHash+1][0]) | |
| − | + | if ((newResno > 0) | |
| − | + | and (newChain.size == 1) | |
| − | + | and (newAtomno > 0)) { | |
| − | + | isValid = true | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
} | } | ||
| Line 223: | Line 123: | ||
} | } | ||
} | } | ||
| + | if (isValid) { | ||
| − | + | delete {hydrogen and thisModel} | |
| − | + | delete {hoh and thisModel} | |
| − | + | delete %B and thisModel | |
| + | ssbonds off | ||
# Build inline pdb file | # Build inline pdb file | ||
| − | var ls = "data \"append | + | var ls = "data \"append remap\"\n" |
var rs = "" | var rs = "" | ||
| + | var ls1 = format("%s:", newChain) | ||
| − | select {atomIndex= | + | select {atomIndex=n0idx} |
var cSet = {selected} | var cSet = {selected} | ||
| − | var | + | var newAtomName = "N" |
var newGroup = "UNK" | var newGroup = "UNK" | ||
| − | var | + | var s1 = "X" |
| − | var | + | var newGreek = "" |
| − | var | + | var newCount = "" |
| − | var | + | var isCB = false |
| − | var | + | var nIdx = n0idx |
| − | var | + | var proDidx = -1 |
| − | + | var oxtIdx = -1 | |
| − | + | while ((nIdx >= n0idx) or (cSet)) { | |
| − | + | var s = array(1, 2, 3) | |
| − | + | var pTrp = 0 | |
| − | var s = array(1, 2, 3 | + | if (cSet.size == 0) { |
| − | var | + | ls += rs.replace("UNK", newGroup).replace(" SeG" , " SeG ") |
| − | + | ls1 += s1 | |
| − | + | rs = "" | |
| − | + | newResno++ | |
| − | + | nIdx = -1 | |
| − | + | proIdx = -1 | |
| − | + | newGroup = "UNK" | |
| − | + | s1 = "X" | |
| − | + | newAtomName = "N" | |
| − | + | isCB = false | |
| − | + | } | |
| − | + | else if (cSet.size == 1) { | |
| − | + | if (newAtomName == "N") { | |
| − | + | newGreek = "" | |
| − | + | newAtomName = "CA" | |
| − | + | } | |
| − | newGreek | + | else if (newAtomName == "CA") { |
| − | if ( | + | newGreek = "A" |
| − | + | newAtomName = "C" | |
| − | + | } | |
| − | + | else if (newAtomName == "C") { | |
| − | + | newGroup = "GLY" | |
| − | + | s1 = "G" | |
| + | newGreek = "" | ||
| + | newAtomName = "O" | ||
} | } | ||
| − | + | else if (newAtomName == "CB") { | |
| − | + | if (cSet[1].element == "C") { | |
| − | + | newGroup = "ALA" # for now | |
| − | + | s1 = "A" | |
| − | + | newGreek = "B" | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | newAtomName = "XG" | ||
} | } | ||
| − | + | else if (newAtomName == "XG") { | |
| − | + | if (proDidx >= 0) { | |
| − | + | newGroup = "PRO" | |
| − | + | s1 = "P" | |
| − | + | proDidx = -1 | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | if ( | ||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | + | if (cSet[1].element == "O") { # SER CYS SEC | |
| − | + | newGroup = "SER" | |
| − | + | s1 = "S" | |
| − | |||
| − | |||
} | } | ||
| − | + | else if (cSet[1].element == "S") { | |
| − | + | newGroup = "CYS" | |
| − | + | s1 = "C" | |
| − | |||
| − | |||
| − | if (cSet[ | ||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | else | + | else if (cSet[1].element == "Se") { |
| − | + | newGroup = "SEC" | |
| − | + | s1 = "U" | |
| − | |||
} | } | ||
| + | newGreek = "G" | ||
| + | newAtomName = "XD" | ||
} | } | ||
| − | + | else if (newAtomName == "XD") { | |
| − | + | if (newGroup == "VAL") { | |
| − | + | newGroup = "ILE" | |
| − | + | s1 = "I" | |
| − | + | newCount = "1" | |
| − | if ( | ||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | newGreek = "D" | ||
| + | newAtomName = "XE" | ||
} | } | ||
| − | + | else if (newAtomName == "XE") { | |
| − | if (cSet[ | + | newGroup = "MET" |
| − | + | s1 = "M" | |
| − | + | newGreek = "E" | |
| − | + | newAtomName = "XZ" | |
| + | } | ||
| + | else if (newAtomName == "XZ") { | ||
| + | if (cSet[1].element == "N") { | ||
| + | newGroup = "LYS" | ||
| + | s1 = "K" | ||
} | } | ||
else { | else { | ||
| − | + | newGroup = "PHE" # for now | |
| − | + | s1 = "F" | |
| − | |||
| − | |||
} | } | ||
| + | newGreek = "Z" | ||
| + | newAtomName = "XH" | ||
} | } | ||
| − | + | else if (newAtomName == "XH") { | |
| − | + | if (cSet[1].element == "O") { | |
| − | + | newGroup = "TYR" | |
| − | + | s1 = "Y" | |
| − | if (cSet[ | ||
| − | |||
| − | |||
} | } | ||
| − | else | + | else { |
| − | + | newGroup = "TRP" # for now | |
| − | + | s1 = "W" | |
| − | + | newCount = "2" | |
| − | |||
} | } | ||
| − | else { | + | newGreek = "H" |
| − | cSet[i].selected = false | + | newAtomName = "N" |
| + | } | ||
| + | } | ||
| + | else if (cSet.size == 2) { | ||
| + | var hasN = ((cSet[1].element == "N") or (cSet[2].element == "N")) | ||
| + | var hasO = ((cSet[1].element == "O") or (cSet[2].element == "O")) | ||
| + | |||
| + | # If CA 2 | ||
| + | if (newAtomName == "CA") { | ||
| + | var iKeep = -1 | ||
| + | for (var i = 1; i <= cSet.size; i++) { | ||
| + | if (connected(cSet[i]) > 2) { | ||
| + | iKeep = i | ||
| + | } | ||
| + | else { | ||
| + | proDidx = cSet[i].atomIndex | ||
| + | cSet[i].selected = false | ||
| + | } | ||
} | } | ||
| + | cSet = cSet[iKeep] | ||
| + | newGroup = "PRO" | ||
| + | s1 = "P" | ||
| + | newGreek = "A" | ||
| + | newAtomName = "C" | ||
| + | } | ||
| + | |||
| + | # Else if C or CB 2 | ||
| + | else if (newAtomName == "C") { | ||
| + | for (var i = 1; i <= cSet.size; i++) { | ||
| + | |||
| + | # If it connects O and (N or O) | ||
| + | var tSet = (connected(cSet[i]) and not {selected}) | ||
| + | var oCount = 0 | ||
| + | var nCount = 0 | ||
| + | for (var j = 1; j <= tSet.size; j++) { | ||
| + | oCount += ((tSet[j].element == "O") ? 1 : 0) | ||
| + | nCount += ((tSet[j].element == "N") ? 1 : 0) | ||
| + | } | ||
| + | if ((nCount > 0) or (oCount > 1)) { # C | ||
| + | newGreek = "" | ||
| + | newAtomName = "O" | ||
| + | } | ||
| + | else { # CB | ||
| + | isCB = true | ||
| + | cSet[i].selected = false | ||
| + | cSet = (cSet and not cSet[i]) | ||
| + | continue | ||
| + | } | ||
| + | } # endfor | ||
} | } | ||
| − | + | ||
| − | + | # Else if O or N 2 | |
| − | + | else if (newAtomName == "O") { | |
| − | + | var iKeep = -1 | |
| − | + | for (var i = 1; i <= cSet.size; i++) { | |
| − | + | if (cSet[i].element != "O") { | |
| − | + | if (cSet[i].element == "N") { | |
| − | + | nIdx = cSet[i].atomIndex | |
| − | + | } | |
| − | + | cSet[i].selected = false | |
| + | } | ||
| + | else { | ||
| + | iKeep = i | ||
| + | } | ||
} | } | ||
| + | cSet = cSet[iKeep] | ||
| + | newGreek = "" | ||
| + | newAtomName = (isCB ? "CB" : "N") | ||
| + | } | ||
| + | |||
| + | # Else if N or CB 2 | ||
| + | else if (newAtomName == "CB") { | ||
| + | for (var i = 1; i <= cSet.size; i++) { | ||
| + | if (cSet[i].element != "C") { | ||
| + | nIdx = cSet[i].atomIndex | ||
| + | cSet[i].selected = false | ||
| + | continue | ||
| + | } | ||
| + | newGreek = "B" | ||
| + | newAtomName = "XG" | ||
| + | } # endfor | ||
} | } | ||
| − | + | ||
| − | + | ||
| − | + | # Else if XG or XGn 2 | |
| − | if ( | + | else if (newAtomName == "XG") { # VAL THR ILE |
| − | + | newGroup = (hasO ? "THR" : "VAL") | |
| − | + | s1 = (hasO ? "T" : "V") | |
| + | newGreek = "G" | ||
| + | newAtomName = "XD" | ||
| + | } | ||
| + | |||
| + | |||
| + | # Else if XD or XDn 2 | ||
| + | else if (newAtomName == "XD") { # LEU ASP ASN | ||
| + | var cTrp = (connected(cSet[2]) and not {selected}) | ||
| + | var sTrp = ((trp) ? (trp[1].element=="N") : false) | ||
| + | if ((cSet[2].element != "C") or sTrp | ||
| + | or ((connected(cSet[1]) and not {selected}).size == 0)) { | ||
| + | bRev = true | ||
| + | } | ||
| + | if ((cSet[2].element == "O") or (cSet[1].element == "N") | ||
| + | or ((cSet[1].element == "C") and (cSet[2].element != "C"))) { | ||
| + | bRev = true | ||
| + | } | ||
| + | if (hasN) { | ||
| + | if (hasO) { | ||
| + | newGroup = "ASN" | ||
| + | s1 = "N" | ||
| + | } | ||
| + | else { | ||
| + | newGroup = "HIS" | ||
| + | s1 = "H" | ||
| + | } | ||
| + | } | ||
| + | else if (hasO) { | ||
| + | newGroup = "ASP" | ||
| + | s1 = "D" | ||
} | } | ||
else { | else { | ||
| − | + | newGroup = "LEU" # for now | |
| + | s1 = "L" | ||
} | } | ||
| + | newGreek = "D" | ||
| + | newAtomName = "XE" | ||
} | } | ||
| − | + | ||
| − | + | # Else if XE or XEn 2 | |
| − | + | else if (newAtomName == "XE") { # GLU GLN HIS | |
| − | + | if ((cSet[2].element == "O") or (cSet[1].element == "N") | |
| − | + | or ((cSet[1].element == "C") and (cSet[2].element != "C"))) { | |
| − | + | bRev = true | |
| − | + | } | |
| − | + | if (hasO) { | |
| − | + | if (hasN) { | |
| − | + | newGroup = "GLN" | |
| − | + | s1 = "Q" | |
| − | if ( | + | } |
| − | + | else { | |
| + | newGroup = "GLU" | ||
| + | s1 = "E" | ||
} | } | ||
} | } | ||
| + | newGreek = "E" | ||
| + | newAtomName = "XZ" | ||
} | } | ||
| − | + | ||
| − | + | # Else if XZ 2 | |
| − | + | else if (newAtomName == "XZ") { # ARG | |
| − | + | if (newGroup == "TRP") { | |
| − | + | pTrp = 1 | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | newGreek = "Z" | ||
| + | newAtomName = "XH" | ||
} | } | ||
| − | + | ||
| − | if ( | + | # Else if XH 2 |
| − | newGroup = " | + | else if (newAtomName == "XH") { # ARG |
| + | newGroup = "ARG" | ||
| + | s1 = "R" | ||
| + | newGreek = "H" | ||
| + | newAtomName = "N" | ||
} | } | ||
| − | + | } | |
| − | + | ||
| − | + | # Else cSet.size = 3 | |
| − | if ( | + | else { |
| − | + | # If O | |
| − | + | if (newAtomName == "O") { | |
| − | + | var oCount = 0 | |
| + | var iKeep = -1 | ||
| + | for (var i = 1; i <= cSet.size; i++) { | ||
| + | if (cSet[i].element != "O") { | ||
| + | if (cSet[i].element == "N") { | ||
| + | nIdx = cSet[i].atomIndex | ||
| + | } | ||
| + | cSet[i].selected = false | ||
| + | } | ||
| + | else { | ||
| + | oCount++ | ||
| + | if (iKeep < 0) { | ||
| + | iKeep = i | ||
| + | } | ||
| + | else { | ||
| + | oxtIdx = cSet[i].atomIndex | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | cset = cSet[iKeep[1]] | ||
| + | newGreek = "" | ||
| + | newAtomName = (isCB ? "CB" : "N") | ||
} | } | ||
| − | else { | + | else if (newAtomName == "CA") { # PRO |
| − | if ( | + | var iKeep = -1 |
| − | + | for (var i = 1; i <= cSet.size; i++) { | |
| − | + | if (connected(cSet[i]) > 2) { | |
| + | iKeep = i | ||
| + | } | ||
} | } | ||
| − | cSet = | + | cSet = cSet[iKeep] |
| + | |||
| + | newGreek = "A" | ||
| + | newAtomName = "C" | ||
} | } | ||
| − | + | else if (newAtomName == "XE") { # TRP | |
| − | + | for (var i = 1; i <= cSet.size; i++) { | |
| − | + | if (cSet[i].element == "N") { | |
| − | + | s[1] = i | |
| − | + | } | |
| − | + | else if (connected(cSet[i]) > 2) { | |
| − | + | s[2] = i | |
| − | + | } | |
| − | + | else { | |
| − | + | s[3] = i | |
| − | + | } | |
| − | + | } | |
| − | + | newGroup = "TRP" | |
| − | + | s1 = "W" | |
| − | + | newGreek = "E" | |
| − | + | newAtomName = "XZ" | |
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
else { | else { | ||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | |||
} | } | ||
| − | + | ||
for (var i = 1; i <= cSet.size; i++) { | for (var i = 1; i <= cSet.size; i++) { | ||
rs += format("ATOM %5d %-4sUNK ", newAtomNo, | rs += format("ATOM %5d %-4sUNK ", newAtomNo, | ||
| − | (cSet[i].element + newGreek | + | (cSet[s[i]].element + newGreek |
| − | rs += format("%s%4d %8.3f", newChain, newResno, cSet[i].x) | + | + ((cSet.size > 1) ? (i+pTrp) : newCount))) |
| − | rs += format("%8.3f%8.3f\n", cSet[i].y, cSet[i].z) | + | rs += format("%s%4d %8.3f", newChain, newResno, cSet[s[i]].x) |
| + | rs += format("%8.3f%8.3f\n", cSet[s[i]].y, cSet[s[i]].z) | ||
| + | if (newGreek == "XT") { | ||
| + | newGreek == "" | ||
| + | } | ||
newAtomno++ | newAtomno++ | ||
} | } | ||
| + | newCount = "" | ||
| + | cSet = (connected({selected}) and not {selected} | ||
| + | and not {atomIndex=@nIdx} and not {atomIndex=proDidx}) | ||
| + | select ({selected} or cSet and not {atomIndex=nIdx} | ||
| + | and not {atomIndex=proDidx}) | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} # endwhile | } # endwhile | ||
# Replace chain with new chain | # Replace chain with new chain | ||
| − | + | if (oxtIdx >= 0) { | |
| − | + | rs += format("ATOM %5d OXT UNK %s", newAtomNo, newChain) | |
| − | + | rs += format("%4d %8.3f", newResno, {atomIndex=oxtIdx}.x) | |
| − | + | rs += format("%8.3f%8.3f\n", {atomIndex=oxtIdx}.y, {atomIndex=oxtIdx}.z) | |
| − | |||
} | } | ||
| + | ls += rs.replace("UNK", newGroup).replace(" SeG" , " SeG ") | ||
| + | ls1 += s1 | ||
delete {selected} | delete {selected} | ||
| − | + | ls += "end \"append remap\"" | |
| − | ls += "end \"append | ||
gAppendNew = appendNew | gAppendNew = appendNew | ||
set appendNew false | set appendNew false | ||
script inline @{ls} | script inline @{ls} | ||
| − | set appendNew gAppendNew | + | set appendNew gAppendNew |
| + | var xx = {element="Xx"} | ||
| + | for (var i = 1; i <= xx.size; i++) { | ||
| + | connect 1.8 {atomindex=@{xx[i].atomIndex}} | ||
| + | } | ||
| + | ssbonds on | ||
| + | gEcho += format("|Chain %s has been rebuilt", newChain) | ||
| + | set echo TOP LEFT | ||
| + | echo @gEcho | ||
| + | print ls1 | ||
| + | |||
} | } | ||
else { | else { | ||
color {selected} @gScheme | color {selected} @gScheme | ||
} | } | ||
| − | |||
} | } | ||
| − | function | + | # Top level of Remap |
| − | + | function plico_remap() { | |
| − | + | ||
| − | + | # Load common functions if not already | |
| − | + | if (kCommon < 6) { | |
| − | + | script $SCRIPT_PATH$plicoCommon.spt | |
| − | + | if (kCommon < 6) { | |
| − | + | prompt ("A newer version of plicoCommon.SPT is required") | |
| − | + | quit | |
| − | |||
| − | |||
| − | |||
| − | if ( | ||
| − | |||
| − | if ( | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | gPlico = "Remap" | |
| − | + | plico_prelim(false, true) | |
| − | + | ||
| − | + | gEcho = "_______REMAP_______|ALT-CLICK=select chain|SHIFT-DOUBLE-CLICK=exit" | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | gEcho = " | ||
echo @gEcho | echo @gEcho | ||
| − | |||
| − | |||
| − | |||
set picking ON | set picking ON | ||
bind "ALT-LEFT-CLICK" "_pickAtom"; | bind "ALT-LEFT-CLICK" "_pickAtom"; | ||
| − | bind "ALT-LEFT-CLICK" "+: | + | bind "ALT-LEFT-CLICK" "+:remap_cargo_mb"; |
| − | bind "DOUBLE" " | + | bind "SHIFT-DOUBLE" "plico_exit(true)"; |
bind "LEFT-CLICK" "+:plico_menu_toggle"; | bind "LEFT-CLICK" "+:plico_menu_toggle"; | ||
} | } | ||
| − | + | # End of REMAP.SPT</pre> | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | # End of | ||
| − | </pre> | ||
Revision as of 14:41, 11 September 2015
RemapNT allows you to change the chain ID, atom numbers and/or residue numbers of a polynucleotide chain by mouse actions. It also calculates group values [nucleotide names (DU, A, etc.)]. Finally it prints the resultant 1 char string to the console.
When you click on a polynucleotide chain, it gives the current chain ID, residue, residue number and atom number of the most 5'ward atom in that chain. You may then edit any value (except residue). Remap then remaps the entire chain based on those values by conventional increments and identifies each nucleotide residue.
Note that it will also remove all waters, ligands, hydrogens and %B alternates when any chain is updated.
RemapNT 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 Remap Polynucleotide Script=script <path to your scripts folder>/remapNT.spt;plico_remap_nt
saved as plicoRemapNT.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 remapNT.spt:
# remap - Jmol script by Ron Mignery
# v1.9 beta 9/11/2015 -use thisModel
#
# Calculate or change polypeptide chain, atom number, residue names and/or residue
# numbers and print the resultant 1 char string
#
gAppendNew = false
gBusy = false
# Search for N-C-C-0
function get_bb_nward_ca_idx(idx) {
if ({atomIndex=idx}.element == "N") {
var c1 = (connected({atomIndex=idx}) and not {hydrogen})
for (var i1 = 1; i1 <= c1.size; i1++) {
if (c1[i1].element == "C") {
var c2 = (connected({atomIndex=@{c1[i1].atomIndex}}) and not {hydrogen})
for (var i2 = 1; i2 <= c2.size; i2++) {
if (c2[i2].element == "C") {
var c3 = (connected({atomIndex=@{c2[i2].atomIndex}})
and not {hydrogen})
for (var i3 = 1; i3 <= c3.size; i3++) {
if (c3[i3].element == "O") {
return c1[i1].atomIndex
}
}
}
}
}
}
}
return -1
}
# Find N-terminal N
function find_n0_idx(aIdx) {
select {atomIndex=aIdx}
var sSet = {selected}
while (sSet) {
for (var i = 1; i <= sSet.size; i++) {
var idx = sSet[i].atomIndex
var caIdx = get_bb_nward_ca_idx(idx)
if (caIdx >= 0) {
var cset = connected({atomIndex=idx}) and not {hydrogen}
var ccset = connected(cset) and not {hydrogen}
if (cset.size < 2) {
return idx #***
}
else if (({ccset and {carbon}}.size = 3) and (ccset.size == 4)) {
return idx #***
}
}
} # endfor
sSet = connected({selected}) and not {selected} and not {hydrogen}
select {selected} or sSet
} # endwhile
return -1
}
# Bound to ALT-LEFT-CLICK by plico_remap
function remap_cargo_mb() {
var idx =_atomPicked
if ({atomIndex=idx}.element == "H") {
idx = connected({atomIndex=idx})[1].atomIndex
}
# If n-terminal N can be found
var n0idx = find_n0_idx(idx)
var isValid = false
var newResno = 1
var newChain = "A"
var newAtomno = 1
if (n0idx >= 0) {
# Prompt for new designators
f = {atomIndex=n0idx}.file
m = {atomIndex=n0idx}.model
var iResno = {atomIndex=n0idx}.resno
var iChain = {atomIndex=n0idx}.chain
var iNo = {atomIndex=n0idx}.atomno
select {thisModel}
color {selected} @gScheme
select {(chain=iChain) and thisModel}
color {selected} @gAltScheme
refresh
var p = prompt("Enter n-terminal atom designator as\n"
+ " <resno>:<chain>.N#<atomno>",
format("%d:%s.N#%d", iResno, iChain, iNo)%0)
# If valid
var iColon = p.find(":")
if (iColon > 0) {
var iDot = p.find(".")
if (iDot > 0) {
var iHash = p.find("#")
if (iHash > 0) {
newResno = 0 + (p[1][iColon-1])
newChain = p[iColon+1][iDot-1]
newAtomno = 0 + (p[iHash+1][0])
if ((newResno > 0)
and (newChain.size == 1)
and (newAtomno > 0)) {
isValid = true
}
}
}
}
}
if (isValid) {
delete {hydrogen and thisModel}
delete {hoh and thisModel}
delete %B and thisModel
ssbonds off
# Build inline pdb file
var ls = "data \"append remap\"\n"
var rs = ""
var ls1 = format("%s:", newChain)
select {atomIndex=n0idx}
var cSet = {selected}
var newAtomName = "N"
var newGroup = "UNK"
var s1 = "X"
var newGreek = ""
var newCount = ""
var isCB = false
var nIdx = n0idx
var proDidx = -1
var oxtIdx = -1
while ((nIdx >= n0idx) or (cSet)) {
var s = array(1, 2, 3)
var pTrp = 0
if (cSet.size == 0) {
ls += rs.replace("UNK", newGroup).replace(" SeG" , " SeG ")
ls1 += s1
rs = ""
newResno++
nIdx = -1
proIdx = -1
newGroup = "UNK"
s1 = "X"
newAtomName = "N"
isCB = false
}
else if (cSet.size == 1) {
if (newAtomName == "N") {
newGreek = ""
newAtomName = "CA"
}
else if (newAtomName == "CA") {
newGreek = "A"
newAtomName = "C"
}
else if (newAtomName == "C") {
newGroup = "GLY"
s1 = "G"
newGreek = ""
newAtomName = "O"
}
else if (newAtomName == "CB") {
if (cSet[1].element == "C") {
newGroup = "ALA" # for now
s1 = "A"
newGreek = "B"
}
newAtomName = "XG"
}
else if (newAtomName == "XG") {
if (proDidx >= 0) {
newGroup = "PRO"
s1 = "P"
proDidx = -1
}
if (cSet[1].element == "O") { # SER CYS SEC
newGroup = "SER"
s1 = "S"
}
else if (cSet[1].element == "S") {
newGroup = "CYS"
s1 = "C"
}
else if (cSet[1].element == "Se") {
newGroup = "SEC"
s1 = "U"
}
newGreek = "G"
newAtomName = "XD"
}
else if (newAtomName == "XD") {
if (newGroup == "VAL") {
newGroup = "ILE"
s1 = "I"
newCount = "1"
}
newGreek = "D"
newAtomName = "XE"
}
else if (newAtomName == "XE") {
newGroup = "MET"
s1 = "M"
newGreek = "E"
newAtomName = "XZ"
}
else if (newAtomName == "XZ") {
if (cSet[1].element == "N") {
newGroup = "LYS"
s1 = "K"
}
else {
newGroup = "PHE" # for now
s1 = "F"
}
newGreek = "Z"
newAtomName = "XH"
}
else if (newAtomName == "XH") {
if (cSet[1].element == "O") {
newGroup = "TYR"
s1 = "Y"
}
else {
newGroup = "TRP" # for now
s1 = "W"
newCount = "2"
}
newGreek = "H"
newAtomName = "N"
}
}
else if (cSet.size == 2) {
var hasN = ((cSet[1].element == "N") or (cSet[2].element == "N"))
var hasO = ((cSet[1].element == "O") or (cSet[2].element == "O"))
# If CA 2
if (newAtomName == "CA") {
var iKeep = -1
for (var i = 1; i <= cSet.size; i++) {
if (connected(cSet[i]) > 2) {
iKeep = i
}
else {
proDidx = cSet[i].atomIndex
cSet[i].selected = false
}
}
cSet = cSet[iKeep]
newGroup = "PRO"
s1 = "P"
newGreek = "A"
newAtomName = "C"
}
# Else if C or CB 2
else if (newAtomName == "C") {
for (var i = 1; i <= cSet.size; i++) {
# If it connects O and (N or O)
var tSet = (connected(cSet[i]) and not {selected})
var oCount = 0
var nCount = 0
for (var j = 1; j <= tSet.size; j++) {
oCount += ((tSet[j].element == "O") ? 1 : 0)
nCount += ((tSet[j].element == "N") ? 1 : 0)
}
if ((nCount > 0) or (oCount > 1)) { # C
newGreek = ""
newAtomName = "O"
}
else { # CB
isCB = true
cSet[i].selected = false
cSet = (cSet and not cSet[i])
continue
}
} # endfor
}
# Else if O or N 2
else if (newAtomName == "O") {
var iKeep = -1
for (var i = 1; i <= cSet.size; i++) {
if (cSet[i].element != "O") {
if (cSet[i].element == "N") {
nIdx = cSet[i].atomIndex
}
cSet[i].selected = false
}
else {
iKeep = i
}
}
cSet = cSet[iKeep]
newGreek = ""
newAtomName = (isCB ? "CB" : "N")
}
# Else if N or CB 2
else if (newAtomName == "CB") {
for (var i = 1; i <= cSet.size; i++) {
if (cSet[i].element != "C") {
nIdx = cSet[i].atomIndex
cSet[i].selected = false
continue
}
newGreek = "B"
newAtomName = "XG"
} # endfor
}
# Else if XG or XGn 2
else if (newAtomName == "XG") { # VAL THR ILE
newGroup = (hasO ? "THR" : "VAL")
s1 = (hasO ? "T" : "V")
newGreek = "G"
newAtomName = "XD"
}
# Else if XD or XDn 2
else if (newAtomName == "XD") { # LEU ASP ASN
var cTrp = (connected(cSet[2]) and not {selected})
var sTrp = ((trp) ? (trp[1].element=="N") : false)
if ((cSet[2].element != "C") or sTrp
or ((connected(cSet[1]) and not {selected}).size == 0)) {
bRev = true
}
if ((cSet[2].element == "O") or (cSet[1].element == "N")
or ((cSet[1].element == "C") and (cSet[2].element != "C"))) {
bRev = true
}
if (hasN) {
if (hasO) {
newGroup = "ASN"
s1 = "N"
}
else {
newGroup = "HIS"
s1 = "H"
}
}
else if (hasO) {
newGroup = "ASP"
s1 = "D"
}
else {
newGroup = "LEU" # for now
s1 = "L"
}
newGreek = "D"
newAtomName = "XE"
}
# Else if XE or XEn 2
else if (newAtomName == "XE") { # GLU GLN HIS
if ((cSet[2].element == "O") or (cSet[1].element == "N")
or ((cSet[1].element == "C") and (cSet[2].element != "C"))) {
bRev = true
}
if (hasO) {
if (hasN) {
newGroup = "GLN"
s1 = "Q"
}
else {
newGroup = "GLU"
s1 = "E"
}
}
newGreek = "E"
newAtomName = "XZ"
}
# Else if XZ 2
else if (newAtomName == "XZ") { # ARG
if (newGroup == "TRP") {
pTrp = 1
}
newGreek = "Z"
newAtomName = "XH"
}
# Else if XH 2
else if (newAtomName == "XH") { # ARG
newGroup = "ARG"
s1 = "R"
newGreek = "H"
newAtomName = "N"
}
}
# Else cSet.size = 3
else {
# If O
if (newAtomName == "O") {
var oCount = 0
var iKeep = -1
for (var i = 1; i <= cSet.size; i++) {
if (cSet[i].element != "O") {
if (cSet[i].element == "N") {
nIdx = cSet[i].atomIndex
}
cSet[i].selected = false
}
else {
oCount++
if (iKeep < 0) {
iKeep = i
}
else {
oxtIdx = cSet[i].atomIndex
}
}
}
cset = cSet[iKeep[1]]
newGreek = ""
newAtomName = (isCB ? "CB" : "N")
}
else if (newAtomName == "CA") { # PRO
var iKeep = -1
for (var i = 1; i <= cSet.size; i++) {
if (connected(cSet[i]) > 2) {
iKeep = i
}
}
cSet = cSet[iKeep]
newGreek = "A"
newAtomName = "C"
}
else if (newAtomName == "XE") { # TRP
for (var i = 1; i <= cSet.size; i++) {
if (cSet[i].element == "N") {
s[1] = i
}
else if (connected(cSet[i]) > 2) {
s[2] = i
}
else {
s[3] = i
}
}
newGroup = "TRP"
s1 = "W"
newGreek = "E"
newAtomName = "XZ"
}
else {
}
}
for (var i = 1; i <= cSet.size; i++) {
rs += format("ATOM %5d %-4sUNK ", newAtomNo,
(cSet[s[i]].element + newGreek
+ ((cSet.size > 1) ? (i+pTrp) : newCount)))
rs += format("%s%4d %8.3f", newChain, newResno, cSet[s[i]].x)
rs += format("%8.3f%8.3f\n", cSet[s[i]].y, cSet[s[i]].z)
if (newGreek == "XT") {
newGreek == ""
}
newAtomno++
}
newCount = ""
cSet = (connected({selected}) and not {selected}
and not {atomIndex=@nIdx} and not {atomIndex=proDidx})
select ({selected} or cSet and not {atomIndex=nIdx}
and not {atomIndex=proDidx})
} # endwhile
# Replace chain with new chain
if (oxtIdx >= 0) {
rs += format("ATOM %5d OXT UNK %s", newAtomNo, newChain)
rs += format("%4d %8.3f", newResno, {atomIndex=oxtIdx}.x)
rs += format("%8.3f%8.3f\n", {atomIndex=oxtIdx}.y, {atomIndex=oxtIdx}.z)
}
ls += rs.replace("UNK", newGroup).replace(" SeG" , " SeG ")
ls1 += s1
delete {selected}
ls += "end \"append remap\""
gAppendNew = appendNew
set appendNew false
script inline @{ls}
set appendNew gAppendNew
var xx = {element="Xx"}
for (var i = 1; i <= xx.size; i++) {
connect 1.8 {atomindex=@{xx[i].atomIndex}}
}
ssbonds on
gEcho += format("|Chain %s has been rebuilt", newChain)
set echo TOP LEFT
echo @gEcho
print ls1
}
else {
color {selected} @gScheme
}
}
# Top level of Remap
function plico_remap() {
# Load common functions if not already
if (kCommon < 6) {
script $SCRIPT_PATH$plicoCommon.spt
if (kCommon < 6) {
prompt ("A newer version of plicoCommon.SPT is required")
quit
}
}
gPlico = "Remap"
plico_prelim(false, true)
gEcho = "_______REMAP_______|ALT-CLICK=select chain|SHIFT-DOUBLE-CLICK=exit"
echo @gEcho
set picking ON
bind "ALT-LEFT-CLICK" "_pickAtom";
bind "ALT-LEFT-CLICK" "+:remap_cargo_mb";
bind "SHIFT-DOUBLE" "plico_exit(true)";
bind "LEFT-CLICK" "+:plico_menu_toggle";
}
# End of REMAP.SPT