From: Tristan Croll (
Date: Thu Mar 20 2014 - 01:20:29 CDT

Hi all,

I've written a little tcl proc to autogenerate the patches to link glycan residues to each other and to asparagine residues. At the moment it only works for the four residue types I've been using and for N-linked glycans, but adding extra residues and O-linkage should be minimal hassle. To use it, you need a structure loaded in VMD which has already been through autopsf or psfgen without patches. It then goes through these and looks for oxygen or nitrogen atoms clashing with the O1 atom of each residue, and writes the corresponding patch. To extend it to other glycan residues, you'll have to add your residue name to $glycannames, and also where applicable to the lines with comments of the form "add residues with an axial On to this list".

At the moment it just writes out the patches to a text file called "patchlist.txt" ready to be copied in to a psfgen script. However, if I understand correctly it's not too far off how the automatic disulfide generation works in autopsf, and I suspect with a little tinkering it could easily be incorporated there.

I've also written a little plugin analogous to the cispeptide and chirality plugins to check (and restrain) glycan residues in their ideal chair configuration. No gui yet, but

glycanrestraints check ...

will give you a list of glycan residues which have flipped out of their ideal configurations, and

glycanrestraints restrain ...

will give you an extrabonds file to restrain them to the ideal (or force them back to the ideal if they've deviated away).

I've copied in the autogeneration proc below. Not sure if I'm allowed to attach a tarball for the glycanrestraints plugin, but will happily email it to anyone who's interested.



proc makeglycanpatches {{mol top} {chain {A to Z}}} {
    set outfilename "patchlist.txt"
    set glycannames {AMAN BMAN AFUC BGLN}
    set O1sel [atomselect $mol "chain $chain and resname $glycannames and name O1"]
    set O1list [list [$O1sel get resname] [$O1sel get segname] [$O1sel get resid] [$O1sel get index]]
     # set linkresnamelist {}
     # set linksegnamelist {}
     # set linkresidlist {}
     # set linknamelist {}
    $O1sel delete
    foreach O1 [lindex $O1list 3] {
      set linkatom [atomselect top "name O2 O3 O4 O6 ND2 and within 1 of index $O1"]
      lappend linkresnamelist [$linkatom get resname]
      lappend linksegnamelist [$linkatom get segname]
      lappend linkresidlist [$linkatom get resid]
      lappend linknamelist [$linkatom get name]
      $linkatom delete
    set out [open $outfilename w]
    foreach currentresname [lindex $O1list 0] currentsegname [lindex $O1list 1] currentresid [lindex $O1list 2] linkresname $linkresnamelist linksegname $linksegnamelist linkresid $linkresidlist linkname $linknamelist {
       # set currentresname [lindex $O1 0]
       # set currentsegname [lindex $O1 1]
       # set currentresid [lindex $O1 2]
       # set linkresname [lindex $link 0]
       # set linksegname [lindex $link 1]
       # set linkresid [lindex $link 2]
       # set linkname [lindex $link 3]
      if {[lsearch "AMAN AFUC" $currentresname] != -1} { ;# add residues with an axial O1 to this list
          set dir1 "a"
      } else {
          set dir1 "b"
      set link2num -1 ; # to catch case of an unlinked glycan
      set protlink 0
      if {$linkname == "ND2"} {
          set protlink 1
      } elseif {$linkname == "O2"} {
          set link2num 2
          if {[lsearch "AMAN BMAN" $linkresname] != -1} { ;# add residues with an axial O2 to this list
            set dir2 "a"
          } else {
            set dir2 "b"
      } elseif {$linkname == "O3"} {
          set link2num 3
          if {[lsearch "put residues with an axial O3 here" $linkresname] != -1} { ;# add residues with an axial O3 to this list
            set dir2 "a"
          } else {
            set dir2 "b"
      } elseif {$linkname == "O4"} {
          set link2num 4
          if {[lsearch "AFUC" $linkresname] != -1} { ;# add residues with an axial O4 to this list
            set dir2 "a"
          } else {
            set dir2 "b"
      } elseif {$linkname == "O6"} {
          set link2num 6
          set dir2 "b"

      if {$protlink} {
          puts $out "PATCH NGLB $linksegname:$linkresid $currentsegname:$currentresid"
      } elseif {$link2num != -1} {

          puts $out "PATCH 1$link2num$dir1$dir2 $linksegname:$linkresid $currentsegname:$currentresid"
      } else {
          puts "WARNING: glycan residue $currentresname $currentsegname:$currentresid has no link at reducing terminus"

    close $out

Tristan Croll
Faculty of Health
Institute of Health and Biomedical Engineering
Queensland University of Technology
60 Musk Ave
Kelvin Grove QLD 4059 Australia
+61 7 3138 6443

This email and its attachments (if any) contain confidential information intended for use by the addressee and may be privileged. We do not waive any confidentiality, privilege or copyright associated with the email or the attachments. If you are not the intended addressee, you must not use, transmit, disclose or copy the email or any attachments. If you receive this email by mistake, please notify the sender immediately and delete the original email.