User:Remig/plico/toab
< User:Remig | plico
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;plico_to_ab
saved as plicotoab.macro in your .jmol/macros directory as described in Macro.
A copy of the Plico scripts tug.spt and plicoCommon.spt must be in the same directory as this script.
Copy and paste the following into a text editor and save in your scripts directory as toab.spt.
# toAB - Jmol script by Ron Mignery
# v1.4 beta 7/24/2015 -add menu toggle
#
# Move a stretch of polypeptide from alpha to beta or vice versa
#
gToab = false
gToabAlt = false
gBusy = false
# Bound to LEFT-UP by to_ab_enable_drag
function to_ab_drag_done_mb() {
if (not gToabAlt) {
if (gNanchorIdx >= 0) {
tug_drag_done_mb()
}
}
else {
if (gCanchorIdx >= 0) {
tug_drag_done_mb()
}
}
}
# 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 to_ab_drag_mb() {
gToabAlt = false
to_ab_drag()
}
# Bound to ALT-LEFT-DOWN by tug_enable_drag
function tug_mark_mb() {
gMouseX = _mouseX
gMouseY = _mouseY
gNewDrag = true
}
function to_ab_drag() {
var f = (_frameID/1000000)
var m = (_frameID%1000000)
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") {
var 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
f = {atomIndex=_atomPicked}.file
m = {atomIndex=_atomPicked}.model
var nIdx = gNcargoIdx
var cmin = {(chain=gChain) and (file=f) and (model=m)}.atomno.min
var cmax = {(chain=gChain) and (file=f) and (model=m)}.atomno.max
var maxIdx = {(atomno=cmax) and (chain=gchain) and (file=f)
and (model=m)}.atomIndex
var minIdx = {(atomno=cmin) and (chain=gchain) and (file=f)
and (model=m)}.atomIndex
while (true) {
# Adjust phi
var ncIdx = get_nward_bb_idx(nIdx, gChain)
var caIdx = get_cward_bb_idx(nIdx, gChain)
var cIdx = get_cward_bb_idx(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) {
select_nward_idx(nIdx, ((gNanchorIdx >= 0) ? gNcargoIdx : minIdx))
}
else {
select_cward_idx(caIdx, ((gCanchorIdx >= 0) ? gCcargoIdx : maxIdx))
}
if (abs(phi-dh) > 0.5) {
rotate_selected_record(caIdx, {atomIndex=nIdx}, dir)
}
# Adjust psi
var cnIdx = get_cward_bb_idx (cIdx, gChain)
dh= angle({atomIndex=nIdx}, {atomIndex=caIdx},
{atomIndex=cIdx}, {atomIndex=cnIdx})
dir = ((psi > dh) ? abs(8*dx) : -(abs(8*dx)))
if (not gToabAlt) {
select_nward_idx(caIdx, ((gNanchorIdx >= 0) ? gNcargoIdx : minIdx))
}
else {
select_cward_idx(cIdx, ((gCanchorIdx >= 0) ? gCcargoIdx : maxIdx))
}
if (abs(psi-dh) > 0.5) {
rotate_selected_record(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++) {
handle_collisions(lcset[i].atomIndex)
}
}
var bkc = (gOk2 ? "yellow" : "pink")
background ECHO @bkc
gBusy = false
}
}
# Called by to_ab_cargo_mb 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" "tug_mark_mb";
bind "ALT-LEFT-UP" "tug_drag_done_mb";
bind "ALT-LEFT-DRAG" "to_ab_drag_mb";
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" "+:tug_anchor_mb";
}
# Bound to ALT-LEFT-CLICK by plico_to_ab
function to_ab_cargo_mb() {
gToab = true
tug_cargo_mb
}
# Top level of ToAlphaBeta
function plico_to_ab() {
# Load common functions if not already
if (kCommon < 6) {
script $SCRIPT_PATH$plicoCommon.spt
if (kCommon < 6) {
prompt ("A newer version of plicoCommon.SPT is required")
quit
}
}
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 = ""
gMenuMin = false
unbind
bind "ALT-LEFT-CLICK" "_pickAtom";
bind "ALT-LEFT-CLICK" "+:to_ab_cargo_mb";
bind "DOUBLE" "plico_exit";
bind "LEFT-CLICK" "+:plico_menu_toggle";
}
# End of TOAB.SPT