Genome browser for phamerator.org
forked from scresawn's block: genome browser
forked from AdamBlaine1's block: The genome browser
forked from AdamBlaine1's block: The genome browser
Genome browser for phamerator.org
forked from scresawn's block: genome browser
forked from AdamBlaine1's block: The genome browser
forked from AdamBlaine1's block: The genome browser
[{ | |
"phageName":"Happy", | |
"genomelength":7800, | |
"genes": | |
[{ | |
"name": 1, | |
"pham": 7, | |
"sequence": "ATGCTACGTAGCTACGTACGATCGTACGATCGATCGTACG", | |
"start": 50, | |
"stop": 2000, | |
"direction": "forward" | |
}, | |
{ | |
"name": 2, | |
"pham": 201, | |
"sequence": "GACTGACTGACTAGCTGACTGATCGTACTCGAT", | |
"start": 2150, | |
"stop": 2900, | |
"direction": "reverse" | |
}, | |
{ | |
"name": 3, | |
"pham": 90, | |
"sequence": "ATCGTACGTACGTACGTACGATCGTACGATCGCGCGCGCGGCGCATCGATCGATCGTACTA", | |
"start": 3000, | |
"stop": 4550, | |
"direction": "reverse" | |
}, | |
{ | |
"name": 4, | |
"pham": 3752, | |
"sequence": "TTCTAGTCGATCGTACGTGTACGTGCATTATTGATGCTATATATCGTATATACGTA", | |
"start": 4700, | |
"stop": 7550, | |
"direction": "forward" | |
} | |
]}, | |
{ | |
"phageName":"Happy", | |
"genomelength":7800, | |
"genes": | |
[{ | |
"name": 1, | |
"pham": 7, | |
"sequence": "ATGCTACGTAGCTACGTACGATCGTACGATCGATCGTACG", | |
"start": 50, | |
"stop": 2000, | |
"direction": "forward" | |
}, | |
{ | |
"name": 2, | |
"pham": 201, | |
"sequence": "GACTGACTGACTAGCTGACTGATCGTACTCGAT", | |
"start": 2150, | |
"stop": 2900, | |
"direction": "reverse" | |
}, | |
{ | |
"name": 3, | |
"pham": 90, | |
"sequence": "ATCGTACGTACGTACGTACGATCGTACGATCGCGCGCGCGGCGCATCGATCGATCGTACTA", | |
"start": 3000, | |
"stop": 4550, | |
"direction": "reverse" | |
}, | |
{ | |
"name": 4, | |
"pham": 3752, | |
"sequence": "TTCTAGTCGATCGTACGTGTACGTGCATTATTGATGCTATATATCGTATATACGTA", | |
"start": 4700, | |
"stop": 7550, | |
"direction": "forward" | |
} | |
]}, | |
] |
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700"> | |
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"> | |
<style> | |
body { | |
font: 20px sans-serif; | |
} | |
.axis path, | |
.axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.bar { | |
fill: orange; | |
} | |
.bar:hover { | |
fill: orangered ; | |
} | |
.x.axis path { | |
display: none; | |
} | |
.d3-tip { | |
line-height: 1; | |
font-weight: bold; | |
padding: 12px; | |
background: rgba(0, 0, 0, 0.8); | |
color: #fff; | |
border-radius: 2px; | |
} | |
/* Creates a small triangle extender for the tooltip */ | |
.d3-tip:after { | |
box-sizing: border-box; | |
display: inline; | |
font-size: 10px; | |
width: 100%; | |
line-height: 1; | |
color: rgba(0, 0, 0, 0.8); | |
content: "\25BC"; | |
position: absolute; | |
text-align: center; | |
} | |
/* Style northward tooltips differently */ | |
.d3-tip.n:after { | |
margin: -1px 0 0 0; | |
top: 100%; | |
left: 0; | |
} | |
</style> | |
</head> | |
<body> | |
<script src="http://labratrevenge.com/d3-tip/javascripts/d3.tip.v0.6.3.js"></script> | |
<script> | |
// Feel free to change or delete any of the code you see! | |
var svg = d3.select("body").append("svg").attr({height: 500,width: }) | |
d3.json("genes.json.txt", function(error, json) { | |
if (error) return console.warn(error); | |
var genomes = svg.selectAll(".genomes") | |
.data(json) | |
.enter() | |
.append("g"); | |
var ruler = genomes.selectAll("genes") | |
svg.append("rect") | |
.attr({x: 0, y: 100, width: genomelength/10, height: 30}) | |
.style({"stroke-width": "2px", "fill": "white", "stroke": "black"}) | |
.attr("stroke-opacity", 0) | |
.transition().duration(1000) | |
.attr("stroke-opacity", 1); | |
var genomelength = 7800; | |
var tickMarks = {thousand: [], fivehundred: [], onehundred: []}; | |
var genome_positions = []; | |
for (var i = 1; i <= genomelength; i++) { | |
genome_positions.push(i); | |
} | |
genome_positions.forEach(function(currentValue, index, myArray){ | |
if (currentValue % 1000 === 0) { | |
tickMarks.thousand.push(currentValue); | |
} | |
else if (currentValue % 500 === 0) { | |
tickMarks.fivehundred.push(currentValue); | |
} | |
else if (currentValue % 100 === 0) { | |
tickMarks.onehundred.push(currentValue); | |
} | |
}); | |
var tip = d3.tip() | |
.attr('class', 'd3-tip') | |
.offset([-10, 0]) | |
.html(function(d) { | |
return "<strong>Name:</strong> <span style='color:red'>" + d.name + "</span>"; | |
}) | |
svg.call(tip); | |
genes.append("rect") | |
.attr("y", function (d) { | |
if (d.direction == "forward") { | |
if (d.name % 2 === 0) { | |
return 70; | |
} | |
else { return 40;} | |
} | |
else if (d.direction == "reverse") { | |
if (d.name % 2 === 0) { | |
return 160; | |
} | |
else { return 130; } | |
} | |
}) | |
.attr("x", function (d) { | |
if (d.direction === "forward") { | |
return (0 - ((d.stop-d.start)/10)) - 2; | |
} | |
else if (d.direction === "reverse") { | |
return (genomelength/10) + 2; | |
} | |
}) | |
.attr("height", function (d) {return 30;}) | |
.on('mouseover', tip.show) | |
.on('mouseout', tip.hide) | |
.attr("width", function (d) { return (d.stop-d.start)/10; }) | |
.style({"stroke":"black", "stroke-width": "2px"}) | |
.attr("fill", function (d) { | |
if (d.direction == "forward") { | |
return "green"; | |
} | |
else if (d.direction == "reverse") { | |
return "red"; | |
} | |
else { | |
return "black"; | |
} | |
}) | |
.transition().delay(1000).duration(1500).attr("x", function (d) { return d.start/10; }); | |
genes.append("text") // gene name | |
.attr("x", function(d) { return ((d.start + d.stop)/2)/10;}) | |
.attr("y", function (d) { | |
if (d.direction == "forward") { | |
if (d.name % 2 === 0) { | |
return 90; | |
} | |
else { return 60;} | |
} | |
else if (d.direction == "reverse") { | |
if (d.name % 2 === 0) { | |
return 180; | |
} | |
else { return 150;} | |
} | |
}) | |
.style({"text-anchor": "middle", "fill": "black"}) | |
.attr("font-family", "sans-serif") | |
.text(function(d) {return d.name}) | |
.attr("fill-opacity", 0) | |
.transition().delay(2000).duration(1500) | |
.attr("fill-opacity", 1); | |
genes.append("text") // pham name | |
.attr("x", function(d) { | |
return ((d.start + d.stop)/2)/10; | |
}) | |
.attr("y", function (d) { | |
if (d.direction == "forward") { | |
if (d.name % 2 === 0) { | |
return 60; | |
} | |
else { return 30;} | |
} | |
else if (d.direction == "reverse") { | |
if (d.name % 2 === 0) { | |
return 210; | |
} | |
else { return 180;} | |
} | |
}) | |
.style({"text-anchor": "middle", "fill": "black"}) | |
.attr("font-family", "sans-serif") | |
.text(function(d) { | |
return d.pham | |
}) | |
.attr("fill-opacity", 0) | |
.transition().delay(3500).duration(1500) | |
.attr("fill-opacity", 1); | |
var group = svg.selectAll(".thousandticks") | |
.data(tickMarks.thousand) | |
.enter() | |
.append("g"); | |
group.append("rect") | |
.style({"fill": "black"}) | |
//.attr({x: 0, y: 100, width: "1px", height: 30}) | |
.attr({x: function (d) { return d/10; }, y: 100, width: "1px", height: 30}) | |
.attr({"fill-opacity": 0}) | |
.transition().duration(1500) | |
.attr({"fill-opacity": 1}); | |
//.attr("transform", function (d) { return "translate(" + d/10 + ",0)"; }); | |
group.append("text") //green letters in boxes | |
.attr("x", function(d) {return (d/10) + 3;}) | |
.attr("y", (90) + 22) | |
.attr("font-family", "sans-serif") | |
.attr("font-size", "14px") | |
.attr("fill", "green") | |
.style("text-anchor", "start") | |
.text(function(d) { return d/1000; }) | |
.attr({"fill-opacity": 0}) | |
.transition().duration(1500) | |
.attr({"fill-opacity": 1}); | |
var group2 = svg.selectAll(".fivehundredticks") | |
.data(tickMarks.fivehundred) | |
.enter() | |
.append("g"); | |
group2.append("rect") | |
.style({"fill": "black"}) | |
.attr({x: function(d) {return d/10;}, y: 100, width: "1px", height: 15}) | |
.attr({"fill-opacity": 0}) | |
.transition().duration(1500) | |
.attr({"fill-opacity": 1}); | |
//.attr("transform", function (d) { return "translate(" + d/10 + ",0)"; }); | |
var group3 = svg.selectAll(".onehundredticks") | |
.data(tickMarks.onehundred) | |
.enter() | |
.append("g"); | |
group3.append("rect") | |
.style({"fill": "black"}) | |
.attr({x: function (d) { return d/10; }, y: 115, width: "1px", height: 15}) | |
.attr("fill-opacity", 0) | |
.transition().duration(1500) | |
.attr("fill-opacity", 1); | |
}); | |
//.attr("transform", function (d) { return "translate(" + d/10 + ",0)"; }); | |
</script> | |
</body> |