Difference between revisions of "User:Remig/plico/plicoCommon"
< User:Remig | plico
Jump to navigation
Jump to search
(add plico-prelim param) |
(Add stuff) |
||
Line 3: | Line 3: | ||
Copy and paste the following into a text editor and save in your scripts folder as plicoCommon.spt. | Copy and paste the following into a text editor and save in your scripts folder as plicoCommon.spt. | ||
<pre># plicoCommon - Jmol script by Ron Mignery | <pre># plicoCommon - Jmol script by Ron Mignery | ||
− | # v1. | + | # v1.5 beta 7/16/2014 -handle multiple frames |
# | # | ||
# Routines and values common to all Plico suite scripts | # Routines and values common to all Plico suite scripts | ||
# Must be present in the same directory as other Plico scripts that use it | # Must be present in the same directory as other Plico scripts that use it | ||
− | kCommon = | + | kCommon = 3 |
kDtolerance = 0.1 | kDtolerance = 0.1 | ||
kAtolerance = 5.0 | kAtolerance = 5.0 | ||
Line 20: | Line 20: | ||
gScheme = "Jmol" | gScheme = "Jmol" | ||
gAltScheme = "Rasmol" | gAltScheme = "Rasmol" | ||
+ | gBusy = FALSE | ||
# Return L tetrahedron point if i1<i2<i3, else R point | # Return L tetrahedron point if i1<i2<i3, else R point | ||
− | |||
function get_tet_idx(i1, i2, i3, dist) { | function get_tet_idx(i1, i2, i3, dist) { | ||
var v1 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz | var v1 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz | ||
Line 72: | Line 72: | ||
set_distance_atoms({atomIndex=staticIdx}, {atomIndex=mobileIdx}, desired) | set_distance_atoms({atomIndex=staticIdx}, {atomIndex=mobileIdx}, desired) | ||
} | } | ||
− | |||
# Selected must include third parameter but not the first | # Selected must include third parameter but not the first | ||
Line 89: | Line 88: | ||
set_angle_atoms({atomIndex=statorIdx}, {atomIndex=pivotIdx}, | set_angle_atoms({atomIndex=statorIdx}, {atomIndex=pivotIdx}, | ||
{atomIndex=rotorIdx}, toangle) | {atomIndex=rotorIdx}, toangle) | ||
− | |||
− | |||
− | |||
− | |||
} | } | ||
Line 114: | Line 109: | ||
} | } | ||
− | # | + | # First and last are BB atoms |
+ | # Any side atoms in the range are also selected | ||
+ | function select_nward_idx (firstIdx, lastIdx) { | ||
+ | var f = (_frameID/1000000) | ||
+ | var m = (_frameID%1000000) | ||
+ | var firstno = ((firstIdx < 0) ? {atomIndex=lastIdx}.atomno : {atomIndex=firstIdx}.atomno) | ||
+ | var lastno = ((lastIdx < 0) ? firstno : {atomIndex=lastIdx}.atomno) | ||
+ | var iChain = ((firstIdx < 0) | ||
+ | ? {atomIndex=lastIdx}.chain : {atomIndex=firstIdx}.chain) | ||
+ | |||
+ | select ((atomno <= firstno) and (atomno >= lastno) and (chain = iChain) | ||
+ | and (file=f) and (model=m)) | ||
+ | if ({(atomno=firstno) and (chain=gChain) | ||
+ | and (file=f) and (model=m)}.atomName == "C") { # if psi | ||
+ | add_sc_to_select(firstno-1, TRUE, TRUE, iChain) | ||
+ | var a = {(atomno=@{firstno+1}) and (chain=iChain) and (file=f) and (model=m)} | ||
+ | a.selected = TRUE # add O | ||
+ | } | ||
+ | if ({(atomno=firstno) and (chain=iChain) | ||
+ | and (file=f) and (model=m)}.atomName == "CA") { | ||
+ | add_sc_to_select(firstno, TRUE, FALSE, iChain) | ||
+ | } | ||
+ | if ({(atomno=lastno) and (chain=iChain) | ||
+ | and (file=f) and (model=m)}.atomName == "C") { # if psi | ||
+ | add_sc_to_select(lastno-1, FALSE, FALSE, iChain) | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # First and last are BB atoms | ||
+ | # Any side atoms in the range are also selected | ||
+ | function select_cward_idx (firstIdx, lastIdx) { | ||
+ | var f = (_frameID/1000000) | ||
+ | var m = (_frameID%1000000) | ||
+ | var firstno = ((firstIdx < 0) ? gMaxNo : {atomIndex=firstIdx}.atomno) | ||
+ | var lastno = ((lastIdx < 0) ? 1 : {atomIndex=lastIdx}.atomno) | ||
+ | var iChain = ((firstIdx < 0) | ||
+ | ? {atomIndex=lastIdx}.chain : {atomIndex=firstIdx}.chain) | ||
+ | |||
+ | # If nWard anchor in range, begin selection with it | ||
+ | if ((gNanchorIdx >= 0) and ({atomIndex=gNanchorIdx}.chain == iChain)) { | ||
+ | var aNo = {atomIndex=gNanchorIdx}.atomno | ||
+ | if (aNo > firstNo) { | ||
+ | firstno = aNo | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # If cWard anchor in range, end selection with it | ||
+ | if ((gCanchorIdx >= 0) and ({atomIndex=gCanchorIdx}.chain == iChain)) { | ||
+ | var aNo = {atomIndex=gCanchorIdx}.atomno | ||
+ | if (aNo < lastNo) { | ||
+ | lastno = aNo | ||
+ | } | ||
+ | } | ||
+ | |||
+ | select ((atomno >= firstno) and (atomno <= lastno) and (chain = iChain) | ||
+ | and (file=f) and (model=m)) | ||
+ | |||
+ | if ({(atomno=firstno) and (chain=iChain) | ||
+ | and (file=f) and (model=m)}.atomName == "C") { # if psi | ||
+ | add_sc_to_select(firstno-1, FALSE, FALSE, iChain) | ||
+ | } | ||
+ | if ({(atomno=lastno) and (chain=iChain) | ||
+ | and (file=f) and (model=m)}.atomName == "CA") { | ||
+ | add_sc_to_select(lastno, TRUE, FALSE, iChain) | ||
+ | } | ||
+ | if ({(atomno=lastno) and (chain=iChain) | ||
+ | and (file=f) and (model=m)}.atomName == "C") { # if psi | ||
+ | add_sc_to_select(lastno-1, TRUE, TRUE, iChain) | ||
+ | var a = {(atomno=@{lastno+1}) and (chain=iChain) and (file=f) and (model=m)} | ||
+ | a.selected = TRUE # add O | ||
+ | } | ||
+ | } | ||
+ | |||
function count_collisions(rc) { | function count_collisions(rc) { | ||
+ | f = _frameID/1000000 | ||
+ | m = _frameID%1000000 | ||
var cAtoms = ({}) | var cAtoms = ({}) | ||
− | for (var idx = { | + | for (var idx = {(file=f) and (model=m)}.min.atomIndex; |
+ | idx <= {(file=f) and (model=m)}.max.atomIndex; idx++) { | ||
if ({atomIndex=idx}.size > 0) { | if ({atomIndex=idx}.size > 0) { | ||
var lcAtoms = (within(kCtolerance, FALSE, {atomIndex=idx}) | var lcAtoms = (within(kCtolerance, FALSE, {atomIndex=idx}) | ||
Line 135: | Line 205: | ||
function is_collision_in_select() { | function is_collision_in_select() { | ||
+ | var f = (_frameID/1000000) | ||
+ | var m = (_frameID%1000000) | ||
is = FALSE | is = FALSE | ||
var cAtoms = ({}) | var cAtoms = ({}) | ||
var iChain = {selected}.chain | var iChain = {selected}.chain | ||
for (var no = {selected}.min.atomno; no <= {selected}.max.atomno; no++) { | for (var no = {selected}.min.atomno; no <= {selected}.max.atomno; no++) { | ||
− | a = {(atomno=no) and (chain=iChain)} | + | a = {(atomno=no) and (chain=iChain) and (file=f) and (model=m)} |
if (a.size > 0) { | if (a.size > 0) { | ||
is = TRUE | is = TRUE | ||
Line 146: | Line 218: | ||
} | } | ||
return is | return is | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
Line 170: | Line 223: | ||
function cc { | function cc { | ||
print count_collisions(TRUE) | print count_collisions(TRUE) | ||
+ | } | ||
+ | |||
+ | # Utility | ||
+ | function atom_rcn( iResno, iChain, iName) { | ||
+ | f = (_frameID/1000000) | ||
+ | m = (_frameID%1000000) | ||
+ | return {(resno=iResno) and (chain=iChain) and (atomName=iName) | ||
+ | and (file=f) and (model=m)} | ||
+ | } | ||
+ | |||
+ | # Utility | ||
+ | function atom_noc( iNo, iChain) { | ||
+ | f = (_frameID/1000000) | ||
+ | m = (_frameID%1000000) | ||
+ | return {(atomno=iNo) and (chain=iChain) and (atomName=iName) | ||
+ | and (file=f) and (model=m)} | ||
} | } | ||
Line 175: | Line 244: | ||
function hi { | function hi { | ||
var selsave = {selected} | var selsave = {selected} | ||
− | select | + | var f = (_frameID/1000000) |
+ | var m = (_frameID%1000000) | ||
+ | select ((file=f) and (model=m)) | ||
set hoverlabel "%D %U" | set hoverlabel "%D %U" | ||
select {selsave} | select {selsave} | ||
Line 184: | Line 255: | ||
# Push selected | # Push selected | ||
gSelSaves = {selected} | gSelSaves = {selected} | ||
− | select | + | var f = (_frameID/1000000) |
− | + | var m = (_frameID%1000000) | |
+ | select ((file=f) and (model=m)) | ||
+ | |||
# Bad idea to proceed when collisions present | # Bad idea to proceed when collisions present | ||
while (repair) { | while (repair) { | ||
Line 196: | Line 269: | ||
} | } | ||
else if (p == "Repair") { | else if (p == "Repair") { | ||
− | select | + | select ((file=f) and (model=m)) |
allSet = {selected} | allSet = {selected} | ||
gChain = "XX" | gChain = "XX" | ||
Line 203: | Line 276: | ||
if ({atomIndex=idx}.chain != gChain) { | if ({atomIndex=idx}.chain != gChain) { | ||
gChain = {atomIndex=idx}.chain | gChain = {atomIndex=idx}.chain | ||
− | select {chain=gChain} | + | select {(chain=gChain) and (file=f) and (model=m)} |
handle_collisions( idx) | handle_collisions( idx) | ||
} | } | ||
Line 221: | Line 294: | ||
write tugsave.pdb | write tugsave.pdb | ||
select none | select none | ||
− | + | ||
gScheme = defaultColorScheme | gScheme = defaultColorScheme | ||
gAltScheme = ((gScheme == "jmol") ? "rasmol" : "jmol") | gAltScheme = ((gScheme == "jmol") ? "rasmol" : "jmol") | ||
Line 259: | Line 332: | ||
halo off | halo off | ||
echo | echo | ||
− | select | + | var f = (_frameID/1000000) |
+ | var m = (_frameID%1000000) | ||
+ | select ((file=f) and (model=m)) | ||
halo off | halo off | ||
star off | star off |
Revision as of 14:45, 16 July 2014
This script contains routines used by other scripts of the Plico suite. It must be located in the same directory as any script that uses these routines.
Copy and paste the following into a text editor and save in your scripts folder as plicoCommon.spt.
# plicoCommon - Jmol script by Ron Mignery # v1.5 beta 7/16/2014 -handle multiple frames # # Routines and values common to all Plico suite scripts # Must be present in the same directory as other Plico scripts that use it kCommon = 3 kDtolerance = 0.1 kAtolerance = 5.0 kCtolerance = 1.85 kMtolerance = 0.8 gMouseX = 0 gMouseY = 0 gMinNo = 1 gMaxNo = 9999 gOK = TRUE # global return value to work around jmol *feature* gOk2 = TRUE # " " gScheme = "Jmol" gAltScheme = "Rasmol" gBusy = FALSE # Return L tetrahedron point if i1<i2<i3, else R point function get_tet_idx(i1, i2, i3, dist) { var v1 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz var v2 = {atomIndex=i1}.xyz - {atomIndex=i2}.xyz var axis = cross(v1, v2) var pma = ({atomIndex=i1}.xyz + {atomIndex=i3}.xyz)/2 var pmo = {atomIndex=i2}.xyz + {atomIndex=i2}.xyz - pma var pt = pmo + (axis/axis) var v = pt - {atomIndex=i2}.xyz var cdist = distance(pt, {atomIndex=i2}) var factor = (dist/cdist) var lpt = v * factor return lpt + {atomIndex=i2}.xyz } # Work around - Functions returning values must be in lower case for 14.0.13 function get_trigonal_idx(i1, i2, i3, dist) { var v1 = {atomIndex=i1}.xyz - {atomIndex=i2}.xyz var v2 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz var pt = {atomIndex=i2}.xyz - (v1 + v2) var v = pt - {atomIndex=i2}.xyz var cdist = distance(pt, {atomIndex=i2}) var factor = (dist/cdist) var lpt = (v * factor) return lpt + {atomIndex=i2}.xyz } function abs( x) { if (x < 0) { x = -x } return x } # Selected must include second parameter but not the first function set_distance_atoms( static, mobile, desired) { try { var v = mobile.xyz - static.xyz var dist = distance(static, mobile) translateSelected @{((v * (desired/dist)) - v)} } catch { } } function set_distance_idx( staticIdx, mobileIdx, desired) { set_distance_atoms({atomIndex=staticIdx}, {atomIndex=mobileIdx}, desired) } # Selected must include third parameter but not the first function set_angle_atoms( stator, pivot, rotor, toangle) { try { var v1=stator.xyz - pivot.xyz var v2=rotor.xyz - pivot.xyz var axis = cross(v1, v2) + pivot.xyz var curangle = angle(stator, pivot, rotor) rotateselected @axis @pivot @{curangle-toangle} } catch { } } function set_angle_idx( statorIdx, pivotIdx, rotorIdx, toangle) { set_angle_atoms({atomIndex=statorIdx}, {atomIndex=pivotIdx}, {atomIndex=rotorIdx}, toangle) } # Selected must include fourth parameter but not the first function set_dihedral_atoms( stator, pivot1, pivot2, rotor, toangle) { try { var curangle = angle(stator, pivot1, pivot2, rotor) rotateselected {pivot2} {pivot1} @{curangle-toangle} } catch { } } function set_dihedral_idx( statorIdx, pivot1idx, pivot2idx, rotorIdx, toangle) { set_dihedral_atoms({atomIndex = statorIdx}, {atomIndex = pivot1idx}, {atomIndex = pivot2idx}, {atomIndex = rotorIdx}, toangle) } function angle_idx_4( a1idx, a2idx, a3idx, a4idx) { return angle({atomIndex=a1idx}, {atomIndex=a2idx}, {atomIndex=a3idx}, {atomIndex=a4idx}) } # First and last are BB atoms # Any side atoms in the range are also selected function select_nward_idx (firstIdx, lastIdx) { var f = (_frameID/1000000) var m = (_frameID%1000000) var firstno = ((firstIdx < 0) ? {atomIndex=lastIdx}.atomno : {atomIndex=firstIdx}.atomno) var lastno = ((lastIdx < 0) ? firstno : {atomIndex=lastIdx}.atomno) var iChain = ((firstIdx < 0) ? {atomIndex=lastIdx}.chain : {atomIndex=firstIdx}.chain) select ((atomno <= firstno) and (atomno >= lastno) and (chain = iChain) and (file=f) and (model=m)) if ({(atomno=firstno) and (chain=gChain) and (file=f) and (model=m)}.atomName == "C") { # if psi add_sc_to_select(firstno-1, TRUE, TRUE, iChain) var a = {(atomno=@{firstno+1}) and (chain=iChain) and (file=f) and (model=m)} a.selected = TRUE # add O } if ({(atomno=firstno) and (chain=iChain) and (file=f) and (model=m)}.atomName == "CA") { add_sc_to_select(firstno, TRUE, FALSE, iChain) } if ({(atomno=lastno) and (chain=iChain) and (file=f) and (model=m)}.atomName == "C") { # if psi add_sc_to_select(lastno-1, FALSE, FALSE, iChain) } } # First and last are BB atoms # Any side atoms in the range are also selected function select_cward_idx (firstIdx, lastIdx) { var f = (_frameID/1000000) var m = (_frameID%1000000) var firstno = ((firstIdx < 0) ? gMaxNo : {atomIndex=firstIdx}.atomno) var lastno = ((lastIdx < 0) ? 1 : {atomIndex=lastIdx}.atomno) var iChain = ((firstIdx < 0) ? {atomIndex=lastIdx}.chain : {atomIndex=firstIdx}.chain) # If nWard anchor in range, begin selection with it if ((gNanchorIdx >= 0) and ({atomIndex=gNanchorIdx}.chain == iChain)) { var aNo = {atomIndex=gNanchorIdx}.atomno if (aNo > firstNo) { firstno = aNo } } # If cWard anchor in range, end selection with it if ((gCanchorIdx >= 0) and ({atomIndex=gCanchorIdx}.chain == iChain)) { var aNo = {atomIndex=gCanchorIdx}.atomno if (aNo < lastNo) { lastno = aNo } } select ((atomno >= firstno) and (atomno <= lastno) and (chain = iChain) and (file=f) and (model=m)) if ({(atomno=firstno) and (chain=iChain) and (file=f) and (model=m)}.atomName == "C") { # if psi add_sc_to_select(firstno-1, FALSE, FALSE, iChain) } if ({(atomno=lastno) and (chain=iChain) and (file=f) and (model=m)}.atomName == "CA") { add_sc_to_select(lastno, TRUE, FALSE, iChain) } if ({(atomno=lastno) and (chain=iChain) and (file=f) and (model=m)}.atomName == "C") { # if psi add_sc_to_select(lastno-1, TRUE, TRUE, iChain) var a = {(atomno=@{lastno+1}) and (chain=iChain) and (file=f) and (model=m)} a.selected = TRUE # add O } } function count_collisions(rc) { f = _frameID/1000000 m = _frameID%1000000 var cAtoms = ({}) for (var idx = {(file=f) and (model=m)}.min.atomIndex; idx <= {(file=f) and (model=m)}.max.atomIndex; idx++) { if ({atomIndex=idx}.size > 0) { var lcAtoms = (within(kCtolerance, FALSE, {atomIndex=idx}) and {atomIndex > idx} and not {rc} and not connected({atomIndex=idx})) if (lcAtoms.size > 0) { cAtoms = cAtoms or lcAtoms or {atomIndex=idx} if (rc == TRUE) { print format("Collision of idx=%d with %s", idx, lcAtoms) } } } } return cAtoms } function is_collision_in_select() { var f = (_frameID/1000000) var m = (_frameID%1000000) is = FALSE var cAtoms = ({}) var iChain = {selected}.chain for (var no = {selected}.min.atomno; no <= {selected}.max.atomno; no++) { a = {(atomno=no) and (chain=iChain) and (file=f) and (model=m)} if (a.size > 0) { is = TRUE break } } return is } # A handy debug routine function cc { print count_collisions(TRUE) } # Utility function atom_rcn( iResno, iChain, iName) { f = (_frameID/1000000) m = (_frameID%1000000) return {(resno=iResno) and (chain=iChain) and (atomName=iName) and (file=f) and (model=m)} } # Utility function atom_noc( iNo, iChain) { f = (_frameID/1000000) m = (_frameID%1000000) return {(atomno=iNo) and (chain=iChain) and (atomName=iName) and (file=f) and (model=m)} } # A handy debug routine function hi { var selsave = {selected} var f = (_frameID/1000000) var m = (_frameID%1000000) select ((file=f) and (model=m)) set hoverlabel "%D %U" select {selsave} } function plico_prelim(repair) { # Push selected gSelSaves = {selected} var f = (_frameID/1000000) var m = (_frameID%1000000) select ((file=f) and (model=m)) # Bad idea to proceed when collisions present while (repair) { var cc = count_collisions(({})).size if (cc > 0) { var p = prompt(format("%d collision%s present!\nProceed anyway?", cc, ((cc > 1) ? "s" : "")), "OK|Cancel|Repair", TRUE) if (p == "Cancel") { quit } else if (p == "Repair") { select ((file=f) and (model=m)) allSet = {selected} gChain = "XX" for (var idx = {allSet}.atomIndex.min; idx <= {allSet}.atomIndex.max; idx++) { if ({atomIndex=idx}.chain != gChain) { gChain = {atomIndex=idx}.chain select {(chain=gChain) and (file=f) and (model=m)} handle_collisions( idx) } } } else { break } } else { break } } # endwhile gZoom = script("show zoom") gRotate = script("show rotation") write tugsave.pdb select none gScheme = defaultColorScheme gAltScheme = ((gScheme == "jmol") ? "rasmol" : "jmol") set echo TOP LEFT background ECHO yellow gChain = "" unbind } # gPlicoRecord is maintained by the macro pilcoRecord function plico_record(s) { var g = format("show file \"%s\"", gPlicoRecord) var ls = script(g) if (ls.find("FileNotFoundException")) { ls = "" } ls += s write var ls @gPlicoRecord } function plico_exit() { var p = "" if (gPlico.size > 0) { p = prompt(format("Exit %s?", gPlico), "Yes|No|Undo", TRUE) if (p == "Undo") { load tugsave.pdb script inline gZoom rotate @gRotate echo Tug session undone if (gPlicoRecord != "") { plico_record("load tugsave.pdb;") } } } if (p != "No") { unbind halo off echo var f = (_frameID/1000000) var m = (_frameID%1000000) select ((file=f) and (model=m)) halo off star off color {selected} @gScheme draw gSCcircle DELETE gBusy = FALSE background ECHO yellow # Pop selected select gSelSaves } } # end of plicocommon.spt