Difference between revisions of "User talk:Remig"
Jump to navigation
Jump to search
(Ribozome - an Alpha Helix Generator) |
(Alpha Helix generator) |
||
| Line 1: | Line 1: | ||
I use Jmol to study protein folding. Here is a script I wrote that accepts an amino acid sequence (1 letter encoding: "AAC...FYW" for example) and generates an alpha helix using the Model Kit: | I use Jmol to study protein folding. Here is a script I wrote that accepts an amino acid sequence (1 letter encoding: "AAC...FYW" for example) and generates an alpha helix using the Model Kit: | ||
| − | <pre># RIBOZOME - Jmol script by Ron Mignery | + | <pre># RIBOZOME - Jmol script by Ron Mignery with help from Dr. Angel Herráez |
| − | # v1. | + | # v1.2 beta 10/23/2013 |
# | # | ||
| − | # | + | # New in v1.2 beta: |
| − | # | + | # No longer zaps existing atoms |
| − | # | + | # Now adds on to existing helix on subsequent runs |
| + | # Fixes proline cross-link bug with XXXXPXP | ||
| + | # Localizes variables and globalizes constants | ||
# | # | ||
| − | # | + | # RIBOZOME takes a string message encoding an amino acid (aa) sequence |
| − | # | + | # and generates a corresponding alpha helix one aa at a time from the |
| + | # N terminus to the C terminus rotating the emerging helix as it goes. | ||
# | # | ||
| − | # The | + | # The message is a string entered by the user at a prompt. |
| − | # | + | # It may be typed in or pasted in and be of any length |
| − | + | # If the message is prepended with <C>: (where C is any single letter) | |
| − | + | # then the chain is so labeled and separated from existing chains | |
| − | + | # if different from the first chain. | |
| − | |||
| − | |||
| − | # | ||
| − | # | ||
| − | # | ||
# | # | ||
| + | # The IUPAC/IUBMB 1 letter code is used: | ||
| + | # A=ALAnine B=GLutam?X* C=CYSteine D=ASPartate E=GLUtamate | ||
| + | # F=PHEnylalanine G=GLYcine H=HIStidine I=IsoLEucine K=LYSine | ||
| + | # L=LEUcine M=METhionine N=ASparagiNe O=PYrroLysine*** P=PROline | ||
| + | # Q=GLutamiNe R=ARGinine S=SERine T=THReonine U=SElenoCysteine | ||
| + | # V=VALine W=TRyPtophan X=UNKnown Y=TYRosine Z=ASpar?X** | ||
| + | # *Either GLU or GLN: drawn as GLN with chi3 flipped | ||
| + | # **Either ASP or ASN: drawn as ASN with chi3 flipped | ||
| + | # ***Not supported: drawn as ALA | ||
# The following constant values determine the pitch of the alpha helix | # The following constant values determine the pitch of the alpha helix | ||
| − | + | gPHI = -57 # Dihedral angle of N-CA bond (nominally -57) | |
| − | + | gPSI = -47 # Dihedral angle of CA-C bond (nominally -47) | |
| − | + | gOMEGA = 180 # Dihedral angle of the peptide bond (nominally 180) | |
| − | + | gPEPTIDE_ANGLE = 110 # C-N-CA angle (nominally 110) | |
| − | + | gPRO_BUMP = -10 # Psi angle change increment to N-3psi when N is Pro | |
| + | gCHAIN = 'A' # The chain id | ||
# Lookup 3 letter code from 1 letter code | # Lookup 3 letter code from 1 letter code | ||
| − | + | g3from1 = {"A":"ALA", "B":"GLX","C":"CYS", "D":"ASP","E":"GLU", "F":"PHE", | |
| − | + | "G":"GLY", "H":"HIS","I":"ILE", "K":"LYS","L":"LEU", "M":"MET", | |
| − | + | "N":"GLN", "O":"PYL","P":"PRO", "Q":"GLN","R":"ARG", "S":"SER", | |
| − | + | "T":"THR", "U":"SEC","V":"VAL", "W":"TRP","X":"UNK", "Y":"TYR", "Z":"ASX"} | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | } | ||
| − | # Generate | + | # Generate PDB atom record |
| − | function genAtom( | + | function genAtom(e, aa, i, xyz) { |
| − | + | gA = format("ATOM %5d %4s %3s ", gN, e, aa ) | |
| − | + | gA += format("%s%4d %8.3f", gCHAIN, i, xyz[1] ) | |
| − | + | gA += format("%8.3f%8.3f\n", xyz[2], xyz[3] ) | |
| − | + | gn++ | |
| + | return gA | ||
}; | }; | ||
| − | # Generate | + | # Generate a PDB amino acid record set |
| − | function genAA(i, aa | + | function genAA(i, aa) { # Writes globals gA and gN |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | # From constructed AAs | |
| − | } | + | var N0 = [0.0, 0.0, 0.0] |
| + | var CA = [ 0.200, 1.174, 0.911 ] | ||
| + | var C = [ -1.110, 1.668, 1.425 ] | ||
| + | var O = [ -1.320, 1.693, 2.62 ] | ||
| + | var CB = [ 1.062, 2.1950, 0.230 ] | ||
| + | |||
| + | var G1 = [ 2.359, 1.607, -0.344] | ||
| + | var G2 = [ 1.363, 3.336, 1.157 ] | ||
| + | var D1 = [ 3.222, 2.656, -1.048 ] | ||
| + | var D2 = [ 3.143, 0.904, 0.725 ] | ||
| + | var E1 = [ 3.645, 3.749, -0.167 ] | ||
| + | var E2 = [ 2.491, 3.234, -2.249 ] | ||
| + | var Z = [ 4.470, 4.717, -0.885 ] | ||
| + | var H1 = [ 4.450, 6.006, -0.220 ] | ||
| + | var H2 = [5.833, 4.228, -0.984 ] | ||
| + | |||
| + | var Gp = [ 2.008, 1.24, -0.46 ] | ||
| + | var Dp = [1.022, 0.213, -1.031 ] | ||
| + | |||
| + | var Gfy = [ 2.368, 1.471, -0.0152 ] | ||
| + | var D1fy = [ 3.346, 1.524, 0.921 ] | ||
| + | var D2fy = [ 2.493, 0.516, -1.151 ] | ||
| + | var E1fy = [ 4.513, 0.615, 0.8244 ] | ||
| + | var E2fy = [ 3.528, -0.336, -1.206 ] | ||
| + | var Zfy = [ 4.588, -0.285, -0.168 ] | ||
| + | var Hfy = [ 5.738, -1.245, -0.233 ] | ||
| + | |||
| + | var Ghw = [ 2.406, 1.626, -0.134 ] | ||
| + | var D1hw = [3.498, 1.936, 0.675] | ||
| + | var D2hw = [ 2.713, 0.901, -1.211 ] | ||
| + | var E1hw = [ 4.160, 0.518, -1.178 ] | ||
| + | var E2hw = [ 4.622, 1.160, 0.0816 ] | ||
| + | var E3hw = [ 3.789, 2.523, 1.944 ] | ||
| + | var Z2hw = [ 5.973, 1.177, 0.689 ] | ||
| + | var Z3hw = [ 5.014, 2.550, 2.503 ] | ||
| + | var H2hw = [ 6.153, 1.846, 1.844 ] | ||
| + | |||
| + | #N1 = [ 2.069, -2.122, -0.554] | ||
| + | |||
| + | # Build PDB atom records common to all AAs | ||
| + | a3 = g3from1[aa] | ||
| + | if (a3 = "") { | ||
| + | a3 = "UNK" | ||
| + | } | ||
| + | print format("+ %s%d/%d", a3, i, gSeq.count + gResno) | ||
| + | gA = genAtom(" N ", a3, i, N0) | ||
| + | gA += genAtom(" CA ", a3, i, CA) | ||
| + | gA += genAtom(" C ", a3, i, C) | ||
| + | gA += genAtom(" O ", a3, i, O) | ||
| + | if ((aa != 'G') && (aa != 'X')) { | ||
| + | gA += genAtom(" CB ", a3, i, CB) | ||
| + | } | ||
| − | + | # Now add AA specific atom records | |
| − | + | switch (aa) { | |
| − | + | case 'A' : | |
| − | + | break; | |
| − | + | case 'B' : | |
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" CD ", a3, i, D1) | ||
| + | gA += genAtom(" OE1", a3, i, E2) # GLN with Es switched | ||
| + | gA += genAtom(" NE2", a3, i, E1) | ||
| + | break; | ||
| + | case 'C' : | ||
| + | gA += genAtom(" SG ", a3, i, G2) | ||
| + | break; | ||
| + | case 'D' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" OD1", a3, i, D1) | ||
| + | gA += genAtom(" OD2", a3, i, D2) | ||
| + | break; | ||
| + | case 'E' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" CD ", a3, i, D1) | ||
| + | gA += genAtom(" OE1", a3, i, E1) | ||
| + | gA += genAtom(" OE2", a3, i, E2) | ||
| + | break; | ||
| + | case 'F' : | ||
| + | gA += genAtom(" CG ", a3, i, Gfy) | ||
| + | gA += genAtom(" CD1", a3, i, D1fy) | ||
| + | gA += genAtom(" CD2", a3, i, D2fy) | ||
| + | gA += genAtom(" CE1", a3, i, E1fy) | ||
| + | gA += genAtom(" CE2", a3, i, E2fy) | ||
| + | gA += genAtom(" CZ ", a3, i, Zfy) | ||
| + | break; | ||
| + | case 'G' : | ||
| + | break; | ||
| + | case 'H' : | ||
| + | gA += genAtom(" CG ", a3, i, Ghw) | ||
| + | gA += genAtom(" ND1", a3, i, D1hw) | ||
| + | gA += genAtom(" CD2", a3, i, D2hw) | ||
| + | gA += genAtom(" CE1", a3, i, E2hw) | ||
| + | gA += genAtom(" NE2", a3, i, E1hw) | ||
| + | break; | ||
| + | case 'I' : | ||
| + | gA += genAtom(" CG1", a3, i, G1) | ||
| + | gA += genAtom(" CG2", a3, i, G2) | ||
| + | gA += genAtom(" CD1", a3, i, D1) | ||
| + | break; | ||
| + | case 'K' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" CD ", a3, i, D1) | ||
| + | gA += genAtom(" CE ", a3, i, E1) | ||
| + | gA += genAtom(" NZ ", a3, i, Z) | ||
| + | break; | ||
| + | case 'L' : | ||
| + | gA += genAtom(" CG1", a3, i, G1) | ||
| + | gA += genAtom(" CD1", a3, i, D1) | ||
| + | gA += genAtom(" CD2", a3, i, D2) | ||
| + | break; | ||
| + | case 'M' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" SD ", a3, i, D1) | ||
| + | gA += genAtom(" CE ", a3, i, E1) | ||
| + | break; | ||
| + | case 'N' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" OD1", a3, i, D1) | ||
| + | gA += genAtom(" ND2", a3, i, D2) | ||
| + | break; | ||
| + | case 'P' : | ||
| + | gA += genAtom(" CG ", a3, i, GP) | ||
| + | gA += genAtom(" CD ", a3, i, DP) | ||
| + | break; | ||
| + | case 'Q' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" CD ", a3, i, D1) | ||
| + | gA += genAtom(" OE1", a3, i, E1) | ||
| + | gA += genAtom(" NE2", a3, i, E2) | ||
| + | break; | ||
| + | case 'R' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" CD ", a3, i, D1) | ||
| + | gA += genAtom(" NE ", a3, i, E1) | ||
| + | gA += genAtom(" CZ ", a3, i, Z) | ||
| + | gA += genAtom(" NH1", a3, i, H1) | ||
| + | gA += genAtom(" NH2", a3, i, H2) | ||
| + | break; | ||
| + | case 'S' : | ||
| + | gA += genAtom(" OG ", a3, i, G1) | ||
| + | break; | ||
| + | case 'T' : | ||
| + | gA += genAtom(" OG1", a3, i, G1) | ||
| + | gA += genAtom(" CG2", a3, i, G2) | ||
| + | break; | ||
| + | case 'U' : | ||
| + | gA += genAtom("SeG ", a3, i, G1) | ||
| + | break; | ||
| + | case 'V' : | ||
| + | gA += genAtom(" CG1", a3, i, G1) | ||
| + | gA += genAtom(" CG2", a3, i, G2) | ||
| + | break; | ||
| + | case 'W' : | ||
| + | gA += genAtom(" CG ", a3, i, Ghw) | ||
| + | gA += genAtom(" CD1", a3, i, D1hw) | ||
| + | gA += genAtom(" CD2", a3, i, D2hw) | ||
| + | gA += genAtom(" CE2", a3, i, E2hw) | ||
| + | gA += genAtom(" NE1", a3, i, E1hw) | ||
| + | gA += genAtom(" CE3", a3, i, E3hw) | ||
| + | gA += genAtom(" CZ2", a3, i, Z2hw) | ||
| + | gA += genAtom(" CZ3", a3, i, Z3hw) | ||
| + | gA += genAtom(" CH2", a3, i, H2hw) | ||
| + | break; | ||
| + | case 'X' : | ||
| + | gA += genAtom(" Xx ", a3, i, CB) | ||
| + | break; | ||
| + | case 'Y' : | ||
| + | gA += genAtom(" CG ", a3, i, Gfy) | ||
| + | gA += genAtom(" CD1", a3, i, D1fy) | ||
| + | gA += genAtom(" CD2", a3, i, D2fy) | ||
| + | gA += genAtom(" CE1", a3, i, E1fy) | ||
| + | gA += genAtom(" CE2", a3, i, E2fy) | ||
| + | gA += genAtom(" CZ ", a3, i, Zfy) | ||
| + | gA += genAtom(" OH ", a3, i, Hfy) | ||
| + | break; | ||
| + | case 'Z' : | ||
| + | gA += genAtom(" CG ", a3, i, G1) | ||
| + | gA += genAtom(" OD1", a3, i, D2) # ASN with Ds switched | ||
| + | gA += genAtom(" ND2", a3, i, D1) | ||
| + | break; | ||
| + | default : | ||
| + | break; | ||
| + | } | ||
| + | return gA | ||
}; | }; | ||
| − | # | + | # Generate an alpha helix |
| − | function genAlpha( | + | function genAlpha(gSeq) { |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | gN = all.count + 1 # global new N atom index | |
| − | |||
| − | |||
| − | |||
| − | + | # Find last linkable N if any | |
| − | + | gResno = 0 # global pre-existing AA count | |
| − | + | var pn = 1 # previous gN | |
| − | + | for (var i = all.count-1; i > 0; i--) { | |
| − | + | ||
| + | # If found | ||
| + | if (distance({atomno=i}, {0,0,0}) < 0.1) { | ||
| + | pn = i | ||
| + | |||
| + | # If new chain, separate from existing chain | ||
| + | if ({atomno=i}.chain != gCHAIN) { | ||
| + | select all | ||
| + | translateselected {2.069, -2.122, -0.554 } #N1 | ||
| + | } | ||
| + | else { | ||
| + | gResno = {atomno=i}.resno | ||
| + | } | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| − | + | # For each aa | |
| − | + | set appendnew false | |
| − | + | var nn = gN # new N | |
| − | + | for (var i = 1; i <= gSeq.count; i++) { | |
| − | |||
| − | |||
| − | + | # Move polypeptide C to bond distance from new AA N | |
| − | + | select all | |
| + | fix none | ||
| + | translateselected {2.069, -2.122, -0.554 } #N1 | ||
| − | + | # Gen AA | |
| − | + | gA = "data \"append aa\"\n" # global PDB atom record | |
| − | + | gA += genAA(i + gResno, gSeq[i]); # gN is updated in subroutine | |
| − | + | gA += "end \"append aa\"" | |
| − | + | script inline @{gA} | |
| − | |||
| − | |||
| − | |||
| − | + | # If PRO | |
| − | + | var pb = 0 | |
| − | + | if ((gSeq.count - i) >= 2) { | |
| − | + | if (gSeq[i + 2] == 'P') { | |
| − | + | pb = gPRO_BUMP | |
| + | } | ||
| + | } | ||
| − | + | # If not first AA | |
| − | + | if (nn > 1) { | |
| − | + | # Gen axis on new N perpendicular to the plane | |
| − | + | # containing atoms nn, pn+2 and nn+1 | |
| + | var v1={atomno = @{pn+2}}.xyz - {atomno = nn}.xyz | ||
| + | var v2={atomno = @{nn+1}}.xyz - {atomno = nn}.xyz | ||
| + | var axis = cross(v1, v2) | ||
| + | |||
| + | # Center on atom previous C | ||
| + | axis += {atomno = @{pn+2}}.xyz | ||
| − | + | # Rotate the polypeptide N on the new AA C to tetrahedral (nominally 110) | |
| − | + | select atomno < nn | |
| − | + | fix atomno >= nn | |
| − | + | rotateselected @axis {atomno = nn} @{gPEPTIDE_ANGLE - 69.3} | |
| + | |||
| + | # Make omega dihedral = gOMEGA (nominally 180) | ||
| + | rotateselected {atomno=@{pn+2}} {atomno=nn} @{gOMEGA - 147.4} | ||
| − | + | # Make the new phi dihedral = gPHI (nominally -57) | |
| − | + | rotateselected {atomno = nn} {atomno = @{nn+1}} @{gPHI - 8.7} | |
| − | |||
| − | |||
| − | |||
| − | + | # Make the old psi dihedral = gPSI (nominally -47) | |
| − | + | select atomno < @{pn+2} && atomno != @{pn+3} | |
| − | + | rotateselected {atomno=@{pn+1}} {atomno=@{pn+2}} @{gPSI + 33.4 + pb} | |
| − | + | } | |
| − | + | ||
| − | + | # Step new and previous N | |
| + | pn = nn | ||
| + | nn = gN | ||
| − | + | # Make the peptide bond | |
| − | + | connect | |
| − | + | } | |
| − | + | ||
| − | + | # Clean up | |
| − | + | connect ([UNK].CA) ([UNK].Xx and within(group, _1)) | |
| − | + | select all | |
| + | fix none | ||
| + | print format("%d atoms generated", gN) | ||
} | } | ||
| Line 395: | Line 339: | ||
# Get the sequence from the user | # Get the sequence from the user | ||
| − | + | gSeq = prompt("Enter AA sequence (1 char coded)", "")%9999%0 | |
| − | if ( | + | if (gSeq.count > 0) { |
| − | + | if (gSeq[2] == ':') { | |
| − | + | gCHAIN = gSeq[1] | |
| − | + | gSeq[1] = ' ' | |
| − | + | gSeq[2] = ' ' | |
| + | gSeq = gSeq%0 | ||
| + | } | ||
| + | print format ("Sequence=%s phi=%d psi=%d", gSeq, gPHI, gPSI) | ||
| + | print format ("chain=%s peptide angle=%d pro bump=%d", gCHAIN, gPEPTIDE_ANGLE, gPRO_BUMP) | ||
| + | genAlpha(gSeq) | ||
} | } | ||
</pre> | </pre> | ||
Revision as of 12:39, 23 October 2013
I use Jmol to study protein folding. Here is a script I wrote that accepts an amino acid sequence (1 letter encoding: "AAC...FYW" for example) and generates an alpha helix using the Model Kit:
# RIBOZOME - Jmol script by Ron Mignery with help from Dr. Angel Herráez
# v1.2 beta 10/23/2013
#
# New in v1.2 beta:
# No longer zaps existing atoms
# Now adds on to existing helix on subsequent runs
# Fixes proline cross-link bug with XXXXPXP
# Localizes variables and globalizes constants
#
# RIBOZOME takes a string message encoding an amino acid (aa) sequence
# and generates a corresponding alpha helix one aa at a time from the
# N terminus to the C terminus rotating the emerging helix as it goes.
#
# The message is a string entered by the user at a prompt.
# It may be typed in or pasted in and be of any length
# If the message is prepended with <C>: (where C is any single letter)
# then the chain is so labeled and separated from existing chains
# if different from the first chain.
#
# The IUPAC/IUBMB 1 letter code is used:
# A=ALAnine B=GLutam?X* C=CYSteine D=ASPartate E=GLUtamate
# F=PHEnylalanine G=GLYcine H=HIStidine I=IsoLEucine K=LYSine
# L=LEUcine M=METhionine N=ASparagiNe O=PYrroLysine*** P=PROline
# Q=GLutamiNe R=ARGinine S=SERine T=THReonine U=SElenoCysteine
# V=VALine W=TRyPtophan X=UNKnown Y=TYRosine Z=ASpar?X**
# *Either GLU or GLN: drawn as GLN with chi3 flipped
# **Either ASP or ASN: drawn as ASN with chi3 flipped
# ***Not supported: drawn as ALA
# The following constant values determine the pitch of the alpha helix
gPHI = -57 # Dihedral angle of N-CA bond (nominally -57)
gPSI = -47 # Dihedral angle of CA-C bond (nominally -47)
gOMEGA = 180 # Dihedral angle of the peptide bond (nominally 180)
gPEPTIDE_ANGLE = 110 # C-N-CA angle (nominally 110)
gPRO_BUMP = -10 # Psi angle change increment to N-3psi when N is Pro
gCHAIN = 'A' # The chain id
# Lookup 3 letter code from 1 letter code
g3from1 = {"A":"ALA", "B":"GLX","C":"CYS", "D":"ASP","E":"GLU", "F":"PHE",
"G":"GLY", "H":"HIS","I":"ILE", "K":"LYS","L":"LEU", "M":"MET",
"N":"GLN", "O":"PYL","P":"PRO", "Q":"GLN","R":"ARG", "S":"SER",
"T":"THR", "U":"SEC","V":"VAL", "W":"TRP","X":"UNK", "Y":"TYR", "Z":"ASX"}
# Generate PDB atom record
function genAtom(e, aa, i, xyz) {
gA = format("ATOM %5d %4s %3s ", gN, e, aa )
gA += format("%s%4d %8.3f", gCHAIN, i, xyz[1] )
gA += format("%8.3f%8.3f\n", xyz[2], xyz[3] )
gn++
return gA
};
# Generate a PDB amino acid record set
function genAA(i, aa) { # Writes globals gA and gN
# From constructed AAs
var N0 = [0.0, 0.0, 0.0]
var CA = [ 0.200, 1.174, 0.911 ]
var C = [ -1.110, 1.668, 1.425 ]
var O = [ -1.320, 1.693, 2.62 ]
var CB = [ 1.062, 2.1950, 0.230 ]
var G1 = [ 2.359, 1.607, -0.344]
var G2 = [ 1.363, 3.336, 1.157 ]
var D1 = [ 3.222, 2.656, -1.048 ]
var D2 = [ 3.143, 0.904, 0.725 ]
var E1 = [ 3.645, 3.749, -0.167 ]
var E2 = [ 2.491, 3.234, -2.249 ]
var Z = [ 4.470, 4.717, -0.885 ]
var H1 = [ 4.450, 6.006, -0.220 ]
var H2 = [5.833, 4.228, -0.984 ]
var Gp = [ 2.008, 1.24, -0.46 ]
var Dp = [1.022, 0.213, -1.031 ]
var Gfy = [ 2.368, 1.471, -0.0152 ]
var D1fy = [ 3.346, 1.524, 0.921 ]
var D2fy = [ 2.493, 0.516, -1.151 ]
var E1fy = [ 4.513, 0.615, 0.8244 ]
var E2fy = [ 3.528, -0.336, -1.206 ]
var Zfy = [ 4.588, -0.285, -0.168 ]
var Hfy = [ 5.738, -1.245, -0.233 ]
var Ghw = [ 2.406, 1.626, -0.134 ]
var D1hw = [3.498, 1.936, 0.675]
var D2hw = [ 2.713, 0.901, -1.211 ]
var E1hw = [ 4.160, 0.518, -1.178 ]
var E2hw = [ 4.622, 1.160, 0.0816 ]
var E3hw = [ 3.789, 2.523, 1.944 ]
var Z2hw = [ 5.973, 1.177, 0.689 ]
var Z3hw = [ 5.014, 2.550, 2.503 ]
var H2hw = [ 6.153, 1.846, 1.844 ]
#N1 = [ 2.069, -2.122, -0.554]
# Build PDB atom records common to all AAs
a3 = g3from1[aa]
if (a3 = "") {
a3 = "UNK"
}
print format("+ %s%d/%d", a3, i, gSeq.count + gResno)
gA = genAtom(" N ", a3, i, N0)
gA += genAtom(" CA ", a3, i, CA)
gA += genAtom(" C ", a3, i, C)
gA += genAtom(" O ", a3, i, O)
if ((aa != 'G') && (aa != 'X')) {
gA += genAtom(" CB ", a3, i, CB)
}
# Now add AA specific atom records
switch (aa) {
case 'A' :
break;
case 'B' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" CD ", a3, i, D1)
gA += genAtom(" OE1", a3, i, E2) # GLN with Es switched
gA += genAtom(" NE2", a3, i, E1)
break;
case 'C' :
gA += genAtom(" SG ", a3, i, G2)
break;
case 'D' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" OD1", a3, i, D1)
gA += genAtom(" OD2", a3, i, D2)
break;
case 'E' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" CD ", a3, i, D1)
gA += genAtom(" OE1", a3, i, E1)
gA += genAtom(" OE2", a3, i, E2)
break;
case 'F' :
gA += genAtom(" CG ", a3, i, Gfy)
gA += genAtom(" CD1", a3, i, D1fy)
gA += genAtom(" CD2", a3, i, D2fy)
gA += genAtom(" CE1", a3, i, E1fy)
gA += genAtom(" CE2", a3, i, E2fy)
gA += genAtom(" CZ ", a3, i, Zfy)
break;
case 'G' :
break;
case 'H' :
gA += genAtom(" CG ", a3, i, Ghw)
gA += genAtom(" ND1", a3, i, D1hw)
gA += genAtom(" CD2", a3, i, D2hw)
gA += genAtom(" CE1", a3, i, E2hw)
gA += genAtom(" NE2", a3, i, E1hw)
break;
case 'I' :
gA += genAtom(" CG1", a3, i, G1)
gA += genAtom(" CG2", a3, i, G2)
gA += genAtom(" CD1", a3, i, D1)
break;
case 'K' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" CD ", a3, i, D1)
gA += genAtom(" CE ", a3, i, E1)
gA += genAtom(" NZ ", a3, i, Z)
break;
case 'L' :
gA += genAtom(" CG1", a3, i, G1)
gA += genAtom(" CD1", a3, i, D1)
gA += genAtom(" CD2", a3, i, D2)
break;
case 'M' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" SD ", a3, i, D1)
gA += genAtom(" CE ", a3, i, E1)
break;
case 'N' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" OD1", a3, i, D1)
gA += genAtom(" ND2", a3, i, D2)
break;
case 'P' :
gA += genAtom(" CG ", a3, i, GP)
gA += genAtom(" CD ", a3, i, DP)
break;
case 'Q' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" CD ", a3, i, D1)
gA += genAtom(" OE1", a3, i, E1)
gA += genAtom(" NE2", a3, i, E2)
break;
case 'R' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" CD ", a3, i, D1)
gA += genAtom(" NE ", a3, i, E1)
gA += genAtom(" CZ ", a3, i, Z)
gA += genAtom(" NH1", a3, i, H1)
gA += genAtom(" NH2", a3, i, H2)
break;
case 'S' :
gA += genAtom(" OG ", a3, i, G1)
break;
case 'T' :
gA += genAtom(" OG1", a3, i, G1)
gA += genAtom(" CG2", a3, i, G2)
break;
case 'U' :
gA += genAtom("SeG ", a3, i, G1)
break;
case 'V' :
gA += genAtom(" CG1", a3, i, G1)
gA += genAtom(" CG2", a3, i, G2)
break;
case 'W' :
gA += genAtom(" CG ", a3, i, Ghw)
gA += genAtom(" CD1", a3, i, D1hw)
gA += genAtom(" CD2", a3, i, D2hw)
gA += genAtom(" CE2", a3, i, E2hw)
gA += genAtom(" NE1", a3, i, E1hw)
gA += genAtom(" CE3", a3, i, E3hw)
gA += genAtom(" CZ2", a3, i, Z2hw)
gA += genAtom(" CZ3", a3, i, Z3hw)
gA += genAtom(" CH2", a3, i, H2hw)
break;
case 'X' :
gA += genAtom(" Xx ", a3, i, CB)
break;
case 'Y' :
gA += genAtom(" CG ", a3, i, Gfy)
gA += genAtom(" CD1", a3, i, D1fy)
gA += genAtom(" CD2", a3, i, D2fy)
gA += genAtom(" CE1", a3, i, E1fy)
gA += genAtom(" CE2", a3, i, E2fy)
gA += genAtom(" CZ ", a3, i, Zfy)
gA += genAtom(" OH ", a3, i, Hfy)
break;
case 'Z' :
gA += genAtom(" CG ", a3, i, G1)
gA += genAtom(" OD1", a3, i, D2) # ASN with Ds switched
gA += genAtom(" ND2", a3, i, D1)
break;
default :
break;
}
return gA
};
# Generate an alpha helix
function genAlpha(gSeq) {
gN = all.count + 1 # global new N atom index
# Find last linkable N if any
gResno = 0 # global pre-existing AA count
var pn = 1 # previous gN
for (var i = all.count-1; i > 0; i--) {
# If found
if (distance({atomno=i}, {0,0,0}) < 0.1) {
pn = i
# If new chain, separate from existing chain
if ({atomno=i}.chain != gCHAIN) {
select all
translateselected {2.069, -2.122, -0.554 } #N1
}
else {
gResno = {atomno=i}.resno
}
break;
}
}
# For each aa
set appendnew false
var nn = gN # new N
for (var i = 1; i <= gSeq.count; i++) {
# Move polypeptide C to bond distance from new AA N
select all
fix none
translateselected {2.069, -2.122, -0.554 } #N1
# Gen AA
gA = "data \"append aa\"\n" # global PDB atom record
gA += genAA(i + gResno, gSeq[i]); # gN is updated in subroutine
gA += "end \"append aa\""
script inline @{gA}
# If PRO
var pb = 0
if ((gSeq.count - i) >= 2) {
if (gSeq[i + 2] == 'P') {
pb = gPRO_BUMP
}
}
# If not first AA
if (nn > 1) {
# Gen axis on new N perpendicular to the plane
# containing atoms nn, pn+2 and nn+1
var v1={atomno = @{pn+2}}.xyz - {atomno = nn}.xyz
var v2={atomno = @{nn+1}}.xyz - {atomno = nn}.xyz
var axis = cross(v1, v2)
# Center on atom previous C
axis += {atomno = @{pn+2}}.xyz
# Rotate the polypeptide N on the new AA C to tetrahedral (nominally 110)
select atomno < nn
fix atomno >= nn
rotateselected @axis {atomno = nn} @{gPEPTIDE_ANGLE - 69.3}
# Make omega dihedral = gOMEGA (nominally 180)
rotateselected {atomno=@{pn+2}} {atomno=nn} @{gOMEGA - 147.4}
# Make the new phi dihedral = gPHI (nominally -57)
rotateselected {atomno = nn} {atomno = @{nn+1}} @{gPHI - 8.7}
# Make the old psi dihedral = gPSI (nominally -47)
select atomno < @{pn+2} && atomno != @{pn+3}
rotateselected {atomno=@{pn+1}} {atomno=@{pn+2}} @{gPSI + 33.4 + pb}
}
# Step new and previous N
pn = nn
nn = gN
# Make the peptide bond
connect
}
# Clean up
connect ([UNK].CA) ([UNK].Xx and within(group, _1))
select all
fix none
print format("%d atoms generated", gN)
}
echo Generating Alpha Helix
# Get the sequence from the user
gSeq = prompt("Enter AA sequence (1 char coded)", "")%9999%0
if (gSeq.count > 0) {
if (gSeq[2] == ':') {
gCHAIN = gSeq[1]
gSeq[1] = ' '
gSeq[2] = ' '
gSeq = gSeq%0
}
print format ("Sequence=%s phi=%d psi=%d", gSeq, gPHI, gPSI)
print format ("chain=%s peptide angle=%d pro bump=%d", gCHAIN, gPEPTIDE_ANGLE, gPRO_BUMP)
genAlpha(gSeq)
}