Javascriptによって配列を解析するWebサイトの作成を行なったので、いつでもコピペで展開できるようにファイルを置いておきます。
目次
HTML
<!DOCTYPE html>
<html lang="en"></html>
<head>
<html lang="en">
<meta charset="UTF-8">
<title>Reverse comp</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>Sequence gen 1.0</h1>
<div class="nice-wrap">
<input class="nice-textbox" type="text" id="newText" placeholder="Input Seq Raw">
<button class="btn_1" id="changeButton">Generate</button>
<br>
<br><br>
<div class="result"> Reverse Complement</div>
<div class="target"></div>
<br><br>
<div class="result"> Transcribed</div>
<div class="target1"></div>
<br><br>
<div class="result"> GC rate</div>
<div class="target2"></div>
<br><br>
<div class="result"> Nucleotide counts</div>
<div class="target3"></div>
<br><br>
<div class="result"> Translation</div>
<div class="target4"></div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
CSS
* {
box-sizing: border-box;
}
html, body {
display: flex;
align-items: center;
justify-content: center;
position: relative;
height: auto;
width: auto;
background-color: #1a0026;
/* background: linear-gradient(-20deg, #8d027f 0%, #052968 100%); */
font-family: "Arial", sans-serif;
}
.container h1 {
color: #fff;
text-transform: uppercase;
text-align: center;
font-size: 50px;
padding-bottom: 10%;
}
.nice-wrap {
position: relative;
width: 500px;
height: 100px;
margin: 0 auto;
}
.nice-label {
position: absolute;
top: 15px;
left: 10px;
font-size: 16px;
color: #a0a0a0;
transition: all 0.25s ease;
}
.nice-label.focus {
top: -25px;
left: 5px;
font-size: 14px;
color: #fff;
}
.nice-textbox {
position: relative;
display: block;
width: 500px;
margin-top: 5px;
padding: 15px;
border: none;
border-radius: 5px;
font-size: 16px;
color: #a0a0a0;
outline: none;
}
.target {
border: 2px solid rgb(254, 254, 254);
padding: 10px;
border-radius: 10px; /* 角の丸みを指定 */
color: #fff;
overflow: auto;
}
.target1 {
border: 2px solid rgb(254, 254, 254);
padding: 10px;
border-radius: 10px; /* 角の丸みを指定 */
color: #fff;
overflow: auto;
}
.target2 {
border: 2px solid rgb(254, 254, 254);
padding: 10px;
border-radius: 10px; /* 角の丸みを指定 */
color: #fff;
overflow: auto;
}
.target3 {
border: 2px solid rgb(254, 254, 254);
padding: 10px;
border-radius: 10px; /* 角の丸みを指定 */
color: #fff;
overflow: auto;
}
.target4 {
border: 2px solid rgb(254, 254, 254);
padding: 10px;
border-radius: 10px; /* 角の丸みを指定 */
color: #fff;
overflow: auto;
}
.result{
color: #fff;
}
/* CSS */
.btn_1 {
background-image: linear-gradient(#f7f8fa ,#e7e9ec);
border-color: #adb1b8 #a2a6ac #8d9096;
border-style: solid;
border-width: 1px;
border-radius: 3px;
box-shadow: rgba(255,255,255,.6) 0 1px 0 inset;
box-sizing: border-box;
color: #0f1111;
cursor: pointer;
display: inline-block;
font-family: "Amazon Ember",Arial,sans-serif;
font-size: 14px;
height: 29px;
font-size: 13px;
outline: 0;
overflow: hidden;
padding: 0 11px;
text-align: center;
text-decoration: none;
text-overflow: ellipsis;
user-select: none;
-webkit-user-select: none;
touch-action: manipulation;
white-space: nowrap;
}
.btn_1:active {
border-bottom-color: #a2a6ac;
}
.btn_1:active:hover {
border-bottom-color: #a2a6ac;
}
.btn_1:hover {
border-color: #a2a6ac #979aa1 #82858a;
}
.btn_1:focus {
border-color: #e77600;
box-shadow: rgba(228, 121, 17, .5) 0 0 3px 2px;
outline: 0;
}
/*
.textbox-001-label,
.textbox-001 {
color: #333;
}
.textbox-001-label {
display: block;
margin-bottom: 5px;
font-size: .9em;
}
.textbox-001 {
width: 100%;
padding: 8px 10px;
border: 1px solid #969da3;
border-radius: 3px;
font-size: 1em;
line-height: 1.5;
}
.textbox-001::placeholder {
color: #999;
} */
JavaScript
function reverse_complement(seq){
let dst = "";
const map = new Map();
var n = "";
map.set('A','T');
map.set('T','A');
map.set('C','G');
map.set('G','C');
for (let i = seq.length-1;i>-1;i--){
n = map.get(seq[i]);
if (n != undefined){
dst += n;
}
}
return dst;
};
function sanitize(seq){
let dst = "";
const map = new Map();
var n = "";
map.set('A','T');
map.set('T','A');
map.set('C','G');
map.set('G','C');
for (let i = 0;i<seq.length;i++){
n = map.get(seq[i]);
if (n != undefined){
dst += n;
}
}
return dst;
}
function transcribe(seq){
let dst = "";
const map = new Map();
var n = "";
map.set('A','U');
map.set('T','A');
map.set('C','G');
map.set('G','C');
for (let i = 0;i<seq.length;i++){
n = map.get(seq[i]);
if (n != undefined){
dst += n;
}
}
return dst;
}
function calc_GCrate(seq){
let gccount= 0;
const map = new Map();
map.set('A','U');
map.set('T','A');
map.set('C','G');
map.set('G','C');
let valid_length = 0;
for (let i = 0;i<seq.length;i++){
n = map.get(seq[i]);
if (n != undefined){
valid_length++;
if (n == "G" || n == "C"){
gccount ++;
}
}
}
return gccount/valid_length*100 + "%";
}
function count_nuc(seq){
const map = new Map();
map.set('A',0);
map.set('T',0);
map.set('C',0);
map.set('G',0);
var n = "";
var validnum = 0;
for (let i = 0;i<seq.length;i++){
n = map.get(seq[i]);
if (n != undefined){
map.set(seq[i],n+1);
validnum ++;
}
}
return "[A: " + map.get("A") + ", C: " + map.get("C") + ", G: " + map.get("G") + ", T: " + map.get("T") + "] Total: " + validnum;
}
function translate(s){
let seq = sanitize(s)
const DNA_Codons = {
"GCT": "A", "GCC": "A", "GCA": "A", "GCG": "A",
"TGT": "C", "TGC": "C",
"GAT": "D", "GAC": "D",
"GAA": "E", "GAG": "E",
"TTT": "F", "TTC": "F",
"GGT": "G", "GGC": "G", "GGA": "G", "GGG": "G",
"CAT": "H", "CAC": "H",
"ATA": "I", "ATT": "I", "ATC": "I",
"AAA": "K", "AAG": "K",
"TTA": "L", "TTG": "L", "CTT": "L", "CTC": "L", "CTA": "L", "CTG": "L",
"ATG": "M",
"AAT": "N", "AAC": "N",
"CCT": "P", "CCC": "P", "CCA": "P", "CCG": "P",
"CAA": "Q", "CAG": "Q",
"CGT": "R", "CGC": "R", "CGA": "R", "CGG": "R", "AGA": "R", "AGG": "R",
"TCT": "S", "TCC": "S", "TCA": "S", "TCG": "S", "AGT": "S", "AGC": "S",
"ACT": "T", "ACC": "T", "ACA": "T", "ACG": "T",
"GTT": "V", "GTC": "V", "GTA": "V", "GTG": "V",
"TGG": "W",
"TAT": "Y", "TAC": "Y",
"TAA": "_", "TAG": "_", "TGA": "_"
}
const numCodons = (seq.length - seq.length%3)/3;
let protein = "";
for (let i = 0;i < numCodons;i ++){
protein += DNA_Codons[seq[3*i] + seq[3*i+1] + seq[3*i+2]]
}
return protein;
}
const changeButton = document.getElementById("changeButton");
const targetElement = document.querySelector(".target");
const targetElement1 = document.querySelector(".target1");
const targetElement2 = document.querySelector(".target2");
const targetElement3 = document.querySelector(".target3");
const targetElement4 = document.querySelector(".target4");
changeButton.addEventListener("click", function() {
const seq = document.getElementById("newText").value;
targetElement.textContent = reverse_complement(seq);
targetElement1.textContent = transcribe(seq);
targetElement2.textContent = calc_GCrate(seq);
targetElement3.textContent = count_nuc(seq);
targetElement4.textContent = translate(seq);
});

