mysql_select_db($database);
$logic = "where full_name like '";
-for($i = 0; $i + 1 < sizeof($genes); $i ++) { // note that the last parameter of $genes is an empty array
+for($i = 0; $i < sizeof($genes); $i ++) { // note that the last parameter of $genes is an empty array
$toAdd = $genes[$i] . "'";
- if($i + 2 < sizeof($genes)) {
+ if($i + 1 < sizeof($genes)) {
$toAdd = $toAdd . " or full_name like '";
}
$logic = $logic . $toAdd;
}
-echo "<br> logic: " . $logic . "<br>";
$query="select id from gene_product " . $logic . " order by id";
$results=mysql_query($query);
$geneProductIDs[$i] = $row[0];
$i++;
}
-
$logic = "where gene_product_id=";
-for($i = 0; $i + 1 < sizeof($geneProductIDs); $i++) {
+for($i = 0; $i < sizeof($geneProductIDs); $i++) {
$toAdd = $geneProductIDs[$i];
- if($i + 2 < sizeof($geneProductIDs)) {
+ if($i + 1 < sizeof($geneProductIDs)) {
$toAdd = $toAdd . " or gene_product_id=";
}
$logic = $logic . $toAdd;
}
$logic = "where id='";
-for($i = 0; $i + 1 < sizeof($termIDs); $i++) {
+for($i = 0; $i < sizeof($termIDs); $i++) {
$toAdd = $termIDs[$i] . "'";
- if($i + 2 < sizeof($termIDs)) {
+ if($i + 1 < sizeof($termIDs)) {
$toAdd = $toAdd . " or id='";
}
$logic = $logic . $toAdd;
$i++;
}
+
+$cellData;
+//TODO this part needs the most optimization. It's really bad.
+//theoretically this should return a two-dimensional array of booleans, representing whether or not each gene is referenced to each term
+for($i = 0; $i < sizeof($genes); $i++) {
+ $query="select id from gene_product where full_name='" . $genes[$i] . "'";
+ $results=mysql_query($query);
+ $row = mysql_fetch_row($results);
+ $productID = $row[0];
+
+ $query="select term_id from association where gene_product_id='" . $productID . "'";
+ $results=mysql_query($query);
+
+ $k = 0;
+ $geneTerms;
+ for($row = mysql_fetch_row($results); $row != null; $row = mysql_fetch_row($results)) {
+ $geneTerms[$k] = $row[0];
+ $k++;
+ }
+ for($j=0;$j<sizeof($termIDs);$j++) {
+ $cellData[$i][$j] = 0;
+ }
+ for($j = 0; $j < sizeof($geneTerms);$j++) {
+ for($m = 0; $m<sizeof($termIDs);$m++) {
+ if($geneTerms[$j]==$termIDs[$m]) {
+ $cellData[$i][$m] = 1;
+ }
+ }
+ }
+}
+
+$finalCellData;
+for ($i = 0; $i < sizeof($cellData); $i ++)
+ {
+ $finalCellData[$i] = implode(",", $cellData[$i]);
+ }
+
+
+
+
+
?>
<div id="canvasDiv" style="overflow: hidden; float: left; height: 500px; width: 1100px;">
</canvas> </div>
<div id="scrollDiv" style="overflow: auto; float: left; height: 515px; width: 15px;" onscroll="drawMap();">
-<canvas id="nothing" width="1" height="<?php echo 250 + sizeof($allClusterIDs)*25 ?>"> </canvas>
+<canvas id="nothing" width="1" height="<?php echo 250 + sizeof($genes)*25 ?>"> </canvas>
</div>
<script type="text/javascript">
+
+var rawCellData = "<?php echo implode(";",$finalCellData); ?>";
+var rareCellData = rawCellData.split(";");
+var cellData = new Array(rareCellData.length);
+for(var i=0; i<rareCellData.length; i++) {
+ cellData[i] = rareCellData[i].split(",");
+ }
+
var rawGenes = "<?php echo $_POST['param'] ?>";
var genes = rawGenes.split(",");
var geneCount = genes.length;
var startTerm = 0;
var topOffset = 210;
-var leftOffset = 50;
+var leftOffset = 85;
-var cellSize = 10;
+var cellSize = 15;
var maxRows = Math.floor((500-topOffset)/cellSize);
var maxCols = Math.floor((1000-leftOffset)/cellSize);
+var borderWidth = 1;
+
function drawTerms(startTerm) {
//black for text
ontMap.translate(topOffset,0);
ontMap.rotate(90*Math.PI/180);
}
+
+function drawGenes(startGene) {
+ ontMap.fillStyle = "#000000";
+ for(var c=startGene; (c<geneCount) && (c<=startGene + maxRows); c++) {
+ ontMap.fillText(genes[c],5,(c-startGene)*cellSize + topOffset + cellSize/2);
+ }
+}
+drawGenes(0);
drawTerms(0);
+function drawMap(init) {
+ scrolledLeft = document.getElementById("scrollDiv").scrollLeft;
+ scrolledTop = document.getElementById("scrollDiv").scrollTop;
+ if(scrolledLeft > termCount*cellSize - maxCols*cellSize) {
+ scrolledLeft = termCount*cellSize - maxCols*cellSize;
+ } //TODO examine this ^
+ if(scrolledLeft < 0) {
+ scrolledLeft = 0;
+ }
+ if(scrolledTop < 0) {
+ scrolledTop = 0;
+ }
+
+ if((init || Math.floor(scrolledLeft/cellSize) != drawnCols || Math.floor(scrolledTop/cellSize) != drawnRows)) {
+ drawnCols = Math.floor(scrolledLeft/cellSize);
+ drawnRows = Math.floor(scrolledTop/cellSize);
+
+ ontMap.fillStyle = "#FFFFFF";
+ ontMap.fillRect(0,0,1100,500);
+ startXCell = Math.floor(scrolledLeft/cellSize);
+ startYCell = Math.floor(scrolledTop/cellSize);
+
+ for(var c=startXCell; (c<cellData.length) && ((c-startYCell)<maxRows); c++) {
+ for(var s=startXCell; (s<termCount) && ((s-startXCell)<maxCols); s++) {
+ var redcolor = "00";
+ var bluecolor = "00";
+ var greencolor = "00";
+ if(cellData[c][s] == 0) {
+ redcolor = "FF";
+ greencolor = "FF";
+ bluecolor = "FF";
+ }
+ else {
+ var redfrequency = Math.floor((s / termCount) * 255);
+ redcolor = redfrequency.toString(16);
+ var bluefrequency = 255 - redfrequency;
+ bluecolor = bluefrequency.toString(16);
+ var greenfrequency = redfrequency;
+ greencolor = greenfrequency.toString(16);
+ }
+ if(redcolor.length < 2) {
+ redcolor = "0" + redcolor;
+ }
+ if(bluecolor.length < 2) {
+ bluecolor = "0" + bluecolor;
+ }
+ if(greencolor.length < 2) {
+ greencolor = "0" + greencolor;
+ }
+ var xCoord = leftOffset+(s-startXCell+.5)*cellSize;
+ var yCoord = topOffset+(c-startYCell)*cellSize;
+ alert(startYCell);
+ ontMap.fillStyle= "#" + redcolor + greencolor + bluecolor;
+ ontMap.fillRect(xCoord, yCoord, cellSize, cellSize);
+ ontMap.fillStyle= "#FFFFFF";
+ ontMap.strokeRect(xCoord-borderWidth/2, yCoord-borderWidth/2,cellSize,cellSize);
+ }
+ }
+ drawTerms(startXCell);
+ drawGenes(startYCell);
+ }
+}
+
+drawMap(true);
+
</script>
</body>
-</html>
+</html>
+<!--
+Time out problem
+General Optimization
+Color
+Scrolling
+-->