User:Michael S. Serfas/Sandbox: Difference between revisions
m (...) |
(Might be references to this second sequence fouling this up... though I may be letting the camel's nose into the tent...) |
||
(One intermediate revision by the same user not shown) | |||
Line 235: | Line 235: | ||
<p>Some alternative genetic code options are listed below.</em></p> | <p>Some alternative genetic code options are listed below.</em></p> | ||
<p><button class="outputbutton" id="test" name="translate" onclick=" | <p><button class="outputbutton" id="test" name="translate" onclick="lastfunction.innerHTML='translate'; var seq = new ntsequence('branchseqdata'); seq.translate();">Translate</button> frame <input type="radio" name="frame" value="1" id="frame1" checked="checked" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">1 </input><input type="radio" name="frame" value="2" id="frame2" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">2 </input> | ||
<input type="radio" name="frame" value="3" id="frame3" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">3 </input> <input type="checkbox" name="SeC" id="SeC" value="OFF" onclick="mitoW.checked = false;">UGA = Selenocysteine (U)</input> <input type="checkbox" name="PyL" id="PyL" value="OFF">UAG = Pyrrolysine (O)</input></p> | <input type="radio" name="frame" value="3" id="frame3" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">3 </input> <input type="checkbox" name="SeC" id="SeC" value="OFF" onclick="mitoW.checked = false;">UGA = Selenocysteine (U)</input> <input type="checkbox" name="PyL" id="PyL" value="OFF">UAG = Pyrrolysine (O)</input></p> | ||
<p><a href="http://link.springer.com/article/10.1007%2FBF01936921">Mitochondrial codes:</a> <input type="checkbox" name="mitoW" id="mitoW" value="OFF" onclick="SeC.checked = false;">UGA = W</input> <input type="checkbox" name="mitoM" id="mitoM" value="OFF">AUA = M</input> <input type="checkbox" name="mitoS" id="mitoS" value="OFF" onclick="mitoX.checked = false;">AGR = S</input> <input type="checkbox" name="mitoX" id="mitoX" value="OFF" onclick="mitoS.checked = false;">AGR = *</input> <input type="checkbox" name="mitoN" id="mitoN" value="OFF">AAA = N</input> <input type="checkbox" name="mitoT" id="mitoT" value="OFF">CUN = T</input> <input type="checkbox" name="mitoY" id="mitoY" value="OFF">UAA = Y</input> </p> | <p><a href="http://link.springer.com/article/10.1007%2FBF01936921">Mitochondrial codes:</a> <input type="checkbox" name="mitoW" id="mitoW" value="OFF" onclick="SeC.checked = false;">UGA = W</input> <input type="checkbox" name="mitoM" id="mitoM" value="OFF">AUA = M</input> <input type="checkbox" name="mitoS" id="mitoS" value="OFF" onclick="mitoX.checked = false;">AGR = S</input> <input type="checkbox" name="mitoX" id="mitoX" value="OFF" onclick="mitoS.checked = false;">AGR = *</input> <input type="checkbox" name="mitoN" id="mitoN" value="OFF">AAA = N</input> <input type="checkbox" name="mitoT" id="mitoT" value="OFF">CUN = T</input> <input type="checkbox" name="mitoY" id="mitoY" value="OFF">UAA = Y</input> </p> | ||
<p><em>Second sequence for dot plots - treated as the ancestral/consensus sequence:</em></p> | |||
<p><button onclick='setvalue("rootseqdata", getvalue("branchseqdata", ""))'>Copy first sequence</button> </p><p><div name="rootseqdata-fasta" id="rootseqdata-fasta"></div><p><textarea type="text" name="rootseqdata" class="sequence" cols="100%" rows="20" id="rootseqdata" spellcheck="false" onblur="var seq2 = new ntsequence('rootseqdata'); seq.cleanup()"></textarea></p> | |||
</body> | </body> | ||
</html> | </html> |
Latest revision as of 17:12, 24 July 2013
<html> <script> //<![CDATA[
function ntsequence(id) {
/* Class prototype for sequence elements made from (presently) "branchseqdata" and "rootseqdata" textarea values */
this.id = id;
this.set = function(data) { this.elem.value = data || ""; }
this.elem = document.getElementById(id);
this.scramble = function() { /* Create a scrambled-nucleotide control for various measurements */ var pull, newarray = [], seqarray = this.elem.value.split(""); while (seqarray[1]) { pull = seqarray.splice(Math.floor(seqarray.length * Math.random()), 1); newarray.push(pull); } newarray.push(seqarray[0]); this.elem.value = newarray.join(''); seqarray = null; newarray = null; }
this.reverse = function() { var seqarray = this.elem.value.split(""); seqarray = seqarray.reverse(); this.elem.value = seqarray.join(''); seqarray = null; }
this.complement = function() { // Nucleotide code opposites // (meant to improve this structure...) var complement = {a: "T", c: "G", g: "C", t: "A", u: "A", r: "Y", y: "R", k: "M", m: "K", b: "V", v: "B", d: "H", h: "D", w: "W", s: "S"}, this.toDNA(); //temporarily cast as DNA for consistent handling this.elem.value = this.elem.value.toLowerCase(); //this function uses uppercase to denote already replaced nts this.elem.value = this.elem.value.replace(/a/g, "T"); this.elem.value = this.elem.value.replace(/t/g, "A"); this.elem.value = this.elem.value.replace(/c/g, "G"); this.elem.value = this.elem.value.replace(/g/g, "C"); this.elem.value = this.elem.value.replace(/y/g, "R"); this.elem.value = this.elem.value.replace(/r/g, "Y"); this.elem.value = this.elem.value.replace(/k/g, "M"); this.elem.value = this.elem.value.replace(/m/g, "K"); this.elem.value = this.elem.value.replace(/b/g, "V"); this.elem.value = this.elem.value.replace(/v/g, "B"); this.elem.value = this.elem.value.replace(/d/g, "H"); this.elem.value = this.elem.value.replace(/h/g, "D"); this.elem.value = this.elem.value.toLowerCase(); //back to lowercase rnadna(); //recover original RNA/DNA status for all sequences from the checkbox }
this.cleanup = function() { var fasta = document.getElementById(this.id + "-fasta"); fasta.innerHTML = this.elem.value.match(/>.*\n/) || ""; this.elem.value = this.elem.value.replace(/>.*\n/, ""); this.elem.value = this.elem.value.toLowerCase(); //all one case for these things this.elem.value = this.elem.value.replace(/x/g, "n"); // occasionally x's used to be encountered for N's, though this may not happen nowadays this.elem.value = this.elem.value.replace(/[^acgtunrykmbdhvws\.\-]/g, ""); //remove non-genome letters. Both t,u allowed here rnadna(); //restoring proper RNA/DNA status for all sequences as part of every cleanup (many bugs start from t/u mixups!) }
this.toDNA = function() { this.elem.value = this.elem.value.replace(/u/g, "t"); }
this.toRNA = function() { this.elem.value = this.elem.value.replace(/t/g, "u"); }
this.translate = function() { // The degenerate nucleotide codes decomposed to arrays var outarray = ['<div id="translateoutput">'], seqarray, c, x1, x2, x3, aareturn, aareturnhash, aareturnarr, codon, i, elem, b1, b2, b3, nt, output = document.getElementById("output"), SeC = document.getElementById("SeC"), PyL = document.getElementById("PyL"), degen = setdegen(), altcode = {SeC: ["uga", "U"], PyL: ["uag", "O"], mitoW: ["uga", "W"], mitoM: ["aua", "M"], mitoS: ["agr", "S"], mitoX: ["agr", "*"], mitoN: ["aaa", "N"], mitoT: ["cun", "T"], mitoY: ["uaa", "Y"]}, tcodon = {uuu: "F", uuc: "F", uug: "L", uua: "L", cuu: "L", cua: "L", cuc: "L", cug: "L", auu: "I", auc: "I", aua: "I", aug: "M", guu: "V", guc: "V", gua: "V", gug: "V", ucu: "S", ucc: "S", uca: "S", ucg: "S", ccu: "P", ccc: "P", cca: "P", ccg: "P", acu: "T", acc: "T", aca: "T", acg: "T", gcu: "A", gcc: "A", gca: "A", gcg: "A", uau: "Y", uac: "Y", uaa: "*", uag: "*", cau: "H", cac: "H", caa: "Q", cag: "Q", aau: "N", aac: "N", aaa: "K", aag: "K", gau: "D", gac: "D", gaa: "E", gag: "E", ugu: "C", ugc: "C", uga: "*", ugg: "W", cgu: "R", cgc: "R", cga: "R", cgg: "R", agu: "S", agc: "S", aga: "R", agg: "R", ggu: "G", ggc: "G", gga: "G", ggg: "G"}; output.innerHTML = ""; //retake the memory of what may be a very bulky output from dotplot, etc. for (i in altcode) { elem = document.getElementById(i); if (elem) { if (elem.checked) { for (j in degen[altcode[i][0].slice(2,3)]) { tcodon[altcode[i][0].slice(0,2)+degen[altcode[i][0].slice(2,3)][j]] = altcode[i][1]; } } } } this.cleanup(); rnadna("RNA"); //all the rules here are written to translate RNA, and the checkbox is updated // not needed to auto-reference sequence, output id's by getElementById? seqarray = this.elem.value.split(""); seqarray = seqarray.reverse(); // .pop will pull out the first nucleotide c = this.elem.value.length / 3; if (!(frame3.checked || frame2.checked)) { frame1.checked = true; } if (frame3.checked) { seqarray.pop(); seqarray.pop(); c = c - 2 / 3; } else { if (frame2.checked) { seqarray.pop(); c = c - 1 / 3; } } if (c > 0) { do { c -= 1; aareturnhash = {}; aareturnarr = []; nt = []; for (i = 1; i < 4; i++) { nt.push(seqarray.pop()); } if (tcodon[nt.join("")]) { outarray.push(tcodon[nt.join("")]); } else { b1 = degen[nt[0]]; b2 = degen[nt[1]]; b3 = degen[nt[2]]; if (b3) { for (x1 = 0; b1[x1]; x1++) { for (x2 = 0; b2[x2]; x2++) { for (x3 = 0; b3[x3]; x3++) { codon = b1[x1] + b2[x2] + b3[x3]; aareturn = tcodon[codon.toLowerCase()]; if (!aareturnhash[aareturn]) { aareturnhash[aareturn] = true; aareturnarr.push(aareturn); } } } } } tcodon[nt.join("")] = "[" + aareturnarr.join("") + "]"; if (aareturnarr[1]) { outarray.push("["); } outarray.push(aareturnarr.join("") || ""); if (aareturnarr[1]) { outarray.push("]"); } } } while (c > 0); } outarray.push('</div><button onclick="newtranslateproteinwindow(output.innerHTML);">New window with this protein</button>'); output.innerHTML = outarray.join(""); outarray = null; rnadna(); //restore proper RNA/DNA status display per user preference window.setTimeout(saveargs, 0); // extra fork of a process to display all the args as a URL }
}
function rnadna(force) {
// this isn't very efficient nor object oriented, but to help limit bugs EVERY sequence is set to RNA/DNA according to the checkbox EVERY time it is read var seq = new ntsequence("branchseqdata"), seq2 = new ntsequence("rootseqdata"), DNA = document.getElementById("DNA"), RNA = document.getElementById("RNA"); if (force === "RNA") { RNA.checked = true; }
if (force === "DNA") { DNA.checked = true; }
if (DNA.checked) { seq.toDNA(); seq2.toDNA(); } if (RNA.checked) { seq.toRNA(); seq2.toRNA(); }
}
function importbranchseq() {
var myserver = document.getElementById("branchseqserver").value, gi = document.getElementById("branchseqgi").value, yyy = document.createElement("script"); yyy.id = "jsonp" yyy.type = "text/javascript"; yyy.onload = function(){document.getElementsByTagName("head")[0].removeChild(yyy)}; yyy.src = (myserver + "ncbi_to_jsonp/?db=nuccore&rettype=fasta&id="+gi); document.getElementsByTagName("head")[0].appendChild(yyy)
}
function callback(dict,seqname) {
var seq = new ntsequence(seqname || "branchseqdata"); seq.set(dict.data); seq.cleanup();
} //]]> </script> </head> <body>
<p><div name="branchseqdata-fasta" id="branchseqdata-fasta"></div></p>
<p><textarea type="text" name="branchseqdata" class="sequence" cols="100%" rows="20" id="branchseqdata" autofocus spellcheck="false" onblur="var seq = new ntsequence('branchseqdata'); seq.cleanup();"></textarea></p>
<p>Sequence type: <input type="radio" name="seqtype" value="DNA" id="DNA" checked="checked" onclick="rnadna('DNA');">DNA <input type="radio" name="seqtype" value="RNA" id="RNA" onclick="rnadna('RNA');">RNA <button id="button" name="reverse complement" onclick="var seq = new ntsequence('branchseqdata'); seq.cleanup; seq.reverse(); seq.complement();">Reverse complement</button><button id="button" name="scramble" onclick="var seq = new ntsequence('branchseqdata'); seq.cleanup(); seq.scramble();">Scramble this sequence</button></p> <p><button onclick="importbranchseq();">Import</button> the above sequence: gi <input type="text" id="branchseqgi" size="15" value=""></input> from <a href="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi">EFetch</a> (requires a very simple JSONP server at <input type="text" size="30" value="http://msserfas.appspot.com/" id="branchseqserver"></input> </div><div name="ss" style="display:none;" id="ss-1seq"> <h3>Translation settings</h3>
<p><em>This function accepts degenerate nucleotide codes. Positions which may contain one of several amino acids list all possibilities in brackets.</p>
<p>Some alternative genetic code options are listed below.</em></p>
<p><button class="outputbutton" id="test" name="translate" onclick="lastfunction.innerHTML='translate'; var seq = new ntsequence('branchseqdata'); seq.translate();">Translate</button> frame <input type="radio" name="frame" value="1" id="frame1" checked="checked" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">1 </input><input type="radio" name="frame" value="2" id="frame2" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">2 </input> <input type="radio" name="frame" value="3" id="frame3" onclick="var seq = new ntsequence('branchseqdata'); seq.translate();">3 </input> <input type="checkbox" name="SeC" id="SeC" value="OFF" onclick="mitoW.checked = false;">UGA = Selenocysteine (U)</input> <input type="checkbox" name="PyL" id="PyL" value="OFF">UAG = Pyrrolysine (O)</input></p>
<p><a href="http://link.springer.com/article/10.1007%2FBF01936921">Mitochondrial codes:</a> <input type="checkbox" name="mitoW" id="mitoW" value="OFF" onclick="SeC.checked = false;">UGA = W</input> <input type="checkbox" name="mitoM" id="mitoM" value="OFF">AUA = M</input> <input type="checkbox" name="mitoS" id="mitoS" value="OFF" onclick="mitoX.checked = false;">AGR = S</input> <input type="checkbox" name="mitoX" id="mitoX" value="OFF" onclick="mitoS.checked = false;">AGR = *</input> <input type="checkbox" name="mitoN" id="mitoN" value="OFF">AAA = N</input> <input type="checkbox" name="mitoT" id="mitoT" value="OFF">CUN = T</input> <input type="checkbox" name="mitoY" id="mitoY" value="OFF">UAA = Y</input> </p>
<p><em>Second sequence for dot plots - treated as the ancestral/consensus sequence:</em></p>
<p><button onclick='setvalue("rootseqdata", getvalue("branchseqdata", ""))'>Copy first sequence</button> </p><p><div name="rootseqdata-fasta" id="rootseqdata-fasta"></div><p><textarea type="text" name="rootseqdata" class="sequence" cols="100%" rows="20" id="rootseqdata" spellcheck="false" onblur="var seq2 = new ntsequence('rootseqdata'); seq.cleanup()"></textarea></p>
</body> </html>