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

From Jmol
Jump to navigation Jump to search
(Add menu toggle)
m
Line 12: Line 12:
  
 
Copy and paste the following to a text editor and save to your scripts directory as remapNT.spt:
 
Copy and paste the following to a text editor and save to your scripts directory as remapNT.spt:
<pre>#  remapNT - Jmol script by Ron Mignery
+
<pre>#  remap - Jmol script by Ron Mignery
#  v1.beta     7/24/2015 -add menu toggle
+
#  v1.9 beta   9/11/2015 -use thisModel
 
#
 
#
#  Calculate or change polynucleotide chain, atom number, residue names
+
#  Calculate or change polypeptide chain, atom number, residue names and/or residue
#    and/or residue numbers and print the resultant 1 char string
+
#    numbers and print the resultant 1 char string
 
#
 
#
 +
gAppendNew = false
 
gBusy = false
 
gBusy = false
kRemapNT=2
 
  
function find_5_prime(pIdx) {
+
# Search for N-C-C-0
     while (pIdx >= 0) {
+
function get_bb_nward_ca_idx(idx) {
 
+
     if ({atomIndex=idx}.element == "N") {
        # Find C3'
+
         var c1 = (connected({atomIndex=idx}) and not {hydrogen})
         var c3pIdx = -1
+
         for (var i1 = 1; i1 <= c1.size; i1++) {
        select {atomIndex=pIdx}
+
             if (c1[i1].element == "C") {
        var cSet = {selected}
+
                 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])
+
                     if (c2[i2].element == "C") {
            for (var j = 1; j <= ocSet.size; j++) {
+
                         var c3 = (connected({atomIndex=@{c2[i2].atomIndex}})
                 var occSet = connected(ocSet[j]) and not {atomIndex=pIdx}
+
                            and not {hydrogen})
                 for (var k = 1; k <= occSet.size; k++) {
+
                        for (var i3 = 1; i3 <= c3.size; i3++) {
                     if (connected(occSet[k]).size > 2) {
+
                            if (c3[i3].element == "O") {
                         c3pIdx = 0 + occSet[k].atomIndex
+
                                return c1[i1].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.size > 0) {
 
            c5idx = 0 + cSet[1].atomIndex
 
        }
 
 
        # Find O5'
 
        var o5idx = -1
 
        cSet = connected({atomIndex=c5idx}) and {oxygen}
 
        if (cSet.size > 0) {
 
            o5idx = 0 + cSet[1].atomIndex
 
        }
 
 
        if (o5idx < 0) {
 
            return c5idx
 
        }
 
 
        # Find P
 
        pIdx = -1
 
        cSet = connected({atomIndex=o5idx}) and {phosphorus}
 
        if (cSet.size > 0) {
 
            Pidx =  0 + cSet[1].atomIndex
 
        }
 
 
        if (Pidx < 0) {
 
            return o5idx
 
 
         }
 
         }
 
     }
 
     }
 
 
     return -1
 
     return -1
 
}
 
}
  
function find_p_idx(idx) {
+
# Find N-terminal N
     select {atomIndex=idx}
+
function find_n0_idx(aIdx) {
     var cSet = {selected}
+
 
     while (cSet.size > 0) {
+
     select {atomIndex=aIdx}
         for (var i = 1; i <= cSet.size; i++) {
+
     var sSet = {selected}
             if (cSet[i].element == "P") {
+
     while (sSet) {
                 return cSet[i].atomIndex
+
         for (var i = 1; i <= sSet.size; i++) {
 +
             var idx = sSet[i].atomIndex
 +
            var caIdx = get_bb_nward_ca_idx(idx)
 +
            if (caIdx >= 0) {
 +
                var cset = connected({atomIndex=idx}) and not {hydrogen}
 +
                 var ccset = connected(cset) and not {hydrogen}
 +
                if (cset.size < 2) {
 +
                    return idx #***
 +
                }
 +
                else if (({ccset and {carbon}}.size = 3) and (ccset.size == 4)) {
 +
                    return idx #***
 +
                }
 
             }
 
             }
         }
+
         } # endfor
         cSet = connected({selected}) and not {selected} and not {hydrogen}
+
          
         select {selected} or cset
+
        sSet = connected({selected}) and not {selected} and not {hydrogen}
     }
+
         select {selected} or sSet
 +
     } # endwhile
 +
   
 
     return -1
 
     return -1
 
}
 
}
  
# cSet, s, and newGreek are arrays and thus passed by reference
+
# Bound to ALT-LEFT-CLICK by plico_remap
function ring_common(cSet, nIdx, s, newGreek, nextGreek) {
+
function remap_cargo_mb() {
    if (cSet.size > 2) {
+
     var idx =_atomPicked
        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") {
 
     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) {
 
    var f = (_frameID/1000000)
 
    var m = (_frameID%1000000)
 
  
     # If P can be found
+
     # If n-terminal N can be found
     var pIdx = find_p_idx(idx)
+
     var n0idx = find_n0_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
    var t5idx = -1
+
     if (n0idx >= 0) {
     if (pIdx >= 0) {
 
  
         t5idx = find_5_prime(pIdx)
+
         # Prompt for new designators
         if (t5idx >= 0) {
+
         f = {atomIndex=n0idx}.file
            f = {atomIndex=t5idx}.file
+
        m = {atomIndex=n0idx}.model
            m = {atomIndex=t5idx}.model
+
        var iResno = {atomIndex=n0idx}.resno
            newResno = {atomIndex=t5idx}.resno
+
        var iChain = {atomIndex=n0idx}.chain
            newChain = {atomIndex=t5idx}.chain
+
        var iNo = {atomIndex=n0idx}.atomno
            newAtomno = {atomIndex=t5idx}.atomno
+
        select {thisModel}
            select {(file=f) and (model=m)}
+
        color {selected} @gScheme
            color {selected} @gScheme
+
        select {(chain=iChain) and thisModel}
            select {(chain=newChain) and (file=f) and (model=m)}
+
        color {selected} @gAltScheme
            color {selected} @gAltScheme
+
        refresh
             refresh
+
        var p = prompt("Enter n-terminal atom designator as\n"
 +
             + "  <resno>:<chain>.N#<atomno>",
 +
            format("%d:%s.N#%d", iResno, iChain, iNo)%0)
  
            if (auto) {
+
        # If valid
                newResno = base
+
        var iColon = p.find(":")
                isValid = true
+
        if (iColon > 0) {
                newChain = gChain1
+
            var iDot = p.find(".")
            }
+
            if (iDot > 0) {
            else {
+
                var iHash = p.find("#")
           
+
                if (iHash > 0) {
                # Prompt for new designators
+
                    newResno = 0 + (p[1][iColon-1])
                var p = prompt(("Enter 5\'-terminal atom designator as\n"
+
                    newChain = p[iColon+1][iDot-1]
                    + "  <resno>:<chain>#<atomno>"),
+
                    newAtomno = 0 + (p[iHash+1][0])
                    format("%d:%s#%d", newResno, newChain, newAtomno))%0
+
                    if ((newResno > 0)
                # If valid
+
                        and (newChain.size == 1)
                if (p != "null") {
+
                        and (newAtomno > 0)) {
                    var iColon = p.find(":")
+
                            isValid = true
                    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 223: Line 123:
 
         }
 
         }
 
     }
 
     }
 +
    if (isValid) {
  
    if (isValid) {
+
        delete {hydrogen and thisModel}
         background ECHO pink
+
        delete {hoh and thisModel}
         refresh
+
         delete %B and thisModel
 +
         ssbonds off
  
 
         # Build inline pdb file
 
         # Build inline pdb file
         var ls = "data \"append remapNT\"\n"   # global PDB atom record
+
         var ls = "data \"append remap\"\n"
 
         var rs = ""
 
         var rs = ""
 +
        var ls1 = format("%s:", newChain)
  
         select {atomIndex=t5idx}
+
         select {atomIndex=n0idx}
 
         var cSet = {selected}
 
         var cSet = {selected}
         var nextAtomName = {atomIndex=t5idx}.element
+
         var newAtomName = "N"
 
         var newGroup = "UNK"
 
         var newGroup = "UNK"
         var newGreek = array("", "", "", "")
+
         var s1 = "X"
         var nIdx = t5idx
+
        var newGreek = ""
         var c1pIdx = -1
+
         var newCount = ""
         var o3pIdx = -1
+
         var isCB = false
         var stopIdx = -1
+
         var nIdx = n0idx
         var endIdx = -1
+
         var proDidx = -1
         var isRNA = false
+
         var oxtIdx = -1
        var first = true
+
         while ((nIdx >= n0idx) or (cSet)) {
        var psu = false
+
             var s = array(1, 2, 3)
        while (cSet.size > 0) {
+
             var pTrp = 0
             var s = array(1, 2, 3, 4)
+
             if (cSet.size == 0) {
             var iKeep = -1
+
                    ls += rs.replace("UNK", newGroup).replace(" SeG" , " SeG ")
             var iDrop = -1
+
                    ls1 += s1
            switch( nextAtomName) {
+
                    rs = ""
            case "O" :
+
                    newResno++
                newGreek[1] = (first ? "5\'" : "P3")
+
                    nIdx = -1
                nextAtomName = (first ? "C5\'" : "P")
+
                    proIdx = -1
                nIdx = cSet[1].atomIndex
+
                    newGroup = "UNK"
                break
+
                    s1 = "X"
            case "P" :
+
                    newAtomName = "N"
                newGreek[1] = ""
+
                    isCB = false
                nextAtomName = "OP"
+
            }
                nIdx = cSet[1].atomIndex
+
            else if (cSet.size == 1) {
                 break
+
                 if (newAtomName == "N") {
            case "OP" :
+
                    newGreek = ""
                 var oc5set = ({})
+
                    newAtomName = "CA"
                 for (var i = 1; i <= cSet.size; i++) {
+
                 }
                     newGreek[i] = ""
+
                 else if (newAtomName == "CA") {
                     if (connected(cSet[i]).size > 1) {
+
                     newGreek = "A"
                        s[cSet.size] = i
+
                     newAtomName = "C"
                        newGreek[cSet.size] = "5\'"
+
                }
                        oc5set = connected(cSet[i]) and {carbon}
+
                else if (newAtomName == "C") {
                        nIdx = cSet[i].atomIndex
+
                    newGroup = "GLY"
                    }
+
                    s1 = "G"
 +
                    newGreek = ""
 +
                    newAtomName = "O"
 
                 }
 
                 }
                 var isP1 = false
+
                 else if (newAtomName == "CB") {
                if (cSet.size > 3) {
+
                     if (cSet[1].element == "C") {
                    newGreek[1] = "P1"
+
                        newGroup = "ALA" # for now
                    newGreek[2] = "P2"
+
                        s1 = "A"
                    newGreek[3] = "P3"
+
                        newGreek = "B"
                    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"
 
                            }
 
                        }
 
 
                     }
 
                     }
 +
                    newAtomName = "XG"
 
                 }
 
                 }
                 #nIdx = pIdx
+
                 else if (newAtomName == "XG") {
                nextAtomName = "C5\'"
+
                     if (proDidx >= 0) {
                break
+
                         newGroup = "PRO"
            case "C5\'" :
+
                         s1 = "P"
                nIdx = cSet[1].atomIndex
+
                         proDidx = -1
                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 {
+
                     if (cSet[1].element == "O") { # SER CYS SEC
                        s[2] = i
+
                         newGroup = "SER"
                         newGreek[2] = "3\'"
+
                         s1 = "S"
                         nIdx = cSet[i].atomIndex
 
 
 
 
                     }
 
                     }
                }
+
                     else if (cSet[1].element == "S") {
                nextAtomName = "O3\'"
+
                         newGroup = "CYS"
                break
+
                         s1 = "C"
            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 {
+
                     else if (cSet[1].element == "Se") {
                        s[2] = i
+
                         newGroup = "SEC"
                         newGreek[2] = "2\'"
+
                         s1 = "U"
                         nIdx = cSet[i].atomIndex
 
 
                     }
 
                     }
 +
                    newGreek = "G"
 +
                    newAtomName = "XD"
 
                 }
 
                 }
                 nextAtomName = "C2\'"
+
                 else if (newAtomName == "XD") {
                break
+
                     if (newGroup == "VAL") {
            case "C2\'" :
+
                         newGroup = "ILE"
                pIdx = -1
+
                         s1 = "I"
                for (var i = 1; i <= cSet.size; i++) {
+
                         newCount = "1"
                     if (cSet[i].element == "P") {
 
                         pIdx = cSet[i].atomIndex
 
                         cSet = cSet and not cSet[i]
 
                         break
 
 
                     }
 
                     }
 +
                    newGreek = "D"
 +
                    newAtomName = "XE"
 
                 }
 
                 }
                 for (var i = 1; i <= cSet.size; i++) {
+
                 else if (newAtomName == "XE") {
                     if (cSet[i].element == "O") {
+
                    newGroup = "MET"
                         s[1] = i
+
                    s1 = "M"
                         newGreek[1] = "2\'"
+
                    newGreek = "E"
                        isRNA = true
+
                    newAtomName = "XZ"
 +
                }
 +
                else if (newAtomName == "XZ") {
 +
                     if (cSet[1].element == "N") {
 +
                         newGroup = "LYS"
 +
                         s1 = "K"
 
                     }
 
                     }
 
                     else {
 
                     else {
                         s[2] = i
+
                         newGroup = "PHE" # for now
                         newGreek[2] = "1\'"
+
                         s1 = "F"
                        c1pIdx = cSet[i].atomIndex
 
                        nIdx = cSet[i].atomIndex
 
 
                     }
 
                     }
 +
                    newGreek = "Z"
 +
                    newAtomName = "XH"
 
                 }
 
                 }
                 nextAtomName = "C1\'"
+
                 else if (newAtomName == "XH") {
                break
+
                     if (cSet[1].element == "O") {
            case "C1\'" :
+
                         newGroup = "TYR"
                for (var i = 1; i <= cSet.size; i++) {
+
                         s1 = "Y"
                     if (cSet[i].element == "N") {
 
                         iKeep = i
 
                         nIdx = cSet[i].atomIndex
 
 
                     }
 
                     }
                     else if ((cSet[i].element == "C") and
+
                     else {
                        ((connected(cSet[i]) and {oxygen}).size == 0)) { #PSU
+
                        newGroup = "TRP" # for now
                         psu = true
+
                         s1 = "W"
                         iKeep = i
+
                         newCount = "2"
                        nIdx = cSet[i].atomIndex
 
 
                     }
 
                     }
                     else {
+
                     newGreek = "H"
                         cSet[i].selected = false
+
                    newAtomName = "N"
 +
                }
 +
            }
 +
            else if (cSet.size == 2) {
 +
                var hasN = ((cSet[1].element == "N") or (cSet[2].element == "N"))
 +
                var hasO = ((cSet[1].element == "O") or (cSet[2].element == "O"))
 +
 
 +
                # If CA 2
 +
                if (newAtomName == "CA") {
 +
                    var iKeep = -1
 +
                    for (var i = 1; i <= cSet.size; i++) {
 +
                         if (connected(cSet[i]) > 2) {
 +
                            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
 
                 }
 
                 }
                 cSet = cSet[iKeep]
+
 
                 var ccSet = connected(cSet[1]) and not {atomIndex=c1pIdx}
+
                 # Else if O or N 2
                newGreek[1] = "9"
+
                 else if (newAtomName == "O") {
                nextAtomName = "N9u"
+
                    var iKeep = -1
                newGroup = "PU"
+
                    for (var i = 1; i <= cSet.size; i++) {
                for (var j = 1; j <= ccSet.size; j++) {
+
                        if (cSet[i].element != "O") {
                    if ((connected(ccSet[j]) and {oxygen}) > 0) {
+
                            if (cSet[i].element == "N") {
                        newGreek[1] = "1"
+
                                nIdx = cSet[i].atomIndex
                         nextAtomName = "N1y"
+
                            }
                         newGroup = "PY"
+
                            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" :
+
 
                 for (var i = 1; i <= cSet.size; i++) {
+
                 # Else if XG or XGn 2
                     if (connected(cSet[i]) > 2) {
+
                else if (newAtomName == "XG") { # VAL THR ILE
                         iKeep = i
+
                    newGroup = (hasO ? "THR" : "VAL")
                         nIdx = cSet[i].atomIndex
+
                    s1 = (hasO ? "T" : "V")
 +
                    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 {
                         stopIdx = cSet[i].atomIndex
+
                         newGroup = "LEU" # for now
 +
                        s1 = "L"
 
                     }
 
                     }
 +
                    newGreek = "D"
 +
                    newAtomName = "XE"
 
                 }
 
                 }
                cSet = cSet[iKeep]
+
 
                 newGreek[1] = "2"
+
                 # Else if XE or XEn 2
                 nextAtomName = "C2"
+
                 else if (newAtomName == "XE") { # GLU GLN HIS
                break
+
                    if ((cSet[2].element == "O") or (cSet[1].element == "N")
            case "N9u" :
+
                        or ((cSet[1].element == "C") and (cSet[2].element != "C"))) {
                # Find N-C-N-C-N
+
                         bRev = true
                for (var i = 1; i <= cSet.size; i++) {
+
                     }
                    var n1atom = (connected(cSet[i]) and {nitrogen}
+
                     if (hasO) {
                         and not {atomIndex=nIdx})
+
                         if (hasN) {
                     var c2set = connected(n1atom) and {carbon} and not cSet[i]
+
                            newGroup = "GLN"
                     for (var j = 1; j <= c2set.size; j++) {
+
                            s1 = "Q"
                         if ((connected(c2set[j]) and {nitrogen}) > 1) {
+
                        }
                             iDrop = i
+
                        else {
 +
                             newGroup = "GLU"
 +
                            s1 = "E"
 
                         }
 
                         }
 
                     }
 
                     }
 +
                    newGreek = "E"
 +
                    newAtomName = "XZ"
 
                 }
 
                 }
                stopIdx = cSet[iDrop].atomIndex
+
 
                 cSet = cSet and not cSet[iDrop]
+
                 # Else if XZ 2
                 nIdx = cSet[1].atomIndex
+
                 else if (newAtomName == "XZ") { # ARG
                newGreek[1] = "8"
+
                    if (newGroup == "TRP") {
                nextAtomName = "C8"
+
                        pTrp = 1
                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")
+
 
                 if ((newGroup == "DU ") and (cSet.size > 1)) {
+
                 # Else if XH 2
                     newGroup = "DT "
+
                 else if (newAtomName == "XH") { # ARG
 +
                     newGroup = "ARG"
 +
                    s1 = "R"
 +
                    newGreek = "H"
 +
                    newAtomName = "N"
 
                 }
 
                 }
                nextAtomName = "C6"
+
            }
                 break
+
 
            case "C6" :
+
            # Else cSet.size = 3
                 if (newGroup == "PU") {
+
            else {
                     nIdx = ring_common( cSet, nIdx, s, newGreek, "1")
+
                 # If  O
                    newGroup = ((cSet[1].element == "O") ? "DG " : "DA ")
+
                 if (newAtomName == "O") {
                    nextAtomName = "N1"
+
                     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]]
 +
                    newGreek = ""
 +
                    newAtomName = (isCB ? "CB" : "N")
 
                 }
 
                 }
                 else {
+
                 else if (newAtomName == "CA") { # PRO
                     if (psu) {
+
                    var iKeep = -1
                        psu = false
+
                     for (var i = 1; i <= cSet.size; i++) {
                         newGroup = "DU "
+
                        if (connected(cSet[i]) > 2) {
 +
                            iKeep = i
 +
                         }
 
                     }
 
                     }
                     cSet = ({})
+
                     cSet = cSet[iKeep]
 +
 
 +
                    newGreek = "A"
 +
                    newAtomName = "C"
 
                 }
 
                 }
                 break
+
                 else if (newAtomName == "XE") { # TRP
            case "N1" :
+
                    for (var i = 1; i <= cSet.size; i++) {
                if (connected({atomIndex=nIdx}).size > 2) { # YG
+
                        if (cSet[i].element == "N") {
                    newGroup = ""
+
                            s[1] = i
                }
+
                        }
                nIdx = ring_common( cSet, nIdx, s, newGreek, "2")
+
                        else if (connected(cSet[i]) > 2) {
                nextAtomName = "C2"
+
                            s[2] = i
                break
+
                        }
            case "C2" :
+
                        else {
                nIdx = ring_common( cSet, nIdx, s, newGreek, "3")
+
                            s[3] = i
                nextAtomName = "N3"
+
                        }
                stopIdx = -1
+
                    }
                break
+
                    newGroup = "TRP"
            case "N3" :
+
                    s1 = "W"
                nIdx = ring_common( cSet, nIdx, s, newGreek, "4")
+
                    newGreek = "E"
                nextAtomName = "C4"
+
                    newAtomName = "XZ"
                break
 
            case "C4" :
 
                if (newGroup != "PY") {
 
                    cSet = ({})
 
 
                 }
 
                 }
 
                 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[i].element + newGreek[s[i]]))
+
                     (cSet[s[i]].element + newGreek
                 rs += format("%s%4d    %8.3f", newChain, newResno, cSet[i].x)
+
                    + ((cSet.size > 1) ? (i+pTrp) : newCount)))
                 rs += format("%8.3f%8.3f\n", cSet[i].y, cSet[i].z)
+
                 rs += format("%s%4d    %8.3f", newChain, newResno, cSet[s[i]].x)
 +
                 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
         cset = {atomIndex=idx}
+
         if (oxtIdx >= 0) {
        select cSet
+
            rs += format("ATOM  %5d  OXT UNK %s", newAtomNo, newChain)
        while (cSet.size > 0) {
+
             rs += format("%4d    %8.3f", newResno, {atomIndex=oxtIdx}.x)
             cSet = connected({selected}) and not {selected}
+
            rs += format("%8.3f%8.3f\n", {atomIndex=oxtIdx}.y, {atomIndex=oxtIdx}.z)
            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) {
+
# Top level of Remap
    var f = (_frameID/1000000)
+
function plico_remap() {
     var m = (_frameID%1000000)
+
 
    var resmin = {(chain=iChain) and (file=f) and (model=m)}.resno.min
+
     # Load common functions if not already
    var resmax = {(chain=iChain) and (file=f) and (model=m)}.resno.max
+
     if (kCommon < 6) {
    var rchar = (({(resno=resmin) and (chain=iChain) and (file=f)
+
         script $SCRIPT_PATH$plicoCommon.spt
        and (model=m)}.group[0].size > 1) ? "" : "R")
+
         if (kCommon < 6) {
    var lcAtoms = (within(3.1, false, {(resno=resmin) and (chain=iChain)
+
             prompt ("A newer version of plicoCommon.SPT is required")
        and (file=f) and (model=m) and base})
+
             quit
        and not {(resno=resmin) and (chain=iChain) and (file=f) and (model=m)})
 
    var chain2 = ""
 
    var schar = "S"
 
     if (lcAtoms.size > 0) {
 
         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 = {(chain=iChain) and (file=f) and (model=m)}.resno.min;
 
        i <= {(chain=iChain) and (file=f) and (model=m)}.resno.max; i++) {
 
        ls += ({(resno=i) and (chain=iChain) and (file=f) and (model=m)}.group[0])[0]
 
    }
 
    print ls
 
}
 
  
# Top level of Remap
+
     gPlico = "Remap"
function plico_remap_nt() {
+
     plico_prelim(false, true)
 
+
      
    # Push selected
+
     gEcho = "_______REMAP_______|ALT-CLICK=select chain|SHIFT-DOUBLE-CLICK=exit"
     gSelSaves = {selected}
 
 
 
     gAppendNew = appendNew
 
    set appendNew false
 
    gScheme = defaultColorScheme
 
    gAltScheme = ((gScheme == "Jmol") ? "Rasmol" : "Jmol")
 
    set echo TOP LEFT
 
     background ECHO yellow
 
     gEcho = "_____REMAP NT_____|ALT-CLICK=select NT chain|DOUBLE-CLICK=exit"
 
 
     echo @gEcho
 
     echo @gEcho
    gChain = ""
 
    gMenuMin = false
 
    unbind
 
  
 
     set picking ON
 
     set picking ON
 
     bind "ALT-LEFT-CLICK" "_pickAtom";
 
     bind "ALT-LEFT-CLICK" "_pickAtom";
     bind "ALT-LEFT-CLICK" "+:remap_nt_cargo_mb";
+
     bind "ALT-LEFT-CLICK" "+:remap_cargo_mb";
     bind "DOUBLE" "remap_nt_exit";
+
     bind "SHIFT-DOUBLE" "plico_exit(true)";
 
     bind "LEFT-CLICK" "+:plico_menu_toggle";
 
     bind "LEFT-CLICK" "+:plico_menu_toggle";
 
}
 
}
  
# Bound to DOUBLE by plicoRemap
+
# End of REMAP.SPT</pre>
function remap_nt_exit() {
 
    unbind
 
    halo off
 
    echo
 
    var f = (_frameID/1000000)
 
    var m = (_frameID%1000000)
 
    select ((file=f) and (model=m))
 
    color {selected} @gScheme
 
    gBusy = false
 
    set appendNew gAppendNew
 
 
 
    # Pop selected
 
    select gSelSaves
 
}
 
 
 
# End of REMAPNT.SPT
 
</pre>
 

Revision as of 14:41, 11 September 2015

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:

Title=PLICO Remap Polynucleotide
Script=script <path to your scripts folder>/remapNT.spt;plico_remap_nt

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:

#   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
#    numbers and print the resultant 1 char string
#
gAppendNew = false
gBusy = false

# Search for N-C-C-0
function get_bb_nward_ca_idx(idx) {
    if ({atomIndex=idx}.element == "N") {
        var c1 = (connected({atomIndex=idx}) and not {hydrogen})
        for (var i1 = 1; i1 <= c1.size; i1++) {
            if (c1[i1].element == "C") {
                var c2 = (connected({atomIndex=@{c1[i1].atomIndex}}) and not {hydrogen})
                for (var i2 = 1; i2 <= c2.size; i2++) {
                    if (c2[i2].element == "C") {
                        var c3 = (connected({atomIndex=@{c2[i2].atomIndex}})
                            and not {hydrogen})
                        for (var i3 = 1; i3 <= c3.size; i3++) {
                            if (c3[i3].element == "O") {
                                return c1[i1].atomIndex
                            }
                        }
                    }
                }
            }
        }
    }
    return -1
}

# Find N-terminal N
function find_n0_idx(aIdx) {

    select {atomIndex=aIdx}
    var sSet = {selected}
    while (sSet) {
        for (var i = 1; i <= sSet.size; i++) {
            var idx = sSet[i].atomIndex
            var caIdx = get_bb_nward_ca_idx(idx)
            if (caIdx >= 0) {
                var cset = connected({atomIndex=idx}) and not {hydrogen}
                var ccset = connected(cset) and not {hydrogen}
                if (cset.size < 2) {
                    return idx #***
                }
                else if (({ccset and {carbon}}.size = 3) and (ccset.size == 4)) { 
                    return idx #***
                }
            }
        } # endfor
        
        sSet = connected({selected}) and not {selected} and not {hydrogen}
        select {selected} or sSet
    } # endwhile
    
    return -1
}

# Bound to ALT-LEFT-CLICK by plico_remap
function remap_cargo_mb() {
    var idx =_atomPicked

    if ({atomIndex=idx}.element == "H") {
        idx = connected({atomIndex=idx})[1].atomIndex
    }

    # If n-terminal N can be found
    var n0idx = find_n0_idx(idx)
    var isValid = false
    var newResno = 1
    var newChain = "A"
    var newAtomno = 1
    if (n0idx >= 0) {

        # Prompt for new designators
        f = {atomIndex=n0idx}.file
        m = {atomIndex=n0idx}.model
        var iResno = {atomIndex=n0idx}.resno
        var iChain = {atomIndex=n0idx}.chain
        var iNo = {atomIndex=n0idx}.atomno
        select {thisModel}
        color {selected} @gScheme
        select {(chain=iChain) and thisModel}
        color {selected} @gAltScheme
        refresh
        var p = prompt("Enter n-terminal atom designator as\n"
            + "   <resno>:<chain>.N#<atomno>",
            format("%d:%s.N#%d", iResno, iChain, iNo)%0)

        # If valid
        var iColon = p.find(":")
        if (iColon > 0) {
            var iDot = p.find(".")
            if (iDot > 0) {
                var iHash = p.find("#")
                if (iHash > 0) {
                    newResno = 0 + (p[1][iColon-1])
                    newChain = p[iColon+1][iDot-1]
                    newAtomno = 0 + (p[iHash+1][0])
                    if ((newResno > 0)
                        and (newChain.size == 1)
                        and (newAtomno > 0)) {
                            isValid = true
                    }
                }
            }
        }
    }
    if (isValid) {

        delete {hydrogen and thisModel}
        delete {hoh and thisModel}
        delete %B and thisModel
        ssbonds off

        # Build inline pdb file
        var ls = "data \"append remap\"\n"
        var rs = ""
        var ls1 = format("%s:", newChain)

        select {atomIndex=n0idx}
        var cSet = {selected}
        var newAtomName = "N"
        var newGroup = "UNK"
        var s1 = "X"
        var newGreek = ""
        var newCount = ""
        var isCB = false
        var nIdx = n0idx
        var proDidx = -1
        var oxtIdx = -1
        while ((nIdx >= n0idx) or (cSet)) {
            var s = array(1, 2, 3)
            var pTrp = 0
            if (cSet.size == 0) {
                    ls += rs.replace("UNK", newGroup).replace("  SeG" , " SeG ")
                    ls1 += s1
                    rs = ""
                    newResno++
                    nIdx = -1
                    proIdx = -1
                    newGroup = "UNK"
                    s1 = "X"
                    newAtomName = "N"
                    isCB = false
            }
            else if (cSet.size == 1) {
                if (newAtomName == "N") {
                    newGreek = ""
                    newAtomName = "CA"
                }
                else if (newAtomName == "CA") {
                    newGreek = "A"
                    newAtomName = "C"
                }
                else if (newAtomName == "C") {
                    newGroup = "GLY"
                    s1 = "G"
                    newGreek = ""
                    newAtomName = "O"
                }
                else if (newAtomName == "CB") {
                    if (cSet[1].element == "C") {
                        newGroup = "ALA" # for now
                        s1 = "A"
                        newGreek = "B"
                    }
                    newAtomName = "XG"
                }
                else if (newAtomName == "XG") {
                    if (proDidx >= 0) {
                        newGroup = "PRO"
                        s1 = "P"
                        proDidx = -1
                    }
                    if (cSet[1].element == "O") { # SER CYS SEC
                        newGroup = "SER"
                        s1 = "S"
                    }
                    else if (cSet[1].element == "S") {
                        newGroup = "CYS"
                        s1 = "C"
                    }
                    else if (cSet[1].element == "Se") {
                        newGroup = "SEC"
                        s1 = "U"
                    }
                    newGreek = "G"
                    newAtomName = "XD"
                }
                else if (newAtomName == "XD") {
                    if (newGroup == "VAL") {
                        newGroup = "ILE"
                        s1 = "I"
                        newCount = "1"
                    }
                    newGreek = "D"
                    newAtomName = "XE"
                }
                else if (newAtomName == "XE") {
                    newGroup = "MET"
                    s1 = "M"
                    newGreek = "E"
                    newAtomName = "XZ"
                }
                else if (newAtomName == "XZ") {
                    if (cSet[1].element == "N") {
                        newGroup = "LYS"
                        s1 = "K"
                    }
                    else {
                        newGroup = "PHE" # for now
                        s1 = "F"
                    }
                    newGreek = "Z"
                    newAtomName = "XH"
                }
                else if (newAtomName == "XH") {
                    if (cSet[1].element == "O") {
                        newGroup = "TYR"
                        s1 = "Y"
                    }
                    else {
                        newGroup = "TRP" # for now
                        s1 = "W"
                        newCount = "2"
                    }
                    newGreek = "H"
                    newAtomName = "N"
                }
            }
            else if (cSet.size == 2) {
                var hasN = ((cSet[1].element == "N") or (cSet[2].element == "N"))
                var hasO = ((cSet[1].element == "O") or (cSet[2].element == "O"))

                # If CA 2
                if (newAtomName == "CA") {
                    var iKeep = -1
                    for (var i = 1; i <= cSet.size; i++) {
                        if (connected(cSet[i]) > 2) {
                            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
                }


                # Else if XG or XGn 2
                else if (newAtomName == "XG") { # VAL THR ILE
                    newGroup = (hasO ? "THR" : "VAL")
                    s1 = (hasO ? "T" : "V")
                    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 {
                        newGroup = "LEU" # for now
                        s1 = "L"
                    }
                    newGreek = "D"
                    newAtomName = "XE"
                }

                # Else if XE or XEn 2
                else if (newAtomName == "XE") { # GLU GLN HIS
                    if ((cSet[2].element == "O") or (cSet[1].element == "N")
                        or ((cSet[1].element == "C") and (cSet[2].element != "C"))) {
                        bRev = true
                    }
                    if (hasO) {
                        if (hasN) {
                            newGroup = "GLN"
                            s1 = "Q"
                        }
                        else {
                            newGroup = "GLU"
                            s1 = "E"
                        }
                    }
                    newGreek = "E"
                    newAtomName = "XZ"
                }

                # Else if XZ 2
                else if (newAtomName == "XZ") { # ARG
                    if (newGroup == "TRP") {
                        pTrp = 1
                    }
                    newGreek = "Z"
                    newAtomName = "XH"
                }

                # Else if XH 2
                else if (newAtomName == "XH") { # ARG
                    newGroup = "ARG"
                    s1 = "R"
                    newGreek = "H"
                    newAtomName = "N"
                }
            }

            # Else cSet.size = 3
            else {
                # 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]]
                    newGreek = ""
                    newAtomName = (isCB ? "CB" : "N")
                }
                else if (newAtomName == "CA") { # PRO
                    var iKeep = -1
                    for (var i = 1; i <= cSet.size; i++) {
                        if (connected(cSet[i]) > 2) {
                            iKeep = i
                        }
                    }
                    cSet = cSet[iKeep]

                    newGreek = "A"
                    newAtomName = "C"
                }
                else if (newAtomName == "XE") { # TRP
                    for (var i = 1; i <= cSet.size; i++) {
                        if (cSet[i].element == "N") {
                            s[1] = i
                        }
                        else if (connected(cSet[i]) > 2) {
                            s[2] = i
                        }
                        else {
                            s[3] = i
                        }
                    }
                    newGroup = "TRP"
                    s1 = "W"
                    newGreek = "E"
                    newAtomName = "XZ"
                }
                else {
                }
            }

            for (var i = 1; i <= cSet.size; i++) {
                rs += format("ATOM  %5d  %-4sUNK ", newAtomNo,
                    (cSet[s[i]].element + newGreek
                    + ((cSet.size > 1) ? (i+pTrp) : newCount)))
                rs += format("%s%4d    %8.3f", newChain, newResno, cSet[s[i]].x)
                rs += format("%8.3f%8.3f\n", cSet[s[i]].y, cSet[s[i]].z)
                if (newGreek == "XT") {
                    newGreek == ""
                }
                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})

        } # endwhile

        # Replace chain with new chain
        if (oxtIdx >= 0) {
            rs += format("ATOM  %5d  OXT UNK %s", newAtomNo, newChain)
            rs += format("%4d    %8.3f", newResno, {atomIndex=oxtIdx}.x)
            rs += format("%8.3f%8.3f\n", {atomIndex=oxtIdx}.y, {atomIndex=oxtIdx}.z)
        }
        ls += rs.replace("UNK", newGroup).replace("  SeG" , " SeG ")
        ls1 += s1
        delete {selected}
        ls += "end \"append remap\""
        gAppendNew = appendNew
        set appendNew false
        script inline @{ls}
        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 {
        color {selected} @gScheme
    }
}

# Top level of Remap
function plico_remap() {

    # 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
        }
    }

    gPlico = "Remap"
    plico_prelim(false, true)
    
    gEcho = "_______REMAP_______|ALT-CLICK=select chain|SHIFT-DOUBLE-CLICK=exit"
    echo @gEcho

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

# End of REMAP.SPT

Contributors

Remig