User:Remig/plico/toab

From Jmol
< User:Remig‎ | plico
Revision as of 16:28, 16 May 2014 by Remig (talk | contribs) (lc all functions)
Jump to navigation Jump to search

ToAlphaBeta allows the user to mark a section of a polypeptide chain to fold towards an alpha helix configuration or towards a beta strand configuration as described here.

ToAlphaBeta is a member of the Plico suite of protein folding tools described here. It may be installed and accessed as a macro with the file:

Title=PLICO To Alpha/Beta
Script=script <path to your scripts directory>/toab.spt;plicoToab

saved as plicotoab.macro in your .jmol/macros directory as described in Macro.

Copy and paste the following into a text editor and save in your scripts directory as toab.spt.

#   toAlphBeta - Jmol script by Ron Mignery
#   v1.2 beta    5/16/2014 -lc all functions
#
#   Move a stretch of polypeptide from alpha to beta or vice versa
#
gToab = FALSE
gToabAlt = FALSE

# Bound to LEFT-UP by to_ab_enable_drag
function to_ab_drag_done_mb() {
    if (not gToabAlt) {
        if (gNanchorIdx >= 0) {
            tugDragDoneMB()
        }
    }
    else {
        if (gCanchorIdx >= 0) {
            tugDragDoneMB()
        }
    }
}

# Bound to ALT-SHIFT-LEFT-DRAG by to_ab_enable_drag
function to_ab_drag_2_mb() {
    gToabAlt = TRUE
    to_ab_drag()
}

# Bound to ALT-LEFT-DRAG by to_ab_enable_drag
function toabDragMB() {
    gToabAlt = FALSE
    to_ab_drag()
}

function to_ab_drag() {
    if (not gBusy) {
        gBusy = TRUE
        var dx = (40.0 * (_mouseX - gMouseX))/_width
        var dy = (40.0 * (_mouseY - gMouseY))/_height
        var q = quaternion()
        var ptd = {@dx @dy 0}
        var pt = (!q)%ptd
        if (distance(pt,  {0 0 0}) > 0.004) {
        
            # If sidechain mode
            if (gSCidx >= 0) {
                if ({atomIndex=gSCidx}.atomName == "O") {
                    dir = ((abs(dx) > abs(dy))
                        ? ((dx < 0) ? 2 : -2)
                        : ((dy < 0) ? 2 : -2))
                    counterRotate(gSCidx, dir, not gToabAlt)
                }
                else {
                    gSCcheck = not gToabAlt
                    tugSideChain(pt)
                }
            }

            # Else
            else {

                # If new drag
                if (gNewDrag) {
                    gNewDrag = FALSE
                    save state gState
                }

                # Move the cargo
                select {gCargoSet}

                var phi = ((dx < 0) ? -57 : -90)
                var psi = ((dx < 0) ? -47 : 120)
                
                # Move between alpha and beta
                var nIdx = gNcargoIdx
                var iNidx = {(atomno=@{{chain=gChain}.atomno.min})
                    and (chain=gChain)}.atomIndex
                var maxIdx = {(atomno=@{{chain=gchain}.atomno.max})
                    and (chain=gchain)}.atomIndex
                var minIdx = {(atomno=@{{chain=gchain}.atomno.min})
                    and (chain=gchain)}.atomIndex
                while (TRUE) {
                
                    # Adjust phi
                    var ncIdx = getNwardBBidx(nIdx, gChain)
                    var caIdx = getCwardBBidx(nIdx, gChain)
                    var cIdx = getCwardBBidx(caIdx, gChain)
                    var dh= angle({atomIndex=ncIdx}, {atomIndex=nIdx},
                        {atomIndex=caIdx}, {atomIndex=cIdx}) 
                    var dir = ((phi > dh) ? abs(8*dx) : -(abs(8*dx)))
                    if (not gToabAlt) {
                        selectNwardIdx(nIdx, ((gNanchorIdx >= 0) ? gNcargoIdx : minIdx)) 
                    }
                    else {
                        selectCwardIdx(caIdx, ((gCanchorIdx >= 0) ? gCcargoIdx : maxIdx)) 
                    }
                    if (abs(phi-dh) > 0.5) {
                        rotateSelectedRecord(caIdx, {atomIndex=nIdx}, dir)
                    }
                
                    # Adjust psi
                    var cnIdx = getCwardBBidx (cIdx, gChain)
                    dh= angle({atomIndex=nIdx}, {atomIndex=caIdx},
                        {atomIndex=cIdx}, {atomIndex=cnIdx}) 
                    dir = ((psi > dh) ? abs(8*dx) : -(abs(8*dx)))
                    if (not gToabAlt) {
                        selectNwardIdx(caIdx, ((gNanchorIdx >= 0) ? gNcargoIdx : minIdx)) 
                    }
                    else {
                        selectCwardIdx(cIdx, ((gCanchorIdx >= 0) ? gCcargoIdx : maxIdx)) 
                    }
                    if (abs(psi-dh) > 0.5) {
                        rotateSelectedRecord(cIdx, {atomIndex=caIdx}, dir)
                    }
                    
                    if (gCcargoIdx== cIdx) {
                        break
                    }
                    nIdx = cnIdx
                } # endwhile
                
            }
            
            gMouseX = _mouseX
            gMouseY = _mouseY
        }
        
        select {gCargoSet}
        var lcset = (within(kCtolerance, FALSE, {selected})
            and not {selected} and not connected({selected}))
        gOk2 = TRUE
        if (lcset.size > 0) {
            for (var i = 1; i <= lcset.size; i++) {
                handleCollisions2(lcset[i].atomIndex)
            }
        }
        var bkc = (gOk2 ? "yellow" : "pink")
        background ECHO @bkc
         
        
        gBusy = FALSE
    }
}

# Called by tugCargoMB when gToab is true
function to_ab_enable_drag() {
    gEcho = "____Alpha <==> Beta____|ALT-CLICK=mark block|SHIFT-CLICK=anchors" +
        "|ALT-DRAG=move|SHIFT-ALT-DRAG=alt move|DOUBLE-CLICK=exit"
    echo @gEcho

    # Allow atoms to be dragged
    bind "ALT-LEFT-DOWN" "tugMarkMB";
    bind "ALT-LEFT-UP" "tugDragDoneMB";
    bind "ALT-LEFT-DRAG" "toabDragMB";
    bind "ALT-SHIFT-LEFT-UP" "to_ab_drag_done_mb";
    bind "ALT-SHIFT-LEFT-DRAG" "to_ab_drag_2_mb";

    unbind "SHIFT-LEFT-CLICK"
    bind "SHIFT-LEFT-CLICK" "_pickAtom";
    bind "SHIFT-LEFT-CLICK" "+:tugAnchorMB";

}

# Bound to ALT-LEFT-CLICK by plico_to_ab
function to_ab_cargo_mb() {
print "to_ab_cargo_mb()"#TBD
    gToab = TRUE
    tugCargoMB
}

# Top level of ToAlphaBeta
function plico_to_ab() {

    # Load tug functions if not already
    if (kTug < 3) {
        script $SCRIPT_PATH$tug.spt
        if (kTug < 3) {
            prompt ("A newer version of TUG.SPT is required")
            quit
        }
    }
    
    gPlico = "TO ALPHA/BETA"
    plico_prelim(TRUE)
    
    gEcho = ("____Alpha <==> Beta____|ALT-CLICK=mark block|DOUBLE-CLICK=exit")
    echo @gEcho
    gChain = ""
    unbind

    bind "ALT-LEFT-CLICK" "_pickAtom";
    bind "ALT-LEFT-CLICK" "+:to_ab_cargo_mb";
    bind "DOUBLE" "plico_exit";
}

# End of TOAB.SPT

Contributors

Remig