User:Remig/plico/plicoCommon
< User:Remig | plico
Jump to navigation
Jump to search
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.
# plicoCommon - Jmol script by Ron Mignery # v1.2 beta 5/1/2014 -add more # # Routines and values common to all Plico suite scripts # Must be present in the same directory as other Plico scripts that use it kCommon = 1 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" # Return L tetrahedron point if i1<i2<i3, else R point # Work around - Functions returning values must be in lower case for 14.0.13 function gettetidx(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 gettrigonalidx(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 setDistanceAtoms( static, mobile, desired) { try { var v = mobile.xyz - static.xyz var dist = distance(static, mobile) translateSelected @{((v * (desired/dist)) - v)} } catch { } } function setDistanceIdx( staticIdx, mobileIdx, desired) { setDistanceAtoms({atomIndex=staticIdx}, {atomIndex=mobileIdx}, desired) } # Selected must include third parameter but not the first function setAngleAtoms( 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 setAngleIdx( statorIdx, pivotIdx, rotorIdx, toangle) { setAngleAtoms({atomIndex=statorIdx}, {atomIndex=pivotIdx}, {atomIndex=rotorIdx}, toangle) } function angleIdx3( a1idx, a2idx, a3idx) { return angle({atomIndex=a1idx}, {atomIndex=a2idx}, {atomIndex=a3idx}) } # Selected must include fourth parameter but not the first function setDihedralAtoms( stator, pivot1, pivot2, rotor, toangle) { try { var curangle = angle(stator, pivot1, pivot2, rotor) rotateselected {pivot2} {pivot1} @{curangle-toangle} } catch { } } function setDihedralIdx( statorIdx, pivot1idx, pivot2idx, rotorIdx, toangle) { setDihedralAtoms({atomIndex = statorIdx}, {atomIndex = pivot1idx}, {atomIndex = pivot2idx}, {atomIndex = rotorIdx}, toangle) } function angleIdx4( a1idx, a2idx, a3idx, a4idx) { return angle({atomIndex=a1idx}, {atomIndex=a2idx}, {atomIndex=a3idx}, {atomIndex=a4idx}) } # Work around - Functions returning values must be in lower case for 14.0.13 function countcollisions(rc) { var cAtoms = ({}) for (var idx = {*}.min.atomIndex; idx <= {*}.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 } # A handy debug routine function cc { print countcollisions(TRUE) } # A handy debug routine function hi { var selsave = {selected} select all set hoverlabel "%D %U" select {selsave} } function plicoPrelim() { # Push selected gSelSaves = {selected} select all # Bad idea to proceed when collisions present while (TRUE) { var cc = countcollisions(({})).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 all 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} handleCollisions2( 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 } function plicoExit() { 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 != "") { plicoRecord("load tugsave.pdb;") } } } if (p != "No") { unbind halo off echo select all halo off star off color {selected} @gScheme draw gSCcircle DELETE gBusy = FALSE background ECHO yellow # Pop selected select gSelSaves } } # end of plicocommon.spt