Genome browser for phamerator.org
forked from scresawn's block: genome browser
forked from dunlapea's block: genome browser
forked from anonymous's block: genome browser
forked from dunlapea's block: genome browser
forked from dunlapea's block: genome browser
xxxxxxxxxx
<head>
<meta charset="utf-8">
<style>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.x.axis path {
display: none;
}
.line {
fill: none;
stroke: steelblue;
stroke-width: 1.5px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqplot/1.0.8/jquery.jqplot.min.js"></script>
<script type="text/javascript">
function genome(sequence){
var i=1;
var geneBlockArray=[];
var twoGene=sequence[0];
this.getGeneBlocks= function(){
do{
var gene = sequence.charAt(i);
twoGene+=gene;
if(twoGene.indexOf('C')>-1 || twoGene.indexOf('G')>-1){
if(twoGene.indexOf('C')>-1 && twoGene.indexOf('G')>-1){
geneBlockArray.push(100);
}
else if(twoGene=='CC' || twoGene=='GG'){
geneBlockArray.push(100);
}
else{
geneBlockArray.push(50);
}
}
else{
geneBlockArray.push(0);
}
twoGene=gene;
i++;
}while(i<sequence.length);
return geneBlockArray;
}
}
</script>
<link rel="stylesheet" type="text/css" href="jquery.jqplot.min.css" />
<script src="https://d3js.org/d3.v3.min.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic">
</head>
<body>
<div id="option">
<input name="updateButton"
type="button"
value="Color by G/C content"
onclick="updateData()" />
</div>
<section id='chartArea'>
<div id='chart1' class='chart'>
</div>
<div id='chart2' class='chart'>
</div>
<div id='chart3' class='chart'>
</div>
</section>
<script type="text/javascript">
$(document).ready(function(){
var url='genes.json.txt';
d3.json(url,function(error, json){console.log(json)
var i=1;
$.each(json,function(x,y){
var g=[];
$.each(y.genes, function(k, gene){
x= new genome(gene.sequence);
f=x.getGeneBlocks();
g = g.concat(f);
})
plotChart('chart'+i, g);
i++;
});
});
});
</script>
<script type="text/javascript">
function plotChart(chart,x){
var plot1 = $.jqplot (chart, [x], {
grid:{
background:'#FFFFFF',
},
seriesDefaults: {
rendererOptions: {
smooth: true
}
},
axes: {
xaxis: {
min:0,
max:180,
tickOptions: {
showGridline: false,
showMark: false,
fontFamily: 'DosisBold',
textColor: '#ffffff',
fontSize: 'larger',
shadow: false
},
},
yaxis: {
tickOptions: {
showGridline: false,
showMark: true,
showLabel: true,
shadow: false,
},
},
},
});
};
</script>
<script>
var svg1 = d3.selectAll("#chartArea").attr('height','1000');
d3.json("genes.json.txt", function(error, json) {
if (error) return console.warn(error);
// console.log(json);
svg1.attr("class", 'genechart');
// Define the div for the tooltip
var div = d3.select("body").append("div")
.attr("class", "tooltip")
.style("opacity", 0);
var phage = svg1.selectAll("genechart")
.data(json)
.enter().append('svg').attr("width", function (d) {
return d3.max(json, function(d) {
return d.genomelength/10;
})
})
.attr('height','500')
.append("g");
phage.attr("transform", function(d, i) { return "translate(0," + (100 + (i*225)) + ")"; });
phage.append("rect") // background for ruler
.attr({x: 0, y: 0, width: function(d) { return d.genomelength/10; }, height: 30})
.style({"stroke-width": "2px", "fill": "white", "stroke": "black"})
.attr("stroke-opacity", 0)
.transition().duration(1000)
.attr("stroke-opacity", 1);
var group = phage.selectAll(".thousandticks")
.data(function (d) {
ticks = [];
genome_positions = d3.range(d.genomelength);
genome_positions.forEach(function (currentValue, index, myArray) {
if (currentValue % 1000 === 0) {
ticks.push(currentValue);
}
});
return ticks;
}
)
.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: 0, 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") // kbp label
.attr("x", function(d) {return (d/10) + 3;})
.attr("y", 12)
.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 = phage.selectAll(".fivehundredticks")
.data(function (d) {
ticks = [];
genome_positions = d3.range(d.genomelength);
genome_positions.forEach(function (currentValue, index, myArray) {
if (currentValue % 500 === 0 & currentValue % 1000 !== 0) {
ticks.push(currentValue);
}
})
return ticks;
})
.enter()
.append("g");
group2.append("rect")
.style({"fill": "black"})
.attr({x: function(d) {return d/10;}, y: 0, 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 = phage.selectAll(".onehundredticks")
.data(function (d) {
ticks = [];
genome_positions = d3.range(d.genomelength);
genome_positions.forEach(function (currentValue, index, myArray) {
if (currentValue % 100 === 0 & currentValue % 1000 !== 0 & currentValue % 500 !== 0) {
ticks.push(currentValue);
}
})
return ticks;
})
.enter()
.append("g");
group3.append("rect")
.style({"fill": "black"})
.attr({x: function (d) { return d/10; }, y: 15, width: "1px", height: 15})
.attr("fill-opacity", 0)
.transition().duration(1500)
.attr("fill-opacity", 1);
gene = phage.selectAll(".genes")
.data(function(d, i) { //console.log(i, d);
return d.genes;})
.enter()
.append("g");
gene.append("rect")
.attr("y", function (d) {
if (d.direction == "forward") {
if (d.name % 2 === 0) {
return -70;
}
else { return -30;}
}
else if (d.direction == "reverse") {
if (d.name % 2 === 0) {
return 30;
}
else { return 60;}
}
})
.attr("x", function (d) {
if (d.direction === "forward") {
return (0 - ((d.stop-d.start)/10)) - 2;
}
else if (d.direction === "reverse") {
w = d3.select("svg").style("width");
return w;
}
})
.attr("height", function (d) {return 30;})
.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";
}
})
.on("mouseover", function(d) {
// console.log(d);
div.transition()
.duration(500)
.style("opacity", .9);
div .html("The direction of gene " + d.name + " is " + d.direction)// the text of the tooltip ...
.style("left", (d3.event.pageX) + "px")
.style("top", (d3.event.pageY - 28) + "px");
})
.on("mouseout", function(d) {
div.transition()
.duration(500)
.style("opacity", 0);
})
.transition().delay(1000).duration(1500)
.attr("x", function (d) { return d.start/10; });
gene.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) { // forward and even
return -50;
}
else { return -10;} // forward and odd
}
else if (d.direction == "reverse") {
if (d.name % 2 === 0) { // reverse and even
return 50;
}
else { return 80;} //reverse and odd
}
})
.style({"text-anchor": "middle", "fill": "black"})
.attr("font-family", "sans-serif")
.text(function(d){
var C=0;
var G=0;
for(var i=0; i<=d.sequence.length;i++){
if(d.sequence[i]==="C")
{C++;}
else if (d.sequence[i]==="G")
{G++;}
}
var total=C+G;
var toPercent = d3.format("%");
var grandtotal = toPercent(total / d.sequence.length)
{ return (grandtotal) }
}
)
.attr("fill-opacity", 0)
.transition().delay(2000).duration(1500)
.attr("fill-opacity", 1);
gene.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 -80;
}
else { return -40;}
}
else if (d.direction == "reverse") {
if (d.name % 2 === 0) {
return 80;
}
else { return 110;}
}
})
.style({"text-anchor": "middle", "fill": "blue"})
.attr("font-family", "sans-serif")
.text(function(d) {return d.pham})
.attr("fill-opacity", 0)
.transition().delay(3500).duration(1500)
.attr("fill-opacity", 1);
updatex();
});
</script>
<script>
function updatex(){ x=$('svg')[0];
y=$('svg')[1];
z=$('svg')[2];
$('#chart1').append(x);
$('#chart2').append(y); $('#chart3').append(z);
$('#chart1 svg').css({position:'absolute',top:'280px'});
$('#chart2').css({width: '770', top:'220'});
$('#chart2 svg').css({position:'absolute',top:'150px'});
$('#chart2').css('top',220);
$('#chart3 svg').css({position:'absolute',top:'-100px',height:1500});
$('#chart3').css('top',550);
}
</script>
</body>
Updated missing url https://cdnjs.cloudflare.com/ajax/libs/jqPlot/1.0.8/jquery.jqplot.min.js to https://cdnjs.cloudflare.com/ajax/libs/jqplot/1.0.8/jquery.jqplot.min.js
Modified http://d3js.org/d3.v3.min.js to a secure url
https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
https://cdnjs.cloudflare.com/ajax/libs/jqPlot/1.0.8/jquery.jqplot.min.js
https://d3js.org/d3.v3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js