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

From Jmol
Jump to navigation Jump to search
m
m
 
Line 7: Line 7:
 
'''RemapNT''' is a member of the Plico suite of protein folding tools described [[User:Remig/plico|here]]. It may be installed and accessed as a macro with the file:
 
'''RemapNT''' is a member of the Plico suite of protein folding tools described [[User:Remig/plico|here]]. It may be installed and accessed as a macro with the file:
  
<pre>Title=PLICO Remap Polynucleotide
+
<pre>#  remapNT - Jmol script by Ron Mignery
Script=script <path to your scripts folder>/remapNT.spt;plico_remap_nt
+
#  v1.beta     4/12/2016 -require latest common includes
</pre>saved as plicoRemapNT.macro in your .jmol/macros directory as described in [[Macro]].
 
 
 
Copy and paste the following to a text editor and save to your scripts directory as remapNT.spt:
 
<pre>#  remap - Jmol script by Ron Mignery
 
#  v1.9 beta   9/11/2015 -use thisModel
 
 
#
 
#
#  Calculate or change polypeptide chain, atom number, residue names and/or residue
+
#  Calculate or change polynucleotide chain, atom number, residue names
#    numbers and print the resultant 1 char string
+
#    and/or residue numbers and print the resultant 1 char string
 
#
 
#
gAppendNew = false
 
 
gBusy = false
 
gBusy = false
 +
kRemapNT=2
 +
 +
function find_5_prime(pIdx) {
 +
    while (pIdx >= 0) {
 +
 +
        # Find C3'
 +
        var c3pIdx = -1
 +
        select {atomIndex=pIdx}
 +
        var cSet = {selected}
 +
        for (var i = 1; i <= cSet.size; i++) {
 +
            var ocSet = connected(cSet[i])
 +
            for (var j = 1; j <= ocSet.size; j++) {
 +
                var occSet = connected(ocSet[j]) and not {atomIndex=pIdx}
 +
                for (var k = 1; k <= occSet.size; k++) {
 +
                    if (connected(occSet[k]).size > 2) {
 +
                        c3pIdx = 0 + occSet[k].atomIndex
 +
                    }
 +
                }
 +
            }
 +
        }
  
# Search for N-C-C-0
+
        if (c3pIdx < 0) {
function get_bb_nward_ca_idx(idx) {
+
            return pIdx
    if ({atomIndex=idx}.element == "N") {
+
        }
         var c1 = (connected({atomIndex=idx}) and not {hydrogen})
+
        # Find C4'
         for (var i1 = 1; i1 <= c1.size; i1++) {
+
        var endIdx = -1
             if (c1[i1].element == "C") {
+
         cSet = connected({atomIndex=c3pIdx}) and not {oxygen}
                var c2 = (connected({atomIndex=@{c1[i1].atomIndex}}) and not {hydrogen})
+
         for (var i = 1; i <= cSet.size; i++) {
                for (var i2 = 1; i2 <= c2.size; i2++) {
+
             var ocSet = connected(cSet[i]) and {oxygen}
                    if (c2[i2].element == "C") {
+
            for (var j = 1; j <= ocSet.size; j++) {
                         var c3 = (connected({atomIndex=@{c2[i2].atomIndex}})
+
                if (connected(ocSet[j]).size > 1) {
                            and not {hydrogen})
+
                    if (endIdx = -1) {
                         for (var i3 = 1; i3 <= c3.size; i3++) {
+
                        endIdx = 0 + cSet[i].atomIndex
                             if (c3[i3].element == "O") {
+
                    }
                                return c1[i1].atomIndex
+
                    else {
                            }
+
                         var Ox = connected(ocSet[j]) and not {atomindex=@{cset[i].atomIndex}}
 +
                         if (connected(Ox) > 1) {
 +
                             endIdx = 0 + cSet[i].atomIndex
 
                         }
 
                         }
 +
                   
 
                     }
 
                     }
 
                 }
 
                 }
 
             }
 
             }
 +
        }
 +
 +
        # Find C5'
 +
        var c5idx = -1
 +
        cSet = (connected({atomIndex=endIdx}) and not {atomIndex=c3pIdx}
 +
            and not {oxygen})
 +
        if (cSet) {
 +
            c5idx = 0 + cSet[1].atomIndex
 +
        }
 +
 +
        # Find O5'
 +
        var o5idx = -1
 +
        cSet = connected({atomIndex=c5idx}) and {oxygen}
 +
        if (cSet) {
 +
            o5idx = 0 + cSet[1].atomIndex
 +
        }
 +
 +
        if (o5idx < 0) {
 +
            return c5idx
 +
        }
 +
 +
        # Find P
 +
        pIdx = -1
 +
        cSet = connected({atomIndex=o5idx}) and {phosphorus}
 +
        if (cSet) {
 +
            Pidx =  0 + cSet[1].atomIndex
 +
        }
 +
 +
        if (Pidx < 0) {
 +
            return o5idx
 
         }
 
         }
 
     }
 
     }
 +
 
     return -1
 
     return -1
 
}
 
}
  
# Find N-terminal N
+
function find_p_idx(idx) {
function find_n0_idx(aIdx) {
+
    select {atomIndex=idx}
 +
    var cSet = {selected}
 +
    while (cSet) {
 +
        for (var i = 1; i <= cSet.size; i++) {
 +
            if (cSet[i].element == "P") {
 +
                return cSet[i].atomIndex
 +
            }
 +
        }
 +
        cSet = connected({selected}) and not {selected} and not {hydrogen}
 +
        select {selected} or cset
 +
    }
 +
    return -1
 +
}
  
     select {atomIndex=aIdx}
+
# cSet, s, and newGreek are arrays and thus passed by reference
     var sSet = {selected}
+
function ring_common(cSet, nIdx, s, newGreek, nextGreek) {
     while (sSet) {
+
     if (cSet.size > 2) {
        for (var i = 1; i <= sSet.size; i++) {
+
        print format("Unrecognized structure with set %s", cSet)
            var idx = sSet[i].atomIndex
+
    }
            var caIdx = get_bb_nward_ca_idx(idx)
+
     var oldGreek = 0 + newGreek[1]
             if (caIdx >= 0) {
+
     newGreek[1] = nextGreek
                 var cset = connected({atomIndex=idx}) and not {hydrogen}
+
    for (var i = 1; i <= cSet.size; i++) {
                 var ccset = connected(cset) and not {hydrogen}
+
        var ccSet = connected(cSet[i])
                 if (cset.size < 2) {
+
        if (ccSet.size == 1) {
                    return idx #***
+
             if (cSet[i].element == ccSet[1].element) {
                }
+
                 s[2] = i
                else if (({ccset and {carbon}}.size = 3) and (ccset.size == 4)) {
+
                s[1] = ((i > 1) ? 1 : 2)
                    return idx #***
+
                 newGreek[i] = 1 + nextGreek
                 }
+
                 newGreek[s[1]] = nextGreek
 +
                return cSet[s[1]].atomIndex
 +
            }
 +
            else {
 +
                s[1] = i
 +
                s[2] = ((i > 1) ? 1 : 2)
 +
                newGreek[i] = oldGreek
 +
                newGreek[s[2]] = nextGreek
 +
                 return cSet[s[2]].atomIndex
 
             }
 
             }
         } # endfor
+
         }
       
+
     }
        sSet = connected({selected}) and not {selected} and not {hydrogen}
+
     return cSet[1].atomIndex
        select {selected} or sSet
 
     } # endwhile
 
   
 
     return -1
 
 
}
 
}
  
# Bound to ALT-LEFT-CLICK by plico_remap
+
# Bound to ALT-LEFT-CLICK by plico_remap_nt
function remap_cargo_mb() {
+
function remap_nt_cargo_mb() {
 
     var idx =_atomPicked
 
     var idx =_atomPicked
 
 
     if ({atomIndex=idx}.element == "H") {
 
     if ({atomIndex=idx}.element == "H") {
 
         idx = connected({atomIndex=idx})[1].atomIndex
 
         idx = connected({atomIndex=idx})[1].atomIndex
 
     }
 
     }
 +
    delete {hydrogen}
 +
    delete {hoh}
 +
    delete %B
 +
    delete ligands
 +
    connect
 +
 +
    remap_nt( idx, false, 0)
 +
   
 +
    set echo TOP LEFT
 +
    echo @gEcho
 +
    background ECHO yellow
 +
    refresh
 +
    print_1c_chain( newChain)
 +
}
 +
       
 +
function remap_nt(idx, auto, base) {
  
     # If n-terminal N can be found
+
     # If P can be found
     var n0idx = find_n0_idx(idx)
+
     var pIdx = find_p_idx(idx)
 
     var isValid = false
 
     var isValid = false
 
     var newResno = 1
 
     var newResno = 1
 
     var newChain = "A"
 
     var newChain = "A"
 
     var newAtomno = 1
 
     var newAtomno = 1
     if (n0idx >= 0) {
+
    var t5idx = -1
 +
     if (pIdx >= 0) {
  
         # Prompt for new designators
+
         t5idx = find_5_prime(pIdx)
         f = {atomIndex=n0idx}.file
+
         if (t5idx >= 0) {
        m = {atomIndex=n0idx}.model
+
            var f = {atomIndex=t5idx}.file
        var iResno = {atomIndex=n0idx}.resno
+
            var m = {atomIndex=t5idx}.model
        var iChain = {atomIndex=n0idx}.chain
+
            newResno = {atomIndex=t5idx}.resno
        var iNo = {atomIndex=n0idx}.atomno
+
            newChain = {atomIndex=t5idx}.chain
        select {thisModel}
+
            newAtomno = {atomIndex=t5idx}.atomno
        color {selected} @gScheme
+
            select {thisModel}
        select {(chain=iChain) and thisModel}
+
            color {selected} @gScheme
        color {selected} @gAltScheme
+
            select {(chain=newChain) and thisModel}
        refresh
+
            color {selected} @gAltScheme
        var p = prompt("Enter n-terminal atom designator as\n"
+
            refresh
            + "  <resno>:<chain>.N#<atomno>",
 
            format("%d:%s.N#%d", iResno, iChain, iNo)%0)
 
  
        # If valid
+
            if (auto) {
        var iColon = p.find(":")
+
                newResno = base
        if (iColon > 0) {
+
                isValid = true
            var iDot = p.find(".")
+
                newChain = gChain1
            if (iDot > 0) {
+
            }
                var iHash = p.find("#")
+
            else {
                if (iHash > 0) {
+
           
                    newResno = 0 + (p[1][iColon-1])
+
                # Prompt for new designators
                    newChain = p[iColon+1][iDot-1]
+
                var p = prompt(("Enter 5\'-terminal atom designator as\n"
                    newAtomno = 0 + (p[iHash+1][0])
+
                    + "  <resno>:<chain>#<atomno>"),
                    if ((newResno > 0)
+
                    format("%d:%s#%d", newResno, newChain, newAtomno))%0
                        and (newChain.size == 1)
+
                # If valid
                        and (newAtomno > 0)) {
+
                if (p != "null") {
                            isValid = true
+
                    var iColon = p.find(":")
 +
                    if (iColon > 0) {
 +
                        var iHash = p.find("#")
 +
                        if (iHash > 0) {
 +
                            newResno = 0 + (p[1][iColon-1])
 +
                            newChain = p[iColon+1][iHash-1]
 +
                            newAtomno = 0 + (p[iHash+1][0])
 +
                            if ((newResno > 0)
 +
                                and (newChain.size == 1)
 +
                                and (newAtomno > 0)) {
 +
                                    isValid = true
 +
                            }
 +
                        }
 +
                    }
 +
                    if (not isValid) {
 +
                        prompt ("Entry not valid!")
 
                     }
 
                     }
 
                 }
 
                 }
Line 123: Line 216:
 
         }
 
         }
 
     }
 
     }
 +
 
     if (isValid) {
 
     if (isValid) {
 
+
         background ECHO pink
        delete {hydrogen and thisModel}
+
         refresh
        delete {hoh and thisModel}
 
         delete %B and thisModel
 
         ssbonds off
 
  
 
         # Build inline pdb file
 
         # Build inline pdb file
         var ls = "data \"append remap\"\n"
+
         var ls = "data \"append remapNT\"\n"   # global PDB atom record
 
         var rs = ""
 
         var rs = ""
        var ls1 = format("%s:", newChain)
 
  
         select {atomIndex=n0idx}
+
         select {atomIndex=t5idx}
 
         var cSet = {selected}
 
         var cSet = {selected}
         var newAtomName = "N"
+
         var nextAtomName = {atomIndex=t5idx}.element
 
         var newGroup = "UNK"
 
         var newGroup = "UNK"
         var s1 = "X"
+
         var newGreek = array("", "", "", "")
         var newGreek = ""
+
         var nIdx = t5idx
         var newCount = ""
+
         var c1pIdx = -1
         var isCB = false
+
         var o3pIdx = -1
         var nIdx = n0idx
+
         var stopIdx = -1
         var proDidx = -1
+
         var endIdx = -1
         var oxtIdx = -1
+
         var isRNA = false
         while ((nIdx >= n0idx) or (cSet)) {
+
        var first = true
             var s = array(1, 2, 3)
+
        var psu = false
             var pTrp = 0
+
         while (cSet) {
             if (cSet.size == 0) {
+
             var s = array(1, 2, 3, 4)
                    ls += rs.replace("UNK", newGroup).replace(" SeG" , " SeG ")
+
             var iKeep = -1
                    ls1 += s1
+
            var iDrop = -1
                    rs = ""
+
             switch( nextAtomName) {
                    newResno++
+
            case "O" :
                    nIdx = -1
+
                newGreek[1] = (first ? "5\'" : "P3")
                    proIdx = -1
+
                nextAtomName = (first ? "C5\'" : "P")
                    newGroup = "UNK"
+
                nIdx = cSet[1].atomIndex
                    s1 = "X"
+
                break
                     newAtomName = "N"
+
            case "P" :
                     isCB = false
+
                newGreek[1] = ""
            }
+
                nextAtomName = "OP"
            else if (cSet.size == 1) {
+
                nIdx = cSet[1].atomIndex
                if (newAtomName == "N") {
+
                break
                    newGreek = ""
+
            case "OP" :
                     newAtomName = "CA"
+
                var oc5set = ({})
 +
                for (var i = 1; i <= cSet.size; i++) {
 +
                     newGreek[i] = ""
 +
                     if (connected(cSet[i]).size > 1) {
 +
                        s[cSet.size] = i
 +
                        newGreek[cSet.size] = "5\'"
 +
                        oc5set = connected(cSet[i]) and {carbon}
 +
                        nIdx = cSet[i].atomIndex
 +
                     }
 
                 }
 
                 }
                 else if (newAtomName == "CA") {
+
                 var isP1 = false
                     newGreek = "A"
+
                if (cSet.size > 3) {
                     newAtomName = "C"
+
                     newGreek[1] = "P1"
                }
+
                     newGreek[2] = "P2"
                else if (newAtomName == "C") {
+
                     newGreek[3] = "P3"
                     newGroup = "GLY"
+
                     s[1] = 1
                     s1 = "G"
+
                     s[2] = 2
                     newGreek = ""
+
                     s[3] = 3
                     newAtomName = "O"
+
                 }              
                 }
+
                 else {
                 else if (newAtomName == "CB") {
+
                    for (var i = 1; i <= cSet.size; i++) {
                    if (cSet[1].element == "C") {
+
                        if (i != s[cSet.size]) {
                        newGroup = "ALA" # for now
+
                            if ((isP1 == false)
                        s1 = "A"
+
                                and (abs(angle(cSet[i], {atomIndex=pIdx},
                         newGreek = "B"
+
                                cSet[s[cSet.size]], oc5set[1])) < 90.0)) {
 +
                                s[1] = i
 +
                                newGreek[1] = "P1"
 +
                                isP1 = true
 +
                            }
 +
                            else {
 +
                                s[2] = i
 +
                                newGreek[2] = "P2"
 +
                            }
 +
                         }
 
                     }
 
                     }
                    newAtomName = "XG"
 
 
                 }
 
                 }
                 else if (newAtomName == "XG") {
+
                 #nIdx = pIdx
                     if (proDidx >= 0) {
+
                nextAtomName = "C5\'"
                         newGroup = "PRO"
+
                break
                         s1 = "P"
+
            case "C5\'" :
                         proDidx = -1
+
                nIdx = cSet[1].atomIndex
 +
                newGreek[1] = "5\'"
 +
                nextAtomName = "C4\'"
 +
                break
 +
            case "C4\'" :
 +
                nIdx = cSet[1].atomIndex
 +
                newGreek[1] = "4\'"
 +
                nextAtomName = "C3\'"
 +
                break
 +
            case "C3\'" :
 +
                for (var i = 1; i <= cSet.size; i++) {
 +
                     if (cSet[i].element == "O") {
 +
                         s[1] = i
 +
                        newGreek[1] = "4\'"
 +
                         cSet[i].selected = false
 +
                         stopIdx = cSet[i].atomIndex
 
                     }
 
                     }
                     if (cSet[1].element == "O") { # SER CYS SEC
+
                     else {
                         newGroup = "SER"
+
                        s[2] = i
                         s1 = "S"
+
                         newGreek[2] = "3\'"
 +
                         nIdx = cSet[i].atomIndex
 +
 
 
                     }
 
                     }
                     else if (cSet[1].element == "S") {
+
                }
                         newGroup = "CYS"
+
                nextAtomName = "O3\'"
                         s1 = "C"
+
                break
 +
            case "O3\'" :
 +
                for (var i = 1; i <= cSet.size; i++) {
 +
                     if (cSet[i].element == "O") {
 +
                         s[1] = i
 +
                        newGreek[1] = "3\'"
 +
                         o3pIdx = cSet[i].atomIndex
 
                     }
 
                     }
                     else if (cSet[1].element == "Se") {
+
                     else {
                         newGroup = "SEC"
+
                        s[2] = i
                         s1 = "U"
+
                         newGreek[2] = "2\'"
 +
                         nIdx = cSet[i].atomIndex
 
                     }
 
                     }
                    newGreek = "G"
 
                    newAtomName = "XD"
 
 
                 }
 
                 }
                 else if (newAtomName == "XD") {
+
                 nextAtomName = "C2\'"
                     if (newGroup == "VAL") {
+
                break
                         newGroup = "ILE"
+
            case "C2\'" :
                         s1 = "I"
+
                pIdx = -1
                         newCount = "1"
+
                for (var i = 1; i <= cSet.size; i++) {
 +
                     if (cSet[i].element == "P") {
 +
                         pIdx = cSet[i].atomIndex
 +
                         cSet = cSet and not cSet[i]
 +
                         break
 
                     }
 
                     }
                    newGreek = "D"
 
                    newAtomName = "XE"
 
 
                 }
 
                 }
                 else if (newAtomName == "XE") {
+
                 for (var i = 1; i <= cSet.size; i++) {
                    newGroup = "MET"
+
                     if (cSet[i].element == "O") {
                    s1 = "M"
+
                         s[1] = i
                    newGreek = "E"
+
                        newGreek[1] = "2\'"
                    newAtomName = "XZ"
+
                         isRNA = true
                }
 
                else if (newAtomName == "XZ") {
 
                     if (cSet[1].element == "N") {
 
                         newGroup = "LYS"
 
                         s1 = "K"
 
 
                     }
 
                     }
 
                     else {
 
                     else {
                         newGroup = "PHE" # for now
+
                         s[2] = i
                         s1 = "F"
+
                        newGreek[2] = "1\'"
 +
                         c1pIdx = cSet[i].atomIndex
 +
                        nIdx = cSet[i].atomIndex
 
                     }
 
                     }
                    newGreek = "Z"
 
                    newAtomName = "XH"
 
 
                 }
 
                 }
                 else if (newAtomName == "XH") {
+
                 nextAtomName = "C1\'"
                     if (cSet[1].element == "O") {
+
                break
                         newGroup = "TYR"
+
            case "C1\'" :
                         s1 = "Y"
+
                for (var i = 1; i <= cSet.size; i++) {
 +
                    if (cSet[i].element == "N") {
 +
                        iKeep = i
 +
                        nIdx = cSet[i].atomIndex
 +
                     }
 +
                    else if ((cSet[i].element == "C") and
 +
                        ((connected(cSet[i]) and {oxygen}).size == 0)) { #PSU
 +
                        psu = true
 +
                         iKeep = i
 +
                         nIdx = cSet[i].atomIndex
 
                     }
 
                     }
 
                     else {
 
                     else {
                         newGroup = "TRP" # for now
+
                         cSet[i].selected = false
                        s1 = "W"
 
                        newCount = "2"
 
 
                     }
 
                     }
                    newGreek = "H"
 
                    newAtomName = "N"
 
 
                 }
 
                 }
            }
+
                cSet = cSet[iKeep]
            else if (cSet.size == 2) {
+
                 var ccSet = connected(cSet[1]) and not {atomIndex=c1pIdx}
                 var hasN = ((cSet[1].element == "N") or (cSet[2].element == "N"))
+
                 newGreek[1] = "9"
                 var hasO = ((cSet[1].element == "O") or (cSet[2].element == "O"))
+
                nextAtomName = "N9u"
 
+
                 newGroup = "PU"
                # If CA 2
+
                for (var j = 1; j <= ccSet.size; j++) {
                 if (newAtomName == "CA") {
+
                    if ((connected(ccSet[j]) and {oxygen}) > 0) {
                    var iKeep = -1
+
                         newGreek[1] = "1"
                    for (var i = 1; i <= cSet.size; i++) {
+
                        nextAtomName = "N1y"
                        if (connected(cSet[i]) > 2) {
+
                         newGroup = "PY"
                            iKeep = i
 
                        }
 
                         else {
 
                            proDidx = cSet[i].atomIndex
 
                            cSet[i].selected = false
 
                         }
 
 
                     }
 
                     }
                    cSet = cSet[iKeep]
 
                    newGroup = "PRO"
 
                    s1 = "P"
 
                    newGreek = "A"
 
                    newAtomName = "C"
 
                }
 
 
                # Else if C or CB 2
 
                else if (newAtomName == "C") {
 
                    for (var i = 1; i <= cSet.size; i++) {
 
 
                        # If it connects O and (N or O)
 
                        var tSet = (connected(cSet[i]) and not {selected})
 
                        var oCount = 0
 
                        var nCount = 0
 
                        for (var j = 1; j <= tSet.size; j++) {
 
                            oCount += ((tSet[j].element == "O") ? 1 : 0)
 
                            nCount += ((tSet[j].element == "N") ? 1 : 0)
 
                        }
 
                        if ((nCount > 0) or (oCount > 1)) { # C
 
                            newGreek = ""
 
                            newAtomName = "O"
 
                        }
 
                        else { # CB
 
                            isCB = true
 
                            cSet[i].selected = false
 
                            cSet = (cSet and not cSet[i])
 
                            continue
 
                        }
 
                    } # endfor
 
                }
 
 
                # Else if O or N 2
 
                else if (newAtomName == "O") {
 
                    var iKeep = -1
 
                    for (var i = 1; i <= cSet.size; i++) {
 
                        if (cSet[i].element != "O") {
 
                            if (cSet[i].element == "N") {
 
                                nIdx = cSet[i].atomIndex
 
                            }
 
                            cSet[i].selected = false
 
                        }
 
                        else {
 
                            iKeep = i
 
                        }
 
                    }
 
                    cSet = cSet[iKeep]
 
                    newGreek = ""
 
                    newAtomName = (isCB ? "CB" : "N")
 
                }
 
 
                # Else if N or CB 2
 
                else if (newAtomName == "CB") {
 
                    for (var i = 1; i <= cSet.size; i++) {
 
                        if (cSet[i].element != "C") {
 
                            nIdx = cSet[i].atomIndex
 
                            cSet[i].selected = false
 
                            continue
 
                        }
 
                        newGreek = "B"
 
                        newAtomName = "XG"
 
                    } # endfor
 
 
                 }
 
                 }
 
+
                 break
 
+
            case "N1y" :
                 # Else if XG or XGn 2
+
                 for (var i = 1; i <= cSet.size; i++) {
                else if (newAtomName == "XG") { # VAL THR ILE
+
                     if (connected(cSet[i]) > 2) {
                    newGroup = (hasO ? "THR" : "VAL")
+
                         iKeep = i
                    s1 = (hasO ? "T" : "V")
+
                         nIdx = cSet[i].atomIndex
                    newGreek = "G"
 
                    newAtomName = "XD"
 
                 }
 
 
 
 
 
                # Else if XD or XDn 2
 
                else if (newAtomName == "XD") { # LEU ASP ASN
 
                    var cTrp = (connected(cSet[2]) and not {selected})
 
                    var sTrp = ((trp) ? (trp[1].element=="N") : false)
 
                     if ((cSet[2].element != "C") or sTrp
 
                        or ((connected(cSet[1]) and not {selected}).size == 0)) {
 
                         bRev = true
 
                    }
 
                    if ((cSet[2].element == "O") or (cSet[1].element == "N")
 
                         or ((cSet[1].element == "C") and (cSet[2].element != "C"))) {
 
                        bRev = true
 
                    }
 
                    if (hasN) {
 
                        if (hasO) {
 
                            newGroup = "ASN"
 
                            s1 = "N"
 
                        }
 
                        else {
 
                            newGroup = "HIS"
 
                            s1 = "H"
 
                        }
 
                    }
 
                    else if (hasO) {
 
                        newGroup = "ASP"
 
                        s1 = "D"
 
 
                     }
 
                     }
 
                     else {
 
                     else {
                         newGroup = "LEU" # for now
+
                         stopIdx = cSet[i].atomIndex
                        s1 = "L"
 
 
                     }
 
                     }
                    newGreek = "D"
 
                    newAtomName = "XE"
 
 
                 }
 
                 }
 
+
                cSet = cSet[iKeep]
                 # Else if XE or XEn 2
+
                 newGreek[1] = "2"
                 else if (newAtomName == "XE") { # GLU GLN HIS
+
                 nextAtomName = "C2"
                    if ((cSet[2].element == "O") or (cSet[1].element == "N")
+
                break
                        or ((cSet[1].element == "C") and (cSet[2].element != "C"))) {
+
            case "N9u" :
                         bRev = true
+
                # Find N-C-N-C-N
                     }
+
                for (var i = 1; i <= cSet.size; i++) {
                     if (hasO) {
+
                    var n1atom = (connected(cSet[i]) and {nitrogen}
                         if (hasN) {
+
                         and not {atomIndex=nIdx})
                            newGroup = "GLN"
+
                     var c2set = connected(n1atom) and {carbon} and not cSet[i]
                            s1 = "Q"
+
                     for (var j = 1; j <= c2set.size; j++) {
                        }
+
                         if ((connected(c2set[j]) and {nitrogen}) > 1) {
                        else {
+
                             iDrop = i
                             newGroup = "GLU"
 
                            s1 = "E"
 
 
                         }
 
                         }
 
                     }
 
                     }
                    newGreek = "E"
 
                    newAtomName = "XZ"
 
 
                 }
 
                 }
 
+
                stopIdx = cSet[iDrop].atomIndex
                 # Else if XZ 2
+
                cSet = cSet and not cSet[iDrop]
                 else if (newAtomName == "XZ") { # ARG
+
                nIdx = cSet[1].atomIndex
                    if (newGroup == "TRP") {
+
                newGreek[1] = "8"
                         pTrp = 1
+
                nextAtomName = "C8"
 +
                 break
 +
            case "C8" :
 +
                 nIdx = ring_common( cSet, nIdx, s, newGreek, "7")
 +
                nextAtomName = "N7"
 +
                break
 +
            case "N7" :
 +
                nIdx = ring_common( cSet, nIdx, s, newGreek, "5")
 +
                nextAtomName = "C5"
 +
                break
 +
            case "C5" :
 +
                if (isRNA and (newGroup == "DU ")) {
 +
                    var c5set = {atomIndex=nIdx} or connected({atomIndex=nIdx})
 +
                    if (angle(c5set[1], c5set[2], c5set[3]) < 114.0) {
 +
                         newGroup = "D  "
 
                     }
 
                     }
                    newGreek = "Z"
 
                    newAtomName = "XH"
 
 
                 }
 
                 }
 
+
                 nIdx = ring_common( cSet, nIdx, s, newGreek, "6")
                 # Else if XH 2
+
                 if ((newGroup == "DU ") and (cSet.size > 1)) {
                 else if (newAtomName == "XH") { # ARG
+
                     newGroup = "DT "
                     newGroup = "ARG"
+
                }
                     s1 = "R"
+
                nextAtomName = "C6"
                     newGreek = "H"
+
                break
                     newAtomName = "N"
+
            case "C6" :
 +
                if (newGroup == "PU") {
 +
                     nIdx = ring_common( cSet, nIdx, s, newGreek, "1")
 +
                     newGroup = ((cSet[1].element == "O") ? "DG " : "DA ")
 +
                     nextAtomName = "N1"
 
                 }
 
                 }
            }
+
                else {
 
+
                    if (psu) {
            # Else cSet.size = 3
+
                        psu = false
            else {
+
                         newGroup = "DU "
                # If  O
 
                if (newAtomName == "O") {
 
                    var oCount = 0
 
                    var iKeep = -1
 
                    for (var i = 1; i <= cSet.size; i++) {
 
                         if (cSet[i].element != "O") {
 
                            if (cSet[i].element == "N") {
 
                                nIdx = cSet[i].atomIndex
 
                            }
 
                            cSet[i].selected = false
 
                        }
 
                        else {
 
                            oCount++
 
                            if (iKeep < 0) {
 
                                iKeep = i
 
                            }
 
                            else {
 
                                oxtIdx = cSet[i].atomIndex
 
                            }
 
                        }
 
 
                     }
 
                     }
                     cset = cSet[iKeep[1]]
+
                     cSet = ({})
                    newGreek = ""
 
                    newAtomName = (isCB ? "CB" : "N")
 
 
                 }
 
                 }
                 else if (newAtomName == "CA") { # PRO
+
                 break
                    var iKeep = -1
+
            case "N1" :
                    for (var i = 1; i <= cSet.size; i++) {
+
                if (connected({atomIndex=nIdx}).size > 2) { # YG
                        if (connected(cSet[i]) > 2) {
+
                     newGroup = ""
                            iKeep = i
 
                        }
 
                    }
 
                    cSet = cSet[iKeep]
 
 
 
                    newGreek = "A"
 
                     newAtomName = "C"
 
 
                 }
 
                 }
                 else if (newAtomName == "XE") { # TRP
+
                 nIdx = ring_common( cSet, nIdx, s, newGreek, "2")
                    for (var i = 1; i <= cSet.size; i++) {
+
                nextAtomName = "C2"
                        if (cSet[i].element == "N") {
+
                break
                            s[1] = i
+
            case "C2" :
                        }
+
                nIdx = ring_common( cSet, nIdx, s, newGreek, "3")
                        else if (connected(cSet[i]) > 2) {
+
                nextAtomName = "N3"
                            s[2] = i
+
                stopIdx = -1
                        }
+
                break
                        else {
+
            case "N3" :
                            s[3] = i
+
                nIdx = ring_common( cSet, nIdx, s, newGreek, "4")
                        }
+
                nextAtomName = "C4"
                    }
+
                break
                    newGroup = "TRP"
+
            case "C4" :
                    s1 = "W"
+
                if (newGroup != "PY") {
                    newGreek = "E"
+
                     cSet = ({})
                     newAtomName = "XZ"
 
 
                 }
 
                 }
 
                 else {
 
                 else {
 +
                    nIdx = ring_common( cSet, nIdx, s, newGreek, "5")
 +
                    newGroup = ((cSet[1].element == "N") ? "DC " : "DU ")
 +
                    nextAtomName = "C5"
 
                 }
 
                 }
 +
                break
 
             }
 
             }
 
+
            first = false
 
             for (var i = 1; i <= cSet.size; i++) {
 
             for (var i = 1; i <= cSet.size; i++) {
 
                 rs += format("ATOM  %5d  %-4sUNK ", newAtomNo,
 
                 rs += format("ATOM  %5d  %-4sUNK ", newAtomNo,
                     (cSet[s[i]].element + newGreek
+
                     (cSet[i].element + newGreek[s[i]]))
                    + ((cSet.size > 1) ? (i+pTrp) : newCount)))
+
                 rs += format("%s%4d    %8.3f", newChain, newResno, cSet[i].x)
                 rs += format("%s%4d    %8.3f", newChain, newResno, cSet[s[i]].x)
+
                 rs += format("%8.3f%8.3f\n", cSet[i].y, cSet[i].z)
                 rs += format("%8.3f%8.3f\n", cSet[s[i]].y, cSet[s[i]].z)
 
                if (newGreek == "XT") {
 
                    newGreek == ""
 
                }
 
 
                 newAtomno++
 
                 newAtomno++
 
             }
 
             }
            newCount = ""
 
            cSet = (connected({selected}) and not {selected}
 
                and not {atomIndex=@nIdx} and not {atomIndex=proDidx})
 
            select ({selected} or cSet and not {atomIndex=nIdx}
 
                and not {atomIndex=proDidx})
 
  
 +
            cSet = (connected(cSet and not {atomIndex=stopIdx})
 +
                and not cSet and not {atomIndex=stopIdx} and not {atomIndex=endIdx})
 +
            endIdx = nIdx
 +
 +
            if (cSet.size == 0) {
 +
                if (isRNA) {
 +
                    newGroup = (newGroup.replace("DA ","A  ").replace("DG ","G  ")
 +
                        .replace("DC ","C  ").replace("DT ","T  ").replace("DU ","U  "))
 +
                }
 +
                ls += rs.replace("UNK", newGroup)
 +
                rs = ""
 +
                newResno++
 +
 +
                if (pIdx >= 0) {
 +
                    cSet = {atomIndex=pIdx}
 +
                    nextAtomName = "P"
 +
                    newGroup = "UNK"
 +
                    newGreek[1] = ""
 +
                    c1pIdx = -1
 +
                    stopIdx = o3pIdx
 +
                    endIdx = -1
 +
                    isRNA = false
 +
                }
 +
                else {
 +
                    break
 +
                }
 +
            }
 
         } # endwhile
 
         } # endwhile
  
 
         # Replace chain with new chain
 
         # Replace chain with new chain
         if (oxtIdx >= 0) {
+
         cset = {atomIndex=idx}
            rs += format("ATOM  %5d  OXT UNK %s", newAtomNo, newChain)
+
        select cSet
             rs += format("%4d    %8.3f", newResno, {atomIndex=oxtIdx}.x)
+
        while (cSet) {
             rs += format("%8.3f%8.3f\n", {atomIndex=oxtIdx}.y, {atomIndex=oxtIdx}.z)
+
             cSet = connected({selected}) and not {selected}
 +
             select {selected} or cSet
 
         }
 
         }
        ls += rs.replace("UNK", newGroup).replace("  SeG" , " SeG ")
 
        ls1 += s1
 
 
         delete {selected}
 
         delete {selected}
         ls += "end \"append remap\""
+
 
 +
         ls += "end \"append remapNT\""
 
         gAppendNew = appendNew
 
         gAppendNew = appendNew
 
         set appendNew false
 
         set appendNew false
 
         script inline @{ls}
 
         script inline @{ls}
         set appendNew gAppendNew
+
         set appendNew gAppendNew      
        var xx = {element="Xx"}
 
        for (var i = 1; i <= xx.size; i++) {
 
            connect 1.8 {atomindex=@{xx[i].atomIndex}}
 
        }
 
        ssbonds on
 
        gEcho += format("|Chain %s has been rebuilt", newChain)
 
        set echo TOP LEFT
 
        echo @gEcho
 
        print ls1
 
 
 
 
     }
 
     }
 
     else {
 
     else {
 
         color {selected} @gScheme
 
         color {selected} @gScheme
 
     }
 
     }
 +
    print_1c_chain( newChain)
 +
}
 +
 +
function print_1c_chain(iChain) {
 +
    var resmin = get_resno_min(iChain)
 +
    var resmax = get_resno_max(iChain)
 +
    var rchar = (({(resno=resmin) and (chain=iChain) and thisModel}.group[0].size > 1) ? "" : "R")
 +
    var lcAtoms = (within(3.1, false, {(resno=resmin) and (chain=iChain)
 +
        and thisModel and base})
 +
        and not {(resno=resmin) and (chain=iChain) and thisModel})
 +
    var chain2 = ""
 +
    var schar = "S"
 +
    if (lcAtoms) {
 +
        chain2 = lcAtoms[1].chain
 +
        if (((rchar == "R") and (lcAtoms[1].group.size > 1))
 +
            or ((rchar == "") and (lcAtoms[1].group.size == 1))) {
 +
            schar = "M"
 +
        }
 +
        else {
 +
            schar = "S"
 +
            chain2 = ""
 +
        }
 +
    }
 +
    var ls = format("%s%s:%s", iChain, chain2, format("%s%s", rchar, schar))
 +
    for (var i = get_resno_min(iChain); i <= get_resno_max(iChain); i++) {
 +
        ls += ({(resno=i) and (chain=iChain) and thisModel}.group[0])[0]
 +
    }
 +
    print ls
 
}
 
}
  
 
# Top level of Remap
 
# Top level of Remap
function plico_remap() {
+
function plico_remap_nt() {
  
 
     # Load common functions if not already
 
     # Load common functions if not already
     if (kCommon < 6) {
+
     if (kCommon < 7) {
 
         script $SCRIPT_PATH$plicoCommon.spt
 
         script $SCRIPT_PATH$plicoCommon.spt
         if (kCommon < 6) {
+
         if (kCommon < 7) {
 
             prompt ("A newer version of plicoCommon.SPT is required")
 
             prompt ("A newer version of plicoCommon.SPT is required")
 
             quit
 
             quit
Line 529: Line 580:
 
     }
 
     }
  
     gPlico = "Remap"
+
     gPlico = "RemapNT"
 
     plico_prelim(false, true)
 
     plico_prelim(false, true)
 
      
 
      
     gEcho = "_______REMAP_______|ALT-CLICK=select chain|SHIFT-DOUBLE-CLICK=exit"
+
     gEcho = "_____REMAP NT_____|ALT-CLICK=select NT chain|SHIFT-DOUBLE-CLICK=exit"
 
     echo @gEcho
 
     echo @gEcho
  
 
     set picking ON
 
     set picking ON
 
     bind "ALT-LEFT-CLICK" "_pickAtom";
 
     bind "ALT-LEFT-CLICK" "_pickAtom";
     bind "ALT-LEFT-CLICK" "+:remap_cargo_mb";
+
     bind "ALT-LEFT-CLICK" "+:remap_nt_cargo_mb";
 
     bind "SHIFT-DOUBLE" "plico_exit(true)";
 
     bind "SHIFT-DOUBLE" "plico_exit(true)";
 
     bind "LEFT-CLICK" "+:plico_menu_toggle";
 
     bind "LEFT-CLICK" "+:plico_menu_toggle";
 
}
 
}
  
# End of REMAP.SPT</pre>
+
# End of REMAPNT.SPT
 +
</pre>

Latest revision as of 17:22, 12 April 2016

RemapNT allows you to change the chain ID, atom numbers and/or residue numbers of a polynucleotide chain by mouse actions. It also calculates group values [nucleotide names (DU, A, etc.)]. Finally it prints the resultant 1 char string to the console.

When you click on a polynucleotide chain, it gives the current chain ID, residue, residue number and atom number of the most 5'ward atom in that chain. You may then edit any value (except residue). Remap then remaps the entire chain based on those values by conventional increments and identifies each nucleotide residue.

Note that it will also remove all waters, ligands, hydrogens and %B alternates when any chain is updated.

RemapNT 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:

#   remapNT - Jmol script by Ron Mignery
#   v1.7  beta     4/12/2016 -require latest common includes
#
#   Calculate or change polynucleotide chain, atom number, residue names
#    and/or residue numbers and print the resultant 1 char string
#
gBusy = false
kRemapNT=2

function find_5_prime(pIdx) {
    while (pIdx >= 0) {

        # Find C3'
        var c3pIdx = -1
        select {atomIndex=pIdx}
        var cSet = {selected}
        for (var i = 1; i <= cSet.size; i++) {
            var ocSet = connected(cSet[i])
            for (var j = 1; j <= ocSet.size; j++) {
                var occSet = connected(ocSet[j]) and not {atomIndex=pIdx}
                for (var k = 1; k <= occSet.size; k++) {
                    if (connected(occSet[k]).size > 2) {
                        c3pIdx = 0 + occSet[k].atomIndex
                    }
                }
            }
        }

        if (c3pIdx < 0) {
            return pIdx
        }
        # Find C4'
        var endIdx = -1
        cSet = connected({atomIndex=c3pIdx}) and not {oxygen}
        for (var i = 1; i <= cSet.size; i++) {
            var ocSet = connected(cSet[i]) and {oxygen}
            for (var j = 1; j <= ocSet.size; j++) {
                if (connected(ocSet[j]).size > 1) {
                    if (endIdx = -1) {
                        endIdx = 0 + cSet[i].atomIndex
                    }
                    else {
                        var Ox = connected(ocSet[j]) and not {atomindex=@{cset[i].atomIndex}}
                        if (connected(Ox) > 1) {
                            endIdx = 0 + cSet[i].atomIndex
                        }
                    
                    }
                }
            }
        }

        # Find C5'
        var c5idx = -1
        cSet = (connected({atomIndex=endIdx}) and not {atomIndex=c3pIdx}
            and not {oxygen})
        if (cSet) {
            c5idx = 0 + cSet[1].atomIndex
        }

        # Find O5'
        var o5idx = -1
        cSet = connected({atomIndex=c5idx}) and {oxygen}
        if (cSet) {
            o5idx = 0 + cSet[1].atomIndex
        }

        if (o5idx < 0) {
            return c5idx
        }

        # Find P
        pIdx = -1
        cSet = connected({atomIndex=o5idx}) and {phosphorus}
        if (cSet) {
            Pidx =  0 + cSet[1].atomIndex
        }

        if (Pidx < 0) {
            return o5idx
        }
    }

    return -1
}

function find_p_idx(idx) {
    select {atomIndex=idx}
    var cSet = {selected}
    while (cSet) {
        for (var i = 1; i <= cSet.size; i++) {
            if (cSet[i].element == "P") {
                return cSet[i].atomIndex
            }
        }
        cSet = connected({selected}) and not {selected} and not {hydrogen}
        select {selected} or cset
    }
    return -1
}

# cSet, s, and newGreek are arrays and thus passed by reference
function ring_common(cSet, nIdx, s, newGreek, nextGreek) {
    if (cSet.size > 2) {
        print format("Unrecognized structure with set %s", cSet)
    }
    var oldGreek = 0 + newGreek[1]
    newGreek[1] = nextGreek
    for (var i = 1; i <= cSet.size; i++) {
        var ccSet = connected(cSet[i])
        if (ccSet.size == 1) {
            if (cSet[i].element == ccSet[1].element) {
                s[2] = i
                s[1] = ((i > 1) ? 1 : 2)
                newGreek[i] = 1 + nextGreek
                newGreek[s[1]] = nextGreek
                return cSet[s[1]].atomIndex
            }
            else {
                s[1] = i
                s[2] = ((i > 1) ? 1 : 2)
                newGreek[i] = oldGreek
                newGreek[s[2]] = nextGreek
                return cSet[s[2]].atomIndex
            }
        }
    }
    return cSet[1].atomIndex
}

# Bound to ALT-LEFT-CLICK by plico_remap_nt
function remap_nt_cargo_mb() {
    var idx =_atomPicked
    if ({atomIndex=idx}.element == "H") {
        idx = connected({atomIndex=idx})[1].atomIndex
    }
    delete {hydrogen}
    delete {hoh}
    delete %B
    delete ligands
    connect

    remap_nt( idx, false, 0)
    
    set echo TOP LEFT
    echo @gEcho
    background ECHO yellow
    refresh
    print_1c_chain( newChain)
}
        
function remap_nt(idx, auto, base) {

    # If P can be found
    var pIdx = find_p_idx(idx)
    var isValid = false
    var newResno = 1
    var newChain = "A"
    var newAtomno = 1
    var t5idx = -1
    if (pIdx >= 0) {

        t5idx = find_5_prime(pIdx)
        if (t5idx >= 0) {
            var f = {atomIndex=t5idx}.file
            var m = {atomIndex=t5idx}.model
            newResno = {atomIndex=t5idx}.resno
            newChain = {atomIndex=t5idx}.chain
            newAtomno = {atomIndex=t5idx}.atomno
            select {thisModel}
            color {selected} @gScheme
            select {(chain=newChain) and thisModel}
            color {selected} @gAltScheme
            refresh

            if (auto) {
                newResno = base
                isValid = true
                newChain = gChain1
            }
            else {
            
                # Prompt for new designators
                var p = prompt(("Enter 5\'-terminal atom designator as\n"
                    + "   <resno>:<chain>#<atomno>"),
                    format("%d:%s#%d", newResno, newChain, newAtomno))%0
                # If valid
                if (p != "null") {
                    var iColon = p.find(":")
                    if (iColon > 0) {
                        var iHash = p.find("#")
                        if (iHash > 0) {
                            newResno = 0 + (p[1][iColon-1])
                            newChain = p[iColon+1][iHash-1]
                            newAtomno = 0 + (p[iHash+1][0])
                            if ((newResno > 0)
                                and (newChain.size == 1)
                                and (newAtomno > 0)) {
                                    isValid = true
                            }
                        }
                    }
                    if (not isValid) {
                        prompt ("Entry not valid!")
                    }
                }
            }
        }
    }

    if (isValid) {
        background ECHO pink
        refresh

        # Build inline pdb file
        var ls = "data \"append remapNT\"\n"    # global PDB atom record
        var rs = ""

        select {atomIndex=t5idx}
        var cSet = {selected}
        var nextAtomName = {atomIndex=t5idx}.element
        var newGroup = "UNK"
        var newGreek = array("", "", "", "")
        var nIdx = t5idx
        var c1pIdx = -1
        var o3pIdx = -1
        var stopIdx = -1
        var endIdx = -1
        var isRNA = false
        var first = true
        var psu = false
        while (cSet) {
            var s = array(1, 2, 3, 4)
            var iKeep = -1
            var iDrop = -1
            switch( nextAtomName) {
            case "O" :
                newGreek[1] = (first ? "5\'" : "P3")
                nextAtomName = (first ? "C5\'" : "P")
                nIdx = cSet[1].atomIndex
                break
            case "P" :
                newGreek[1] = ""
                nextAtomName = "OP"
                nIdx = cSet[1].atomIndex
                break
            case "OP" :
                var oc5set = ({})
                for (var i = 1; i <= cSet.size; i++) {
                    newGreek[i] = ""
                    if (connected(cSet[i]).size > 1) {
                        s[cSet.size] = i
                        newGreek[cSet.size] = "5\'"
                        oc5set = connected(cSet[i]) and {carbon}
                        nIdx = cSet[i].atomIndex
                    }
                }
                var isP1 = false
                if (cSet.size > 3) {
                    newGreek[1] = "P1"
                    newGreek[2] = "P2"
                    newGreek[3] = "P3"
                    s[1] = 1
                    s[2] = 2
                    s[3] = 3
                }                
                else {
                    for (var i = 1; i <= cSet.size; i++) {
                        if (i != s[cSet.size]) {
                            if ((isP1 == false)
                                and (abs(angle(cSet[i], {atomIndex=pIdx},
                                cSet[s[cSet.size]], oc5set[1])) < 90.0)) {
                                s[1] = i
                                newGreek[1] = "P1"
                                isP1 = true
                            }
                            else {
                                s[2] = i
                                newGreek[2] = "P2"
                            }
                        }
                    }
                }
                #nIdx = pIdx
                nextAtomName = "C5\'"
                break
            case "C5\'" :
                nIdx = cSet[1].atomIndex
                newGreek[1] = "5\'"
                nextAtomName = "C4\'"
                break
            case "C4\'" :
                nIdx = cSet[1].atomIndex
                newGreek[1] = "4\'"
                nextAtomName = "C3\'"
                break
            case "C3\'" :
                for (var i = 1; i <= cSet.size; i++) {
                    if (cSet[i].element == "O") {
                        s[1] = i
                        newGreek[1] = "4\'"
                        cSet[i].selected = false
                        stopIdx = cSet[i].atomIndex
                    }
                    else {
                        s[2] = i
                        newGreek[2] = "3\'"
                        nIdx = cSet[i].atomIndex

                    }
                }
                nextAtomName = "O3\'"
                break
            case "O3\'" :
                for (var i = 1; i <= cSet.size; i++) {
                    if (cSet[i].element == "O") {
                        s[1] = i
                        newGreek[1] = "3\'"
                        o3pIdx = cSet[i].atomIndex
                    }
                    else {
                        s[2] = i
                        newGreek[2] = "2\'"
                        nIdx = cSet[i].atomIndex
                    }
                }
                nextAtomName = "C2\'"
                break
            case "C2\'" :
                pIdx = -1
                for (var i = 1; i <= cSet.size; i++) {
                    if (cSet[i].element == "P") {
                        pIdx = cSet[i].atomIndex
                        cSet = cSet and not cSet[i]
                        break
                    }
                }
                for (var i = 1; i <= cSet.size; i++) {
                    if (cSet[i].element == "O") {
                        s[1] = i
                        newGreek[1] = "2\'"
                        isRNA = true
                    }
                    else {
                        s[2] = i
                        newGreek[2] = "1\'"
                        c1pIdx = cSet[i].atomIndex
                        nIdx = cSet[i].atomIndex
                    }
                }
                nextAtomName = "C1\'"
                break
            case "C1\'" :
                for (var i = 1; i <= cSet.size; i++) {
                    if (cSet[i].element == "N") {
                        iKeep = i
                        nIdx = cSet[i].atomIndex
                    }
                    else if ((cSet[i].element == "C") and
                        ((connected(cSet[i]) and {oxygen}).size == 0)) { #PSU
                        psu = true
                        iKeep = i
                        nIdx = cSet[i].atomIndex
                    }
                    else {
                        cSet[i].selected = false
                    }
                }
                cSet = cSet[iKeep]
                var ccSet = connected(cSet[1]) and not {atomIndex=c1pIdx}
                newGreek[1] = "9"
                nextAtomName = "N9u"
                newGroup = "PU"
                for (var j = 1; j <= ccSet.size; j++) {
                    if ((connected(ccSet[j]) and {oxygen}) > 0) {
                        newGreek[1] = "1"
                        nextAtomName = "N1y"
                        newGroup = "PY"
                    }
                }
                break
            case "N1y" :
                for (var i = 1; i <= cSet.size; i++) {
                    if (connected(cSet[i]) > 2) {
                        iKeep = i
                        nIdx = cSet[i].atomIndex
                    }
                    else {
                        stopIdx = cSet[i].atomIndex
                    }
                }
                cSet = cSet[iKeep]
                newGreek[1] = "2"
                nextAtomName = "C2"
                break
            case "N9u" :
                # Find N-C-N-C-N
                for (var i = 1; i <= cSet.size; i++) {
                    var n1atom = (connected(cSet[i]) and {nitrogen}
                        and not {atomIndex=nIdx})
                    var c2set = connected(n1atom) and {carbon} and not cSet[i]
                    for (var j = 1; j <= c2set.size; j++) {
                        if ((connected(c2set[j]) and {nitrogen}) > 1) {
                            iDrop = i
                        }
                    }
                }
                stopIdx = cSet[iDrop].atomIndex
                cSet = cSet and not cSet[iDrop]
                nIdx = cSet[1].atomIndex
                newGreek[1] = "8"
                nextAtomName = "C8"
                break
            case "C8" :
                nIdx = ring_common( cSet, nIdx, s, newGreek, "7")
                nextAtomName = "N7"
                break
            case "N7" :
                nIdx = ring_common( cSet, nIdx, s, newGreek, "5")
                nextAtomName = "C5"
                break
            case "C5" :
                if (isRNA and (newGroup == "DU ")) {
                    var c5set = {atomIndex=nIdx} or connected({atomIndex=nIdx})
                    if (angle(c5set[1], c5set[2], c5set[3]) < 114.0) {
                        newGroup = "D  "
                    }
                }
                nIdx = ring_common( cSet, nIdx, s, newGreek, "6")
                if ((newGroup == "DU ") and (cSet.size > 1)) {
                    newGroup = "DT "
                }
                nextAtomName = "C6"
                break
            case "C6" :
                if (newGroup == "PU") {
                    nIdx = ring_common( cSet, nIdx, s, newGreek, "1")
                    newGroup = ((cSet[1].element == "O") ? "DG " : "DA ")
                    nextAtomName = "N1"
                }
                else {
                    if (psu) {
                        psu = false
                        newGroup = "DU "
                    }
                    cSet = ({})
                }
                break
            case "N1" :
                if (connected({atomIndex=nIdx}).size > 2) { # YG
                    newGroup = "X  "
                }
                nIdx = ring_common( cSet, nIdx, s, newGreek, "2")
                nextAtomName = "C2"
                break
            case "C2" :
                nIdx = ring_common( cSet, nIdx, s, newGreek, "3")
                nextAtomName = "N3"
                stopIdx = -1
                break
            case "N3" :
                nIdx = ring_common( cSet, nIdx, s, newGreek, "4")
                nextAtomName = "C4"
                break
            case "C4" :
                if (newGroup != "PY") {
                    cSet = ({})
                }
                else {
                    nIdx = ring_common( cSet, nIdx, s, newGreek, "5")
                    newGroup = ((cSet[1].element == "N") ? "DC " : "DU ")
                    nextAtomName = "C5"
                }
                break
            }
            first = false
            for (var i = 1; i <= cSet.size; i++) {
                rs += format("ATOM  %5d  %-4sUNK ", newAtomNo,
                    (cSet[i].element + newGreek[s[i]]))
                rs += format("%s%4d    %8.3f", newChain, newResno, cSet[i].x)
                rs += format("%8.3f%8.3f\n", cSet[i].y, cSet[i].z)
                newAtomno++
            }

            cSet = (connected(cSet and not {atomIndex=stopIdx})
                and not cSet and not {atomIndex=stopIdx} and not {atomIndex=endIdx})
            endIdx = nIdx

            if (cSet.size == 0) {
                if (isRNA) {
                    newGroup = (newGroup.replace("DA ","A  ").replace("DG ","G  ")
                        .replace("DC ","C  ").replace("DT ","T  ").replace("DU ","U  "))
                }
                ls += rs.replace("UNK", newGroup)
                rs = ""
                newResno++

                if (pIdx >= 0) {
                    cSet = {atomIndex=pIdx}
                    nextAtomName = "P"
                    newGroup = "UNK"
                    newGreek[1] = ""
                    c1pIdx = -1
                    stopIdx = o3pIdx
                    endIdx = -1
                    isRNA = false
                }
                else {
                    break
                }
            }
        } # endwhile

        # Replace chain with new chain
        cset = {atomIndex=idx}
        select cSet
        while (cSet) {
            cSet = connected({selected}) and not {selected}
            select {selected} or cSet
        }
        delete {selected}

        ls += "end \"append remapNT\""
        gAppendNew = appendNew
        set appendNew false
        script inline @{ls}
        set appendNew gAppendNew        
    }
    else {
        color {selected} @gScheme
    }
    print_1c_chain( newChain)
}

function print_1c_chain(iChain) {
    var resmin = get_resno_min(iChain)
    var resmax = get_resno_max(iChain)
    var rchar = (({(resno=resmin) and (chain=iChain) and thisModel}.group[0].size > 1) ? "" : "R")
    var lcAtoms = (within(3.1, false, {(resno=resmin) and (chain=iChain)
        and thisModel and base})
        and not {(resno=resmin) and (chain=iChain) and thisModel})
    var chain2 = ""
    var schar = "S"
    if (lcAtoms) {
        chain2 = lcAtoms[1].chain
        if (((rchar == "R") and (lcAtoms[1].group.size > 1))
            or ((rchar == "") and (lcAtoms[1].group.size == 1))) {
            schar = "M"
        }
        else {
            schar = "S"
            chain2 = ""
        }
    }
    var ls = format("%s%s:%s", iChain, chain2, format("%s%s", rchar, schar))
    for (var i = get_resno_min(iChain); i <= get_resno_max(iChain); i++) {
        ls += ({(resno=i) and (chain=iChain) and thisModel}.group[0])[0]
    }
    print ls
}

# Top level of Remap
function plico_remap_nt() {

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

    gPlico = "RemapNT"
    plico_prelim(false, true)
    
    gEcho = "_____REMAP NT_____|ALT-CLICK=select NT chain|SHIFT-DOUBLE-CLICK=exit"
    echo @gEcho

    set picking ON
    bind "ALT-LEFT-CLICK" "_pickAtom";
    bind "ALT-LEFT-CLICK" "+:remap_nt_cargo_mb";
    bind "SHIFT-DOUBLE" "plico_exit(true)";
    bind "LEFT-CLICK" "+:plico_menu_toggle";
}

# End of REMAPNT.SPT

Contributors

Remig