Difference between revisions of "User:Remig/plico/plicoCommon"

From Jmol
Jump to navigation Jump to search
(Do not var globals)
(Add more)
Line 2: Line 2:
  
 
<pre>#  plicoCommon - Jmol script by Ron Mignery
 
<pre>#  plicoCommon - Jmol script by Ron Mignery
#  v1.1 beta    4/3/2014 -do not var globals for Jmol 14.0.13+
+
#  v1.2 beta    5/1/2014 -add more
 
#
 
#
 
#  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
+
#  Must be present in the same directory as other Plico scripts that use it
 
kCommon = 1
 
kCommon = 1
 
kDtolerance = 0.1
 
kDtolerance = 0.1
Line 11: Line 11:
 
kCtolerance = 1.85
 
kCtolerance = 1.85
 
kMtolerance = 0.8
 
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
 
# Return L tetrahedron point if i1<i2<i3, else R point
function getTetIdx(i1, i2, i3, dist) {
+
# 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 v1 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz
 
     var v2 = {atomIndex=i1}.xyz - {atomIndex=i2}.xyz
 
     var v2 = {atomIndex=i1}.xyz - {atomIndex=i2}.xyz
Line 29: Line 38:
 
}
 
}
  
function getTrigonalIdx(i1, i2, i3, dist) {
+
# 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 v1 = {atomIndex=i1}.xyz - {atomIndex=i2}.xyz
 
     var v2 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz
 
     var v2 = {atomIndex=i3}.xyz - {atomIndex=i2}.xyz
Line 78: Line 88:
 
     setAngleAtoms({atomIndex=statorIdx}, {atomIndex=pivotIdx},
 
     setAngleAtoms({atomIndex=statorIdx}, {atomIndex=pivotIdx},
 
         {atomIndex=rotorIdx}, toangle)
 
         {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
 
# Selected must include fourth parameter but not the first
function setDihedralAtoms( stator1, stator2, rotor1, rotor2, toangle) {
+
function setDihedralAtoms( stator, pivot1, pivot2, rotor, toangle) {
 
     try {
 
     try {
         var curangle =  angle(stator1, stator2, rotor1, rotor2)
+
         var curangle =  angle(stator, pivot1, pivot2, rotor)
         rotateselected {rotor1} {stator2} @{curangle-toangle}
+
         rotateselected {pivot2} {pivot1} @{curangle-toangle}
 
     }
 
     }
 
     catch {
 
     catch {
 
     }
 
     }
 
}
 
}
function setDihedralIdx( stator1idx, stator2idx, rotor1idx, rotor2idx, toangle) {
+
function setDihedralIdx( statorIdx, pivot1idx, pivot2idx, rotorIdx, toangle) {
     setDihedralAtoms({atomIndex = stator1idx}, {atomIndex = stator2idx},
+
     setDihedralAtoms({atomIndex = statorIdx}, {atomIndex = pivot1idx},
         {atomIndex = rotor1idx}, {atomIndex = rotor2idx}, toangle)
+
         {atomIndex = pivot2idx}, {atomIndex = rotorIdx}, toangle)
 +
}
 +
 
 +
function angleIdx4( a1idx, a2idx, a3idx, a4idx) {
 +
    return angle({atomIndex=a1idx}, {atomIndex=a2idx},
 +
        {atomIndex=a3idx}, {atomIndex=a4idx})
 
}
 
}
  
function countCollisions(rc) {
+
# Work around - Functions returning values must be in lower case for 14.0.13
 +
function countcollisions(rc) {
 
     var cAtoms = ({})
 
     var cAtoms = ({})
 
     for (var idx = {*}.min.atomIndex; idx <= {*}.max.atomIndex; idx++) {
 
     for (var idx = {*}.min.atomIndex; idx <= {*}.max.atomIndex; idx++) {
Line 103: Line 123:
 
                 and not connected({atomIndex=idx}))
 
                 and not connected({atomIndex=idx}))
 
             if (lcAtoms.size > 0) {
 
             if (lcAtoms.size > 0) {
                 cAtoms = cAtoms or lcAtoms
+
                 cAtoms = cAtoms or lcAtoms or {atomIndex=idx}
 
                 if (rc == TRUE) {
 
                 if (rc == TRUE) {
 
                     print format("Collision of idx=%d with %s", idx, lcAtoms)
 
                     print format("Collision of idx=%d with %s", idx, lcAtoms)
Line 110: Line 130:
 
         }
 
         }
 
     }
 
     }
     return cAtoms.size
+
     return cAtoms
 
}
 
}
  
Line 134: Line 154:
 
     # Bad idea to proceed when collisions present
 
     # Bad idea to proceed when collisions present
 
     while (TRUE) {
 
     while (TRUE) {
         var cc = countCollisions(({}))
+
         var cc = countcollisions(({})).size
 
         if (cc > 0) {
 
         if (cc > 0) {
 
             var p = prompt(format("%d collision%s present!\nProceed anyway?",
 
             var p = prompt(format("%d collision%s present!\nProceed anyway?",
Line 206: Line 226:
 
     }
 
     }
 
}
 
}
# end of plicoCommon.spt
+
# end of plicocommon.spt</pre>
</pre>
 

Revision as of 14:37, 1 May 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.

#   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

Contributors

Remig