User:Remig/plico/toABnt

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

ToABnt allows the user to convert a polynucleotide chain or chain pair from A-form to B-form and vice versa. When you ALT-CLICK on any atom, you are prompted to convert its chain from its current form to either the A-form or the B-form. The two forms differ primarily in the pucker conformation of their sugar moieties. The A-form has its sugars in the C3'-endo conformation whereas the B-form has it in the C2'-endo conformation. The A-form is characteristic of RNA while the B-form is characteristic of DNA.

This routine is called automatically by the Plico routine Polymeraze when a polynucleotide is generated.

ToABnt 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 toAB NT
Script=script <path to your script directory>/toABnt.spt;plico_to_ab_nt

saved as toABnt.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 toABnt.spt.

#   toABnt - Jmol script by Ron Mignery
#   v1.4 beta    5/16/2014 -lc all functions
#
#   Convert a polynucleotide chain from A-form to B-form or vice versa
#
kC5O5PO3B = -71.0
kO5PO3C3B = -106.0
kPO3C3C4B = -160.67
kO3C3C4C5B = 125.44
kC3C4C5O5B = 55.65
kC4C5O5PB = 169.0

kO4C4C3C2B = 15.92
kC4O4C1C2B = -41.7
kC4O4C1NxB = -159.03
kC5C4O4C1B = 146.31
kC3C1C2O2B = -167.9

kPuB = 59.0
kPyB = 61.0

kC5O5PO3A = -59.3
kO5PO3C3A = -63.1
kPO3C3C4A = -157.4
kO3C3C4C5A = 75.5
kC3C4C5O5A = 49.55
kC4C5O5PA = 169.2

kO4C4C3C2A = -35.55
kC4O4C1C2A = 3.8
kC4O4C1NxA = -117.4
kC5C4O4C1A = 144.85
kC3C1C2O2A = 116.3

kPuA = 13.5
kPyA = 16.5

gToab = FALSE
gToabAlt = FALSE
gToA = FALSE

function to_ab_nt_auto(iChain, toA) {

    # Load common functions if not already
    load_common()

    gChain1 = iChain
    gToA = toA
    to_ab_nt(TRUE)
}

function to_ab_nt(auto) {
    if (not gBusy) {
        gBusy = TRUE
        
        select all
        g5cargoIdx = {(atomno=@{{chain=gChain1}.atomno.min})
            and (chain=gChain1)}.atomIndex
        g3cargoIdx = {(atomno=@{{chain=gChain1}.atomno.max})
            and (chain=gChain1)}.atomIndex
    
        # If new drag
        if (gNewDrag) {
            gNewDrag = FALSE
            save state gState
        }
    
        # Move the cargo
        select {gCargoSet}
        gChain1 = {atomIndex=g3cargoIdx}.chain
        gChain2 = ""
    
        # Move between A-form and B-form
        var res5 = {atomIndex=g5cargoIdx}.resno
        var res3 = {atomIndex=g3cargoIdx}.resno
        var pSet = ({})
        var bSet = ({})
        var k = -1
        var kmax = k
        var ang = 0
        var pang = 0
        var isP = FALSE
        for (var i = res5; i <= res3; i++) {
            var j = i-1
            var aO3 = {(resno=i) and (chain=gChain1) and (atomName="O3\'")}
            var aC3 = {(resno=i) and (chain=gChain1) and (atomName="C3\'")}
            var aC4 = {(resno=i) and (chain=gChain1) and (atomName="C4\'")}
            var aC5 = {(resno=i) and (chain=gChain1) and (atomName="C5\'")}
            var aO5 = {(resno=i) and (chain=gChain1) and (atomName="O5\'")}
            var aP =  {(resno=i) and (chain=gChain1) and (atomName="P")}
            if (i == res5) {
                if (auto == FALSE) {
                    var isForm = (is_form_a( i, gChain1) ? "A" : "B")
                    var p = prompt(format("Convert chain %s from %s-form to:",
                        gChain1, isForm), "A-form|B-form", TRUE)
                    if (p == "A-form") {
                        gToA = TRUE
                    }
                    else if (p == "B-form") {
                        gToA = FALSE
                    }
                    else {
                        color {all} @gScheme
                        break
                    }
                    background ECHO pink
                    refresh
                    print format("Converting to %s", p)
                }
    
                # If paired
                var lcAtoms = (within(3.0, FALSE,
                    {(resno=i) and (chain=gChain1) and base})
                    and not {chain=gChain1})
                isP = (lcAtoms.size > 0)
                gChain2 = (isP ? lcAtoms[1].chain : "")
                k = (isP ? lcAtoms[1].resno : -1)
                kmax = k
            }
            pSet = {(resno=k) and (chain=gChain2)}
            var bO3 = {(resno=k) and (chain=gChain2) and (atomName="O3\'")}
            var bC3 = {(resno=k) and (chain=gChain2) and (atomName="C3\'")}
            var bC4 = {(resno=k) and (chain=gChain2) and (atomName="C4\'")}
            var bC5 = {(resno=k) and (chain=gChain2) and (atomName="C5\'")}
            var bO5 = {(resno=k) and (chain=gChain2) and (atomName="O5\'")}
            var bP =  {(resno=k) and (chain=gChain2) and (atomName="P")}
    
            # If not 5' terminus
            var aC4p = ({})
            var aC3p = ({})
            var aO3p = ({})
            var bO5p = ({})
            var bC4p = ({})
            var bC3p = ({})
            var bO3p = ({})
            var bPp = ({})
            if (i > res5) {
                aC4p = {(resno=j) and (chain=gChain1) and (atomName="C4\'")}
                aC3p = {(resno=j) and (chain=gChain1) and (atomName="C3\'")}
                aO3p = {(resno=j) and (chain=gChain1) and (atomName="O3\'")}
    
                bO5p = {(resno=@{k+1}) and (chain=gChain2) and (atomName="O5\'")}
                bC4p = {(resno=@{k+1}) and (chain=gChain2) and (atomName="C4\'")}
                bC3p = {(resno=@{k+1}) and (chain=gChain2) and (atomName="C3\'")}
                bO3p = {(resno=@{k+1}) and (chain=gChain2) and (atomName="O3\'")}
                bPp = {(resno=@{k+1}) and (chain=gChain2) and (atomName="P")}

                select bSet or {(atomno < @{aP.atomno}) and
                    (atomno >= @{{atomIndex=g5cargoIdx}.atomno}) and (chain=gChain1)}
                set_dihedral_atoms(aP, aO3p, aC3p, aC4p, (gToA ? kPO3C3C4A : kPO3C3C4B))
    
                set_dihedral_atoms(aO5, aP, aO3p, aC3p, (gToA ? kO5PO3C3A : kO5PO3C3B))
    
                select bSet or {(atomno < @{aO5.atomno}) and
                    (atomno >= @{{atomIndex=g5cargoIdx}.atomno}) and (chain=gChain1)}
                set_dihedral_atoms(aC5, aO5, aP, aO3p, (gToA ? kC5O5PO3A : kC5O5PO3B))
            }
            select bSet or {(atomno < @{aO5.atomno}) and
                (atomno >= @{{atomIndex=g5cargoIdx}.atomno}) and (chain=gChain1)}
            set_dihedral_atoms(aC4, aC5, aO5, aP, (gToA ? kC4C5O5PA : kC4C5O5PB))
            select (bP or (connected(bP) and {resno=k}))
            set_dihedral_atoms(bC4, bC5, bO5, bP, (gToA ? kC4C5O5PA : kC4C5O5PB))
    
            select bSet or {(atomno < @{aC5.atomno}) and
                (atomno >= @{{atomIndex=g5cargoIdx}.atomno}) and (chain=gChain1)}
            set_dihedral_atoms(aC3, aC4, aC5, aO5, (gToA ? kC3C4C5O5A : kC3C4C5O5B))
            select (bP or (connected(bP) and {resno=k}))
            set_dihedral_atoms(bC3, bC4, bC5, bO5, (gToA ? kC3C4C5O5A : kC3C4C5O5B))
    
            select (({(resno >= k) and (chain=gChain2)}
                or {(resno <= i) and (chain=gChain1)}) and not aO3)
            set_dihedral_atoms(aO3, aC3, aC4, aC5, (gToA ? kO3C3C4C5A : kO3C3C4C5B))
            select bO3
            set_dihedral_atoms(bC5, bC4, bC3, bO3, (gToA ? kO3C3C4C5A : kO3C3C4C5B))
    
    
            var aC1 =  {(resno=i) and (chain=gChain1) and (atomName="C1\'")}
            var aC2 =  {(resno=i) and (chain=gChain1) and (atomName="C2\'")}
            var aO2 =  {(resno=i) and (chain=gChain1) and (atomName="O2\'")}
            var aO4 =  {(resno=i) and (chain=gChain1) and (atomName="O4\'")}
    
            var bC1 =  {(resno=k) and (chain=gChain2) and (atomName="C1\'")}
            var bC2 =  {(resno=k) and (chain=gChain2) and (atomName="C2\'")}
            var bO2 =  {(resno=k) and (chain=gChain2) and (atomName="O2\'")}
            var bO4 =  {(resno=k) and (chain=gChain2) and (atomName="O4\'")}
    
            # Set chi
            var aNx = -1
            var aCx = -1
            var bNx = -1
            var bCx = -1
            if ((aC1 and {purine}).size > 0) {
                aNx =  {(resno=i) and (chain=gChain1) and (atomName="N9")}
                aCx =  {(resno=i) and (chain=gChain1) and (atomName="C8")}
                bNx =  {(resno=k) and (chain=gChain2) and (atomName="N1")}
                bCx =  {(resno=k) and (chain=gChain2) and (atomName="C6")}
                ang = (gToA ? kPuA : kPuB)
                pang = (gToA ? kPyA : kPyB)
            }
            else {
                aNx =  {(resno=i) and (chain=gChain1) and (atomName="N1")}
                aCx =  {(resno=i) and (chain=gChain1) and (atomName="C6")}
                bNx =  {(resno=k) and (chain=gChain2) and (atomName="N9")}
                bCx =  {(resno=k) and (chain=gChain2) and (atomName="C8")}
                ang = (gToA ? kPyA : kPyB)
                pang = (gToA ? kPuA : kPuB)
            }
            select pSet or {(resno=i) and (chain=gChain1) and base}
            set_dihedral_atoms(aO4, aC1, aNx, aCx, ang)
            select {pSet and not base}
            set_dihedral_atoms(bCx, bNx, bC1, bO4, pang)
    
            # Set pucker 3' endo or 2' endo
            select pSet or {(resno=i) and (chain=gChain1) and base}
            set_dihedral_atoms(aC4, aO4, aC1, aNx, (gToA ? kC4O4C1NxA : kC4O4C1NxB))
            select {pSet and not base}
            set_dihedral_atoms(bNx, bC1, bO4, bC4, (gToA ? kC4O4C1NxA : kC4O4C1NxB))
    
            select (pSet or
                {((resno=i) and (chain=gChain1) and base) or aC1})
            set_dihedral_atoms(aC5, aC4, aO4, aC1, (gToA ? kC5C4O4C1A : kC5C4O4C1B))
            select {pSet and not base and not bC1}
            set_dihedral_atoms(bC1, bO4, bC4, bC5, (gToA ? kC5C4O4C1A : kC5C4O4C1B))
    
            select aC2 or aO2
            set_dihedral_atoms(aC4, aO4, aC1, aC2, (gToA ? kC4O4C1C2A : kC4O4C1C2B))
            if (aO2.size > 0) {
                ang = (gToA ? kC3C1C2O2A : kC3C1C2O2B)
                set_dihedral_atoms(aC3, aC1, aC2, aO2, (gToA ? kC3C1C2O2A : kC3C1C2O2B))
            }
            set_distance_atoms(aC3, aC2, 1.52)
            set_distance_atoms(aC1, aC2, 1.52)
            select bC2 or bO2
            set_dihedral_atoms(bC4, bO4, bC1, bC2, (gToA ? kC4O4C1C2A : kC4O4C1C2B))
            if (bO2.size > 0) {
                ang = (gToA ? kC3C1C2O2A : kC3C1C2O2B)
                set_dihedral_atoms(bC3, bC1, bC2, bO2, (gToA ? kC3C1C2O2A : kC3C1C2O2B))
            }
            set_distance_atoms(bC3, bC2, 1.52)
            set_distance_atoms(bC1, bC2, 1.52)
    
            refresh                
    
            bSet = bset or pSet
            if (k > 0) {
                k--
            }
    
        } # endfor
        
        gBusy = FALSE
        background ECHO yellow
        refresh
    }
}

