User:Remig/plico/plicoCommon

From Jmol
< User:Remig‎ | plico
Revision as of 14:37, 1 May 2014 by Remig (talk | contribs) (Add more)
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

Contributors

Remig