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

From Jmol
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.4 beta    5/16/2014 - add plico-prelim param
+
#  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 = 2
+
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
# Work around - Functions returning values must be in lower case for 14.0.13
 
 
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)
}
 
 
function angle_idx_3( a1idx, a2idx, a3idx) {
 
    return angle({atomIndex=a1idx}, {atomIndex=a2idx}, {atomIndex=a3idx})
 
 
}
 
}
  
Line 114: Line 109:
 
}
 
}
  
# Work around - Functions returning values must be in lower case for 14.0.13
+
# 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 = {*}.min.atomIndex; idx <= {*}.max.atomIndex; 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
}
 
 
function count_collision_in_select(rc) {
 
    var cAtoms = ({})
 
    var iChain = {selected}.chain
 
    for (var no = {selected}.min.atomno; no <= {selected}.max.atomno; no++) {
 
        a = {(atomno=no) and (chain=iChain)}
 
        if (a.size > 0) {
 
            var lcAtoms = (within(kCtolerance, FALSE, a)
 
                and {atomno != no} and not connected(a))
 
            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
 
 
}
 
}
  
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 all
+
    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 all
+
    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 all
+
                 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 all
+
        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

Contributors

Remig