# Bound to ALT-LEFT-CLICK by plicoto_ab_nt
function to_ab_chain_mb() {
    color {all} @gScheme
    gChain1 = {atomIndex=_atomPicked}.chain
    color {chain=gChain1} @gAltScheme
    refresh
    to_ab_nt(FALSE)
}

# Load common functions if not already
function load_common() {
    if (kCommon < 2) {
        script $SCRIPT_PATH$plicoCommon.spt
        if (kCommon < 2) {
            prompt ("A newer version of plicoCommon.SPT is required")
            quit
        }
    }
    if (kNTcommon < 2) {
        script $SCRIPT_PATH$plicoNTcommon.spt
        if (kNTcommon < 2) {
            prompt ("A newer version of plicoNTcommon.SPT is required")
            quit
        }
    }
}

# Top level of to_ab_nt
function plico_to_ab_nt() {

    # Load common functions if not already
    load_common()

    gPlico = "TO A-FORM/B-FORM"
    plico_prelim(FALSE)

    gEcho = ("________A <==> B_______|ALT-CLICK=mark chain|DOUBLE-CLICK=exit")
    echo @gEcho
    gChain = ""
    unbind

    bind "ALT-LEFT-CLICK" "_pickAtom";
    bind "ALT-LEFT-CLICK" "+:to_ab_chain_mb";
    bind "DOUBLE" "plico_exit";
}
# End of to_ab_nt.SPT

Contributors

Remig