diff --git a/VQI_GenomeBrowser.js b/VQI_GenomeBrowser.js index 840aea6..ddc3f4c 100755 --- a/VQI_GenomeBrowser.js +++ b/VQI_GenomeBrowser.js @@ -26,6 +26,10 @@ function VQI_GenomeBrowser(id) { var isready = false; var zoomOnly = false; + var trackInfo = []; + trackInfo[0] = {name: "HG19", type: "bed", fileHandle: "upload1436481988"}; + trackInfo[1] = {name: "Tile2 Content Snp", type: "bed", fileHandle: "upload1436411775"}; + // $("#" + id).append("
CPG:Shore:Shelve:
"); // d3.select("#" + id).append("div").text("Chromosome: ") @@ -471,6 +475,7 @@ function VQI_GenomeBrowser(id) { }; var updateTrack = function(){ + if (isready){ //console.log(trackList); @@ -487,25 +492,35 @@ function VQI_GenomeBrowser(id) { var chrom = "chr1"; $.ajax({ - url: 'http://localhost/dynamic_loading.php', + url: 'dynamic_loading.php', type: 'POST', dataType: "json", data: { - "getHG19Data": "", - "fileHandle": fileHandle, + "getTrackData": "", + "fileHandles": [trackInfo[0].fileHandle,trackInfo[1].fileHandle], + "name": [trackInfo[0].name,trackInfo[1].name], "chrom": chrom, "start": start, "end": end } }).success(function (returnData) { - + console.log(returnData); var i = getTrackIndexByName("HG19"); - trackList[i] = returnData; + trackList[i] = returnData[0][0]; trackList[i]['name'] = "HG19"; - trackList['type'] = "bed"; + trackList[i]['type'] = "bed"; + //console.log(trackList); + addBEDTrack(returnData[0][0], "HG19",returnData[0][1]); + + var i = getTrackIndexByName("Tile2 Content Snp"); + trackList[i] = returnData[1]; + trackList[i]['name'] = "Tile2 Content Snp"; + trackList[i]['type'] = "bed"; //console.log(trackList); - addBEDTrack(returnData, "HG19"); + addBEDTrack(returnData[1], "Tile2 Content Snp"); + //console.log(trackList); + zoomOnly = true; zoomed(); zoomOnly = false; @@ -909,7 +924,7 @@ function VQI_GenomeBrowser(id) { }); } - var addBEDTrack = function (data, name) { + var addBEDTrack = function (data, name, exons) { testdata = data; //console.log(data); /** @@ -990,59 +1005,44 @@ function VQI_GenomeBrowser(id) { .attr("class", "scalable")*/ - // if (data[0].length >= indexArray.exonEnds) - // { - // var exons = []; - // $.each(data, function (index, value) { - - // var exonStarts = value[indexArray.exonStarts].slice(1, value[indexArray.exonStarts].length - 2).split(","); - // var exonEnds = value[indexArray.exonEnds].slice(1, value[indexArray.exonEnds].length - 2).split(","); - - // for (var i = 0; i < exonStarts.length; i++) - // { - // var exon = []; - // exon[indexArray.chr] = value[indexArray.chr]; - // exon[indexArray.name] = value[indexArray.name] + " Exon " + (i + 1) + "/" + exonStarts.length; - // exon[indexArray.start] = parseInt(exonStarts[i]); - // exon[indexArray.end] = parseInt(exonEnds[i]); - // exons.push(exon); - // } - // }); - - // //console.log(exons[1]); - - // trackScalableGroup.selectAll("rect") - // .data(data, function (d) { - // return d; - // }) - // .exit() - // .remove(); - - // trackScalableGroup.selectAll("rect") - // .data(exons, function (d) { - // return d; - // }) - // .enter() - // .append("rect"); - // trackScalableGroup.selectAll("rect") - // .data(exons, function (d) { - // return d; - // }) - // .attr("x", function (d) { - // return fullXScale(d[indexArray.start]); - // }) - // .attr("y", -10) - // .attr("height", 20) - // .attr("width", function (d) { - // return fullXScale(d[indexArray.end]) - fullXScale(d[indexArray.start]); - // }) - // .style("fill-opacity", ".8") - // .style("stroke", "black") - // .style("fill", "black") - // .style("vector-effect", "non-scaling-stroke") - // .attr("class", "scalable") - - // } + if (exons) + { + + + //console.log(exons[1]); + + trackScalableGroup.selectAll("rect") + .data(data, function (d) { + return d; + }) + .exit() + .remove(); + + trackScalableGroup.selectAll("rect") + .data(exons, function (d) { + return d; + }) + .enter() + .append("rect"); + trackScalableGroup.selectAll("rect") + .data(exons, function (d) { + return d; + }) + .attr("x", function (d) { + return fullXScale(d[0]); + }) + .attr("y", -10) + .attr("height", 20) + .attr("width", function (d) { + return fullXScale(d[1]) - fullXScale(d[0]); + }) + .style("fill-opacity", ".8") + .style("stroke", "black") + .style("fill", "black") + .style("vector-effect", "non-scaling-stroke") + .attr("class", "scalable") + + } // //addHeightTrack(thisData, name); @@ -1185,22 +1185,27 @@ function VQI_GenomeBrowser(id) { // var xScale = d3.scale.linear() // .domain([-3953, 249241810]) // .range([0,1000]); - var fileHandle = "upload1435711655"; + var fileHandle = "upload1436411775"; var chrom = "chr1"; - + $.ajax({ - url: 'http://localhost/dynamic_loading.php', + url: 'dynamic_loading.php', type: 'POST', dataType: "json", data: { - "getStartEndHG19Data": "", - "fileHandle": fileHandle, + "getStartEndTrackData": "", + "fileHandles": [trackInfo[0].fileHandle,trackInfo[1].fileHandle], + "name": [trackInfo[0].name, trackInfo[1].name], "chrom": chrom } }).success(function (returnData) { - thisObj.addTrack(returnData, "HG19", "BED"); + //console.log(returnData); + thisObj.addTrack(returnData[0], "HG19", "bed"); + thisObj.addTrack(returnData[1], "Tile2 Content Snp", "bed"); + isready = true; + updateTrack(); }).error(function (req, status, error) { $("body").append(status + ": " + error); }); @@ -1215,14 +1220,12 @@ function VQI_GenomeBrowser(id) { data.unshift(["chrom", "chrom_start", "chrom_end", "name", "score", "strand"]) } data = addOneTrack(data, name, type); - //console.log("haha"); trackList.push(data); reorderTracks(); updateAllTracksSelectBoxes(); - isready = true; - updateTrack(); + } this.addTrackFile = function (dataFile, name, type, header) { diff --git a/dynamic_loading.php b/dynamic_loading.php index 0da5969..a9acc6e 100644 --- a/dynamic_loading.php +++ b/dynamic_loading.php @@ -41,12 +41,12 @@ $result = getData($_POST["getCurrentData"], $currentRow, 17); ajaxReturn($result); } - else if (isset($_POST["getHG19Data"])){ - $result = getHG19Data($_POST["fileHandle"], $_POST["chrom"], $_POST["start"], $_POST["end"]); + else if (isset($_POST["getTrackData"])){ + $result = getTrackData($_POST["fileHandles"], $_POST["name"], $_POST["chrom"], $_POST["start"], $_POST["end"]); ajaxReturn($result); } - else if (isset($_POST["getStartEndHG19Data"])){ - $result = getStartEndHG19Data($_POST["fileHandle"], $_POST["chrom"]); + else if (isset($_POST["getStartEndTrackData"])){ + $result = getStartEndTrackData($_POST["fileHandles"], $_POST["name"], $_POST["chrom"]); ajaxReturn($result); } else { @@ -143,25 +143,102 @@ //echo json_encode($resArray); } - function getHG19Data($fileHandle,$chrom,$start,$end){ + function mergeExonsArray($exons, $scale){ + $resArray = []; + $mergedExon = $exons[0]; + for ($i=1; $i < count($exons); $i++) { + if ($exons[$i][0] - $mergedExon[1] > 1/$scale){ + array_push($resArray, $mergedExon); + $mergedExon[0] = $exons[$i][0]; + $mergedExon[1] = $exons[$i][1]; + } + else{ + if ($exons[$i][1] > $mergedExon[1]){ + $mergedExon[1] = $exons[$i][1]; + + } + } + } + $LastElement = end($resArray); + reset($resArray); + if ($mergedExon[1] != $LastElement[1] || count($resArray) == 0){ + array_push($resArray, $mergedExon); + + } + return $resArray; + } + + function mergeExons($geneStart, $geneEnd, $Exstart, $Exend, $start,$end, $scale){ + $ExStartArray = explode(",",substr($Exstart,0,-1)); + $ExEndArray = explode(",",substr($Exend,0,-1)); + + if ($geneEnd-$geneStart < 1/$scale){ + + return [[$ExStartArray[0],max($ExEndArray)]]; + } + else{ + $resArray = []; + if(count($ExStartArray) > 1){ + $mergedExon = [$ExStartArray[0],$ExEndArray[0]]; + for ($i=1; $i < count($ExStartArray); $i++) { + if ($ExStartArray[$i] - $ExEndArray[$i-1] > 1/$scale){ + array_push($resArray, $mergedExon); + $mergedExon[0] = $ExStartArray[$i]; + $mergedExon[1] = $ExEndArray[$i]; + } + else{ + if ($ExEndArray[$i] > $ExEndArray[$i-1]){ + $mergedExon[1] = $ExEndArray[$i]; + + } + } + } + $LastElement = end($resArray); + reset($resArray); + if ($mergedExon[1] != $LastElement[1]){ + array_push($resArray, $mergedExon); + + } + + } + else{ + array_push($resArray, [$ExStartArray[0],$ExEndArray[0]]); + + } + return $resArray; + } + } + + function getHG19TrackData($fileHandle,$chrom,$start,$end){ + $db_name = $GLOBALS['db_name']; $link = $GLOBALS['DBlink']; $resArray = []; + $exonArray = []; $scale = 1000/($end - $start); - $sql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle}"; - $sql .= " WHERE `CHROM` = '".$chrom."'"; - $sql .= " AND (((`CHROM_START` BETWEEN $start AND $end) OR (`CHROM_END` BETWEEN $start AND $end))"; - $sql .= " OR (`CHROM_START` <= $start AND `CHROM_END` >= $end))"; - $sql .= " ORDER BY `CHROM_START` * 1 ASC"; + $sql = "SELECT `chrom`, `txStart`, `txEnd`, `name2`, `score`, `exonStarts`, `exonEnds` FROM {$db_name}.{$fileHandle}"; + $sql .= " WHERE `chrom` = '".$chrom."'"; + $sql .= " AND (((`txStart` BETWEEN $start AND $end) OR (`txEnd` BETWEEN $start AND $end))"; + $sql .= " OR (`txStart` <= $start AND `txEnd` >= $end))"; + $sql .= " ORDER BY `txStart` * 1 ASC"; $res = mysqli_query ($link,$sql); $mergedRect = []; $firstRow = mysqli_fetch_row($res); + + $exons = mergeExons($firstRow[1],$firstRow[2],$firstRow[5], $firstRow[6], $start,$end, $scale); + //print_r($exons); + + foreach ($exons as $key => $value) { + array_push($exonArray, $value); + } + $mergedRect = [$chrom,$firstRow[1],$firstRow[2],"",""]; + $noMergedRect = false; while($row = mysqli_fetch_row($res)){ $tempStartPix = ($row[1] - $start) * $scale; @@ -170,15 +247,39 @@ $mergedRectStartPix = ($mergedRect[1] - $start) * $scale; $mergedRectEndtPix = ($mergedRect[2] - $start) * $scale; + $exons = mergeExons($row[1],$row[2],$row[5], $row[6], $start,$end, $scale); + foreach ($exons as $key => $value) { + array_push($exonArray, $value); + } + if ($noMergedRect){ + + $mergedRect = [$chrom,$row[1],$row[2],"",$row[4]]; + $noMergedRect = false; + continue; + } + //print_r($row); + if (is_numeric($row[4])){ + array_push($resArray, $mergedRect); + array_push($resArray, [$chrom,$row[1],$row[2],"",$row[4]]); + $noMergedRect = true; + continue; + } if ($tempStartPix - $mergedRectEndtPix > 1){ - //array_push($result, $mergedRect); + //$mergedRect[5] = mergeExonsArray($mergedRect[5],$scale); array_push($resArray, $mergedRect); $mergedRect[1] = $row[1]; $mergedRect[2] = $row[2]; + //$mergedRect[5] = [$exons]; } else{ - $mergedRect[2] = $row[2]; + if ($mergedRect[2] < $row[2]){ + $mergedRect[2] = $row[2]; + } + // foreach ($exons as $key => $value) { + // array_push($mergedRect[5], $value); + // } } + } $LastElement = end($resArray); @@ -187,41 +288,131 @@ array_push($resArray, $mergedRect); } + $resExon = mergeExonsArray($exonArray,$scale); + return [$resArray,$resExon]; + } - return $resArray; + function getTrackData($fileHandles,$name,$chrom,$start,$end){ + $returnArray = []; + foreach ($fileHandles as $key => $value) { + # code... + if ($name[$key] == "HG19"){ + $resArray = getHG19TrackData($fileHandles[$key],$chrom,$start,$end); + array_push($returnArray, $resArray); + continue; + } + + $fileHandle = $value; + + $db_name = $GLOBALS['db_name']; + $link = $GLOBALS['DBlink']; + $resArray = []; + $scale = 1000/($end - $start); + + $sql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle}"; + $sql .= " WHERE `CHROM` = '".$chrom."'"; + $sql .= " AND (((`CHROM_START` BETWEEN $start AND $end) OR (`CHROM_END` BETWEEN $start AND $end))"; + $sql .= " OR (`CHROM_START` <= $start AND `CHROM_END` >= $end))"; + $sql .= " ORDER BY `CHROM_START` * 1 ASC"; + + $res = mysqli_query ($link,$sql); + + $mergedRect = []; + $firstRow = mysqli_fetch_row($res); + + $mergedRect = [$chrom,$firstRow[1],$firstRow[2],"",""]; + + $noMergedRect = false; + + while($row = mysqli_fetch_row($res)){ + $tempStartPix = ($row[1] - $start) * $scale; + $tempEndtPix = ($row[2] -$start)* $scale; + + $mergedRectStartPix = ($mergedRect[1] - $start) * $scale; + $mergedRectEndtPix = ($mergedRect[2] - $start) * $scale; + + if ($noMergedRect){ + $mergedRect = [$chrom,$row[1],$row[2],"",$row[4]]; + $noMergedRect = false; + continue; + } + //print_r($row); + if (is_numeric($row[4])){ + array_push($resArray, $mergedRect); + array_push($resArray, [$chrom,$row[1],$row[2],"",$row[4]]); + $noMergedRect = true; + continue; + } + if ($tempStartPix - $mergedRectEndtPix > 1){ + //array_push($result, $mergedRect); + array_push($resArray, $mergedRect); + $mergedRect[1] = $row[1]; + $mergedRect[2] = $row[2]; + } + else{ + if ($mergedRect[2] < $row[2]){ + $mergedRect[2] = $row[2]; + } + } + } + + $LastElement = end($resArray); + reset($resArray); + if ($mergedRect[1] != $LastElement[1]){ + array_push($resArray, $mergedRect); + + } + + array_push($returnArray, $resArray); + } + return $returnArray; } - function getStartEndHG19Data($fileHandle,$chrom){ + function getStartEndTrackData($fileHandles,$name,$chrom){ $db_name = $GLOBALS['db_name']; $link = $GLOBALS['DBlink']; - $resArray = []; - + + $returnArray = []; $sql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle}"; $sql .= " WHERE `CHROM` = '".$chrom."'"; $sql .= " ORDER BY `CHROM_START` * 1 ASC"; - $minsql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle} ORDER BY `CHROM_START` * 1 ASC LIMIT 1"; - $minres = mysqli_query ($link,$minsql); + foreach ($fileHandles as $key => $value) { + # code... + $resArray = []; + $fileHandle = $value; - while($row = mysqli_fetch_row($minres)) - { - $minRect = [$chrom,$row[1],$row[2],"",""]; + $minsql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle} ORDER BY `CHROM_START` * 1 ASC LIMIT 1"; + if ($name[$key] == "HG19"){ + $minsql = "SELECT `chrom`, `txStart`, `txEnd`, `name2`, `score` FROM {$db_name}.{$fileHandle} ORDER BY `txStart` * 1 ASC LIMIT 1"; + } + $minres = mysqli_query ($link,$minsql); - array_push($resArray, $minRect); - } + while($row = mysqli_fetch_row($minres)) + { + $minRect = [$chrom,$row[1],$row[2],"",""]; - $maxsql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle} ORDER BY `CHROM_END` * 1 DESC LIMIT 1"; - $maxres = mysqli_query ($link,$maxsql); + array_push($resArray, $minRect); + } - while($row = mysqli_fetch_row($maxres)) - { - $maxRect = [$chrom,$row[1],$row[2],"",""]; + $maxsql = "SELECT `CHROM`, `CHROM_START`, `CHROM_END`, `GENESYMBOL`, `SCORE` FROM {$db_name}.{$fileHandle} ORDER BY `CHROM_END` * 1 DESC LIMIT 1"; + if ($name[$key] == "HG19"){ + $maxsql = "SELECT `chrom`, `txStart`, `txEnd`, `name2`, `score` FROM {$db_name}.{$fileHandle} ORDER BY `txEnd` * 1 DESC LIMIT 1"; + } + $maxres = mysqli_query ($link,$maxsql); - array_push($resArray, $maxRect); - } + while($row = mysqli_fetch_row($maxres)) + { + $maxRect = [$chrom,$row[1],$row[2],"",""]; - return $resArray; + array_push($resArray, $maxRect); + } + + array_push($returnArray, $resArray); + + } + return $returnArray; } function ajaxReturn($result){