User:Remig/plico/fold trna
Fold_trna predicts the tertiary structure of any tRNA from its sequence provided the tRNA has the universal elements of functional tRNAs: (proceeding 5' to 3') a 7 base-pair stem, 3 upaired nts, a 4 base-pair D stem, a 7, 8 or 9 base D loop, 1 unpaired nt, a 5 base-pair acceptor stem, a 7 base acceptor loop, 5 unpaired NTs or else a variable stem loop of any size, a TUCG stem of 5 base-pairs, a UCG loop of 7 bases, no NTs before the acceptor stem, and a final unpaired N or NCCA.
This script prompts for a tRNA sequence string (5' to 3', ACGUs only, with or without 3'CCA). The Genomic tRNA Database at http://lowelab.ucsc.edu/GtRNAdb/ is an excellent source for such strings.
It then loads a corresponding template tRNA from the PDB, replaces the template nucleotides with the input string nucleotide, minimizes to fix any resulting collisions, and, if needed, creates and inserts a variable loop.
The process takes a few minutes: the yellow progress message in the upper left will go pink for the duration.
The template used depends on the D loop size as follows:
7: 1yfg 8: 3l0u 9:1ffy
Variable loop positioning is templated on the PDB entry 1ser.
The end model is double-bonded to prevent minimization errors. Use the Convert macro to remove them if desired.
Fold_trna 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 Fold tRNA Script=script <path to your scripts directory>/fold_trna.spt;plico_fold_trna
saved as plicoFoldTrna.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 fold_trna.spt:
# fold_trna - Jmol script by Ron Mignery
# v1.3 beta 4/12/2016 -axis is now a reserved word
#
# fold_trna predicts the tertiary structure of any tRNA from its sequence
# provided the tRNA has the universal elements of functional tRNAs:
# (proceeding 5' to 3') a 7 base-pair stem, 3 upaired nts, a 4 base-pair
# D stem, a 7, 8 or 9 base D loop, 1 unpaired nt, a 5 base-pair
# acceptor stem, a 7 base acceptor loop, 5 unpaired NTs or else a variable
# stem loop of any size, a TUCG stem of 5 base-pairs, a TUCG loop of 7
# bases, no NTs before the acceptor stem, and a final unpaired N or NCCA.
# Not all base pairs need be canonical.
#
# This script prompts for a tRNA sequence string
# (5' to 3', ACGUs only, with or without 3'CCA).
# The Genomic tRNA Database at http://lowelab.ucsc.edu/GtRNAdb/
# is an excellent source for such strings.
#
# It then loads a corresponding template tRNA from the PDB, replaces the template
# nucleotides with the input string nucleotide, minimizes to fix any
# resulting collisions, and, if needed, creates and inserts a variable loop.
#
# The process takes a few minutes: the yellow progress message in the upper
# left will go pink for the duration.
#
# The template used depends on the D loop size as follows:
# 7: 1yfg 8: 3l0u 9:1ffy
#
# Variable loop positioning is templated on 1ser.
#
# The end model is double-bonded to prevent minimization errors.
# Use the Convert macro to remove them if desired.
#
# fold_rna uses the PLICO scripts plicoCommon.spt, plicoNTcommon.spt,
# polymeraze.spt, remapNT.spt, and convert_residue.spt which must be
# available in the same directory from which fold_rna.spt is loaded.
# TOP LEVEL FUNCTION - Find and fold all loops
function plico_fold_trna(iChain) {
gMenuMin = false
bind "LEFT-CLICK" "+:plico_menu_toggle";
# 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
}
}
if (kNTcommon < 6) {
script $SCRIPT_PATH$plicoNTcommon.spt
if (kNTcommon < 6) {
prompt ("A newer version of plicoNTcommon.SPT is required")
quit
}
}
if (iChain == "") {
iChain = gChain1
}
align_trna()
}
function align_trna() {
if (kPolymeraze < 1) {
script $SCRIPT_PATH$polymeraze.spt
echo dl polymeraze.spt
if (kPolymeraze < 1) {
prompt ("The Plico script polymeraze.spt (1.14+) is required")
quit
}
}
if (kRemapNT < 2) {
script $SCRIPT_PATH$remapNT.spt
echo dl remapNT.spt
if (kRemapNT < 2) {
prompt ("The Plico script remapNT.spt (1.14+) is required")
quit
}
}
if (kConvert < 1) {
script $SCRIPT_PATH$convert_residue.spt
echo dl convert_residue.spt
if (kConvert < 1) {
prompt ("The Plico script convert_residue.spt (1.4+) is required")
quit
}
}
# Prompt for new
var nseq = prompt("Enter new tRNA NT sequence (ACGTU...)", "")%9999%0
try {
# If new is trna
if (nseq.size > 67) {
nseq = nseq.replace("T", "U")
# Remove 3' CCA if present
if (nseq[nseq.size-2][nseq.size] == "CCA") {
if (eval_pairing( nseq, 1, nseq.size-4, 3) > 6) {
nseq = nseq[1][nseq.size-3]
}
}
# Calc D loop size
var dn = 7
var ds = eval_pairing(nseq, 10, 24, 4)
if (eval_pairing(nseq, 10, 25, 4) > ds) {
ds = eval_pairing(nseq, 10, 25, 4)
dn = 8
}
if (eval_pairing(nseq, 10, 26, 4) > ds) {
dn = 9
}
var tpdb = ""
set echo TOP LEFT
background ECHO pink
switch (dn) {
case 7: # 1yfg
tpdb = "1yfg"
gEcho = "aligning tRNA... Loading " + tpdb
echo @gEcho
load "=1yfg"
delete 74-76
delete {connected(connected(atomName="C12"))} #T6A
#convert_nt(16, "A", "U")
#convert_nt(47, "A", "U")
break
case 8: # 3l0u
tpdb = "3l0u"
gEcho = "aligning tRNA... Loading " + tpdb
echo @gEcho
load "=3l0u"
break
case 9: # 1ffy
tpdb = "1ffy"
gEcho = "aligning tRNA... Loading " + tpdb
echo @gEcho
load "=1ffy"
delete not :T
delete 74
break
default :
throw "D loop not 7-9 bases"
}
refresh
delete ligands
delete hoh
delete {atomName="CM?"}
delete not connected
set echo TOP LEFT
gEcho = "aligning tRNA... Remapping " + tpdb
echo @gEcho
gChain1 = "A"
remap_nt( 1, true, 1)
{atomName="O"}.atomName="OP1" # 1yfg?
center
var a = {all}.atomno.min
var iChain = {atomno=a}.chain
var rmin = get_resno_min(iChain)
var rmax = get_resno_max(iChain)
var pn5 = 1
var pn3 = nseq.size
# Convert from 5' and 3' until meet
set echo TOP LEFT
gEcho = "aligning tRNA... Converting " + tpdb
echo @gEcho
for (var i = 0; i < (37+dn); i++) {
var ac1 = get_atom_rcn(rmin+i, iChain, "C1\'")
if (ac1.group != nseq[pn5+i]) {
convert_nt(rmin+i, iChain, nseq[pn5+i])
}
}
for (var i = 0; i < 28; i++) {
var ac1 = get_atom_rcn(rmax-i, iChain, "C1\'")
if (ac1.group != nseq[pn3-i]) {
convert_nt(rmax-i, iChain, nseq[pn3-i])
}
}
set echo TOP LEFT
gEcho = "aligning tRNA... Renumbering atoms"
echo @gEcho
update_atomnos(iChain)
# Double bond the bases and add Hs to keep minimizations kosher
set echo TOP LEFT
gEcho = "aligning tRNA... Double-bonding"
echo @gEcho
double_bond_planars(iChain, false)
# Position at origin
select all
var ac1 = get_atom_rcn(rmin, iChain, "C1\'")
var ac2 = get_atom_rcn(rmin, iChain, "C2\'")
var ac3 = get_atom_rcn(rmin, iChain, "C3\'")
translateSelected @{-ac1.xyz}
var caxis = cross({1 0 0}, ac2.xyz)
var curangle = angle({1 0 0}, {0 0 0}, ac2.xyz)
rotateSelected @caxis {0 0 0} @{curangle}
caxis = cross({0 -1 0}, ac3.xyz)
curangle = angle({0 -1 0}, {0 0 0}, ac3.xyz)
rotateSelected @caxis {0 0 0} @{curangle}
translateSelected {-4 0 0}
center {0 0 0}
# Fix new collisions
set echo TOP LEFT
/*for (var i = 1; i < get_resno_max(iChain); i++) {*/
gEcho = "aligning tRNA... Minimizing collisions NT" + i
echo @gEcho
#minimize_for_collision(i, iChain)
/*}*/
fix_p_res_range(1, get_resno_max(iChain), iChain, true)
# If more on new
var rr = pn3-pn5-(rmax-rmin)+1
if (rr > 1) {
# Renumber 3' fragment += rr
delete {resno=@{38+dn}}
var aP = get_atom_rcn(39+dn, iChain, "P")
set echo TOP LEFT
gEcho = "aligning tRNA... Remapping from NT" + (39+dn)
echo @gEcho
remap_nt(aP.atomIndex, true, 38+dn+rr)
# Make var loop base
make_var_loop_base( 37+dn, iChain)
fix_all_nt_collisions(iChain)
if (is_form_a(38+dn+rr, iChain) == false) {
to_ab_nt_res(38+dn+rr, -1, iChain, true)
}
pair_it_res( 38+dn+rr, 37+dn, -1, iChain, iChain)
var aO3 = get_atom_rcn(38+dn+rr, iChain, "O3\'")
aP = get_atom_rcn(39+dn+rr, iChain, "P")
var aRot = get_atom_rcn(37+dn, iChain, "P")
fix_p_res(39+dn+rr, iChain, true)
select {(resno=@{38+dn+rr}) or (resno=@{37+dn})}
for (var i = 0; i < 2; i++) {
pivot_to_close_atoms( aO3, aP, aRot, 1.74)
fix_p_res(39+dn+rr, iChain, true)
}
fix_all_nt_collisions(iChain)
# Gen variable loop
gen_variable_loop(nSeq, rr, dn, iChain) # CALL
}
# Fix new collisions
fix_all_nt_collisions(iChain)
/*
set echo TOP LEFT
for (var i = 1; i < get_resno_max(iChain); i++) {
gEcho = "aligning tRNA... Minimizing collisions NT" + i
echo @gEcho
#minimize_for_collision(i, iChain)
}
for (var i = 1; i < get_resno_max(iChain); i++) {
gEcho = "aligning tRNA... Repairing backbone NT" + i
echo @gEcho
#fix_p_res(i, iChain, true)
}
*/
select all
color jmol
set echo TOP LEFT
background ECHO yellow
gEcho = "tRNA aligned..."
echo @gEcho
}
else {
throw "string is too short (<68)"
}
}
catch(e) {
set echo TOP LEFT
gEcho = format("Unable to process... %s", thrown_value)
echo @gEcho
}
}
function gen_variable_loop(nSeq, rr, dn, iChain) {
var seq = "RS" + (nSeq[38+dn][37+dn+rr])
gAppendNew = appendNew
set appendNew false
# Gen the loop at the origin
for (var i = 0; i < rr; i++) {
# Add and stack 5' res
set echo TOP LEFT
gEcho = "aligning tRNA... Adding " + nSeq[38+dn+i] + (38+dn+i)
echo @gEcho
gA = "data \"append nt\"\n"
gA += gen_nt(38+dn+i, nSeq[38+dn+i], true, false); # CALL
gA += "end \"append nt\""
script inline @{gA}
refresh
to_ab_nt_res(38+dn+i, -1, iChain, true)
base_stack_res(38+dn+i, 37+dn+i, iChain, iChain, 4.8, 23.7, true)
connect_res_nt( 37+dn+i, 38+dn+i, iChain, false)
fix_p_res(37+dn+i, iChain, true)
fix_p_res(38+dn+i, iChain, true)
} # endfor +rr res
# Pair up the loop
set echo TOP LEFT
gEcho = "aligning tRNA... Form variable stem-loop"
echo @gEcho
for (var i = 0; i < rr\2; i++) {
pair_it_res(37+dn+rr-i, 38+dn+i, -1, iChain, iChain)
}
# Make a tetra loop
# If PYR
if ((nSeq[36+dn+(rr/2)] = "U") or (nSeq[36+dn+(rr/2)] = "C")) {
#echo make uncg fold
make_uncg_loop(36+dn+(rr/2), 37+dn, iChain)
}
# else
else {
#echo make gnra fold
make_gnra_loop(36+dn+(rr/2), 37+dn, iChain)
}
for (var i = 0; i < rr\2; i++) {
if (eval_pairing( nseq, 38+dn+i, 37+dn+rr-1, 1) > 0) {
pair_it_res(38+dn+i, 37+dn+rr-i, -1, iChain, iChain)
}
else {
break
}
}
fix_p_res_range(37+dn, 36+dn+rr, iChain, true)
for (var i = 0; i < 5; i++) {
minimize_for_collision(35+dn+(rr\2)+i, iChain)
}
# Connect loop
connect_res_nt( 37+dn, 38+dn, iChain, false)
connect_res_nt( 37+dn+rr, 38+dn+rr, iChain, false)
appendNew = gAppendNew
}
function make_var_loop_base( r5, iChain) {
var vs = [5.35, 108.6, 97.7, 95.5, -54.2, 24.2, -38.9, -8.4]
position_nt_by_vs(r5-1, r5-2, r5, vs, iChain, iChain)
vs = [10.36, 61.7, 72.5, 64.7, -40.8, 62.4, -8.4, -19.3]
position_nt_by_vs(r5, r5-1, r5+1, vs, iChain, iChain)
fix_p_res(r5, iChain, true)
fix_p_res(r5+1, iChain, true)
}
# end fold_trna.spt