Skip to content

Instantly share code, notes, and snippets.

@lindenb
Created April 22, 2011 20:29
Show Gist options
  • Save lindenb/937535 to your computer and use it in GitHub Desktop.
Save lindenb/937535 to your computer and use it in GitHub Desktop.
Translate a DNA to protein using HTML5+ File API.
<html>
<head>
</head>
<body>
<form>
<label for="ZmlsZXMKfiles">Select a FASTA file</label>:<input type="file" id="ZmlsZXMKfiles" multiple="true"/>
</form>
<script type="application/ecmascript">
var GENETIC_CODE="FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG";
function base2index(c)
{
switch(c)
{
case 'T':case 't': return 0;
case 'C':case 'c': return 1;
case 'A':case 'a': return 2;
case 'G':case 'g': return 3;
default: return -1;
}
}
function translate(dna)
{
var prot="";
for(var i=0;i+2 < dna.length;i+=3)
{
var base1= base2index(dna[i+0]);
var base2= base2index(dna[i+1]);
var base3= base2index(dna[i+2]);
if(base1==-1 || base2==-1 || base3==-1)
{
prot+='?';
}
else
{
prot+=GENETIC_CODE[base1*16+base2*4+base3];
}
}
return prot;
}
function readingFasta(evt)
{
if (!evt.lengthComputable) return;
var loaded = (evt.loaded / evt.total);
if (loaded > 1) return;
var pre=document.getElementById('ZmlsZXMKtext');
while(pre.hasChildNodes()) pre.removeChild( pre.firstChild );
pre.appendChild(document.createTextNode("Reading "+Math.round(loaded*100)+"%"));
}
function endReadFasta(e)
{
var pre=document.getElementById('ZmlsZXMKtext');
while(pre.hasChildNodes()) pre.removeChild( pre.firstChild );
var lines=e.target.result.split("\n");
var dna="";
var i=0;
var line;
for(;;)
{
if(i==lines.length || (line=lines[i].replace(/^\s+|\s+$/g,""))[0]=='>')
{
if(dna.length > 0)
{
var prot=translate(dna);
var j=0;
while(j < prot.length)
{
pre.appendChild(document.createTextNode(prot.substring(j,j+50)));
pre.appendChild(document.createElement("br"));
j+=50;
}
}
if(i===lines.length) break;
pre.appendChild(document.createTextNode(line));
pre.appendChild(document.createElement("br"));
dna="";
}
else
{
dna+=line;
}
++i;
}
}
function handleFileSelect(evt)
{
var files = evt.target.files; // FileList object
if(files.length!=1) return;
var reader = new FileReader();
reader.onprogress=readingFasta;
reader.onloadend=endReadFasta;
var pre=document.getElementById('ZmlsZXMKtext');
while(pre.hasChildNodes()) pre.removeChild( pre.firstChild );
pre.appendChild(document.createTextNode("Reading "+files[0].name+"..."));
reader.readAsText(files[0]);
}
document.getElementById('ZmlsZXMKfiles').addEventListener('change', handleFileSelect, false);
</script>
<pre id="ZmlsZXMKtext"></pre>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment