diff --git a/VQI_GenomeBrowser.js b/VQI_GenomeBrowser.js index e163096..78d91ce 100755 --- a/VQI_GenomeBrowser.js +++ b/VQI_GenomeBrowser.js @@ -17,7 +17,7 @@ function VQI_GenomeBrowser(id, serviceURL) { var trackList = []; - var genomeData = []; + var genomes = {}; var chromosomes = []; var thisObj = this; @@ -31,9 +31,6 @@ function VQI_GenomeBrowser(id, serviceURL) { var trackInfo = []; - trackInfo[0] = {name: "HG19", type: "bed", args: {fileHandle: "upload1436481988"}}; - trackInfo[1] = {name: "Tile2 Content Snp", type: "bed", args: {fileHandle: "upload1436411775", exportable: true}}; - trackInfo[2] = {name: "cpg", type: "cpg", args: {fileHandle: "upload1437097194,upload1437098473,upload1437098556"}}; var serviceURL = serviceURL; @@ -148,11 +145,13 @@ function VQI_GenomeBrowser(id, serviceURL) { this.makeNavMenu(); this.makeNavigationForm = function () { + var genomeDropdown = ""; var navigateButton = ""; - var form = ""; + var form = ""; $("#" + divId).append(form); $("#" + divId + " #navigatebutton").on("click", navigateToRegion.bind(this)); + $("#" + divId + " #genomes").on("change", function(){self.setGenome($("#" + divId + " #genomes").val())}); }; this.makeNavigationForm(); @@ -290,6 +289,16 @@ function VQI_GenomeBrowser(id, serviceURL) { reorderTracks(); updateAllTracksSelectBoxes(); } + + var removeAllTracks = function () { + for (var i = trackList.length - 1; i >= 0; i--) { + trackList[i].group.remove(); + trackList.splice(i, 1); + } + + reorderTracks(); + updateAllTracksSelectBoxes(); + } /* this.getSelectedTrackNames = function(){ var tracknames = [] @@ -553,9 +562,9 @@ function VQI_GenomeBrowser(id, serviceURL) { if(name !== undefined){ var trackName = name+" "+genome; } - trackInfo.push({name: trackName, type: "bed", args: {fileHandle: CurrentFileHandle, exportable: true}}); + trackInfo.push({name: trackName, type: "custom", args: {fileHandle: CurrentFileHandle, exportable: true}}); updateRecentTrackDropDown(); - self.addTrack([] , trackName , "bed" , {fileHandle: CurrentFileHandle, exportable: true}); + self.addTrack(trackName , "custom" , {table_name: CurrentFileHandle}); }).error(function (req, status, error) { $("body").append(status + ": " + error); }); @@ -689,10 +698,40 @@ function VQI_GenomeBrowser(id, serviceURL) { } } - var addOneTrack = function (data, name, type, args) { + var reorderTracks = function () { + svg.transition().attr("height", height + 2 * margin + trackList.length * (trackHeight + bufferSpace)); + for (var i in trackList) { + trackList[i].group.transition().attr("transform", "translate(" + 0 + "," + (margin + bufferSpace + i * (trackHeight + bufferSpace)) + ")"); + } + } - var trackIndex = trackList.length; + this.loadGenomes = function(genomesData) { + genomes = genomesData; + selectBox = $("#" + divId +" #genomes").get(0); + selectBox.options.length = 0; + var optionIndex = 0; + for (var key in genomes) { + var text = key; + var value = key; + selectBox.options[optionIndex++] = new Option(text, value); + } + } + this.setGenome = function(genome) { + removeAllTracks(); + $("#" + divId +" #genomes").val(genome); + + if(genomes.hasOwnProperty(genome)){ + for(var key in genomes[genome]) + { + this.addTrack(genome+"_"+key, key, genomes[genome][key]) + } + } + } + + this.addTrack = function (name, type, args) { + + var trackIndex = trackList.length; var trackCount = trackIndex + 1; //name of track @@ -700,10 +739,14 @@ function VQI_GenomeBrowser(id, serviceURL) { if(type == "cpg") trackList.push(new CpgTrack(name, graphRegion.append("g"), args)); - if(type == "bed") + else if(type == "genes") trackList.push(new BedTrack(name, graphRegion.append("g"), args)); - if(type == "fasta") + else if(type == "fasta") trackList.push(new FastaTrack(name, graphRegion.append("g"), args)); + else{ + args.exportable = true; + trackList.push(new CustomTrack(name, graphRegion.append("g"), args)); + } setPanExtent(); graph(chrom_curr); @@ -712,26 +755,13 @@ function VQI_GenomeBrowser(id, serviceURL) { zoomOnly = true; zoomed(); zoomOnly = false; - return data; - } - - var reorderTracks = function () { - svg.transition().attr("height", height + 2 * margin + trackList.length * (trackHeight + bufferSpace)); - for (var i in trackList) { - trackList[i].group.transition().attr("transform", "translate(" + 0 + "," + (margin + bufferSpace + i * (trackHeight + bufferSpace)) + ")"); - } - } - - this.addTrack = function (data, name, type, args) { - - addOneTrack(data, name, type, args); reorderTracks(); updateAllTracksSelectBoxes(); } - this.addTrackFile = function (dataFile, name, type, header) { + /*this.addTrackFile = function (dataFile, name, type, header) { $.get(dataFile, function (data) { var dataRows = thisObj.parseTrackFile(data, header); @@ -740,79 +770,6 @@ function VQI_GenomeBrowser(id, serviceURL) { }); } -/* this.setData = function (data) { - genomeData = data; - graph(chromosomes[0]); - } - - this.getData = function () { - return genomeData; - } - - this.loadCPGFiles = function (cpg, shoer, shelf) { - genomeData = []; - chromosomes = []; - //Will read the 3 files and place all data into genomeData - //as objects with attributes 'chromosome', 'start', 'end', 'type' - - $.get(cpg, function (data) { - var cpgData = data.trim().split("\n"); - $.each(cpgData, function (index, value) { - cpgData[index] = cpgData[index].trim().split("\t").map(function (item) { - return isNaN(Number(item)) ? item : Number(item); - }); - }); - - //get all unique chromosomes - var currentChromosome = ""; - $.each(cpgData, function (index, value) { - if (value[0] != currentChromosome) - { - chromosomes.push(value[0]); - currentChromosome = value[0]; - } - }); - - - cpgData = cpgData.map(function (data) { - return [data[0], data[1], data[2], "cpg"]; - - }); - genomeData = genomeData.concat(cpgData); - }); - - $.get(shoer, function (data) { - var tempShoreData = data.trim().split("\n"); - $.each(tempShoreData, function (index, value) { - tempShoreData[index] = tempShoreData[index].trim().split("\t").map(function (item) { - return isNaN(Number(item)) ? item : Number(item); - }); - }); - var shoreData = []; - $.each(tempShoreData, function (index, value) { - shoreData.push([value[0], value[1], value[2], "shore"]); - shoreData.push([value[0], value[3], value[4], "shore"]); - }); - genomeData = genomeData.concat(shoreData); - }); - - $.get(shelf, function (data) { - var tempShelveData = data.trim().split("\n"); - $.each(tempShelveData, function (index, value) { - tempShelveData[index] = tempShelveData[index].trim().split("\t").map(function (item) { - return isNaN(Number(item)) ? item : Number(item); - }); - }); - var shelveData = []; - $.each(tempShelveData, function (index, value) { - shelveData.push([value[0], value[1], value[2], "shelve"]); - shelveData.push([value[0], value[3], value[4], "shelve"]); - }); - genomeData = genomeData.concat(shelveData); - thisObj.addTrack(genomeData, "cpg", 'cpg'); - }); - }*/ - this.parseTrackFile = function (data, header) { var delimeter = "\t"; var thisData = new Array(); @@ -831,7 +788,7 @@ function VQI_GenomeBrowser(id, serviceURL) { thisData.push(thisObject); } return thisData; - }; + };*/ this.getTrackByName = function (name) { for (var i in trackList) { @@ -891,6 +848,7 @@ function VQI_GenomeBrowser(id, serviceURL) { if (data[i].constructor === Array) { var row = data[i].join("\t"); + row = row.trim(); temp.push(row); } } @@ -903,57 +861,7 @@ function VQI_GenomeBrowser(id, serviceURL) { } - function optmizedTrack(){ - - var myData; - var start = (Math.round(xScale.domain()[0])).toString(); - var end = (Math.round(xScale.domain()[1])).toString(); - - $.ajax({ - url: 'zoomAssist.php', - type: 'POST', - dataType: "json", - data: { - "start": start, - "end": end - } - - }).success(function (data) { - myData = data; - d3.select(test2).select("svg") - .remove(); - var svg2 = d3.select(test2) - .append("svg") - .attr("width", width + 2 * margin) - .attr("height", height + 2 * margin); - - var graphR = svg2.append("g").attr("transform", "translate(" + margin + "," + margin + ")"); - - var tracks = graphR.selectAll("rect") - .data(myData) - .enter() - .append("rect") - .attr("fill", "gray") - .attr("x", function (d) { - return xScale(d.start); - }) - .attr("y", 5) - .attr("height", 10) - .attr("width", function (d) { - return Math.ceil(xScale(d.end) - xScale(d.start)); - }); - }).error(function (req, status, error) { - $("body").append(status + ": " + error); - }); - } - function Track(name, group, args) { - //Perhaps I need a better structure if I'm just going to pass custom arguments through args as a json object - //Possible value pairs: - //filehandle : string - //exportable : boolean - //file : string - //indexFile : string this.group = group; this.name = name; @@ -1104,7 +1012,7 @@ function VQI_GenomeBrowser(id, serviceURL) { Track.call(this, name, group, args); var trackGroup = this.trackGroup; - var fileHandle = args.fileHandle; + var fileHandle = args.table_name; var tempHandles = fileHandle.split(","); var cpgFileHandle = tempHandles[0]; var shelveFileHandle = tempHandles[1]; @@ -1168,18 +1076,18 @@ function VQI_GenomeBrowser(id, serviceURL) { addTooltip(trackGroup.selectAll("rect") .filter(function (d) { - return d[indexArray.type] == "cpg";}), name, "cpg", cpgFileHandle); + return d[indexArray.type] == "cpg";}), "cpg", cpgFileHandle); addTooltip(trackGroup.selectAll("rect") .filter(function (d) { - return d[indexArray.type] == "shore";}), name, "shore", shoreFileHandle); + return d[indexArray.type] == "shore";}), "shore", shoreFileHandle); addTooltip(trackGroup.selectAll("rect") .filter(function (d) { - return d[indexArray.type] == "shelve";}), name, "shelve", shelveFileHandle); + return d[indexArray.type] == "shelve";}), "shelve", shelveFileHandle); } - var addTooltip = function(selection, name, type, fileHandle) + var addTooltip = function(selection, type, fileHandle) { var start = (Math.round(xScale.domain()[0])).toString(); var end = (Math.round(xScale.domain()[1])).toString(); @@ -1219,7 +1127,6 @@ function VQI_GenomeBrowser(id, serviceURL) { data: { "loadTooltip": "", "chrom": chrom_curr, - "trackName" : name, "type" : type, "min" : min, "max": max, @@ -1268,8 +1175,8 @@ function VQI_GenomeBrowser(id, serviceURL) { dataType: "json", data: { "getTrackData": "", - "fileHandles": fileHandle, - "name": name, + "fileHandle": fileHandle, + "type": "cpg", "chrom": chrom, "start": start, "end": end @@ -1346,7 +1253,7 @@ function VQI_GenomeBrowser(id, serviceURL) { Track.call(this, name, group, args) var trackGroup = this.trackGroup; - var fileHandle = args.fileHandle; + var fileHandle = args.table_name; var data; var redrawCutoff = 1000; //Scale at which rectangles will be drawn individually @@ -1406,7 +1313,7 @@ function VQI_GenomeBrowser(id, serviceURL) { addTooltip(trackGroup.selectAll("rect") .data(data, function (d) { - return d;}), name, "gene") + return d;}), "gene") if (exons) { @@ -1442,12 +1349,12 @@ function VQI_GenomeBrowser(id, serviceURL) { addTooltip(trackGroup.selectAll("rect") .data(exons, function (d) { - return d;}), name, "exon") + return d;}), "exon") } } - var addTooltip = function(selection, name, type) + var addTooltip = function(selection, type) { var start = (Math.round(xScale.domain()[0])).toString(); var end = (Math.round(xScale.domain()[1])).toString(); @@ -1487,7 +1394,6 @@ function VQI_GenomeBrowser(id, serviceURL) { data: { "loadTooltip": "", "chrom": chrom_curr, - "trackName" : name, "type" : type, "min" : min, "max": max, @@ -1511,8 +1417,6 @@ function VQI_GenomeBrowser(id, serviceURL) { var start = (Math.round(xScale.domain()[0])).toString(); var end = (Math.round(xScale.domain()[1])).toString(); var chrom = chrom_curr; - //var fileHandles = [fileHandle]; - var name = this.name; var LoadingText = group.append("g") LoadingText.append("rect") @@ -1536,8 +1440,260 @@ function VQI_GenomeBrowser(id, serviceURL) { dataType: "json", data: { "getTrackData": "", - "fileHandles": fileHandle, - "name": name, + "fileHandle": fileHandle, + "type": "gene", + "chrom": chrom, + "start": start, + "end": end + } + + }).success(function (returnData) { + if(returnData.length == 2) {//exons exist + + drawTrack(returnData[0], returnData[1]); + } + else{ + drawTrack(returnData); + } + LoadingText.remove(); + } + ).error(function (req, status, error) { + $("body").append(status + ": " + error); + }); + this.zoomed(); + } + + var previousScale = 1; + this.zoomed = function() { + var thisScale = getScale(); + if(zoom.scale() < redrawCutoff) + { + if(previousScale > redrawCutoff) + { + trackGroup.selectAll("rect") + .attr("width", function (d) { + return thisScale(d[indexArray.end]) - thisScale(d[indexArray.start]) + }) + .attr("x", function (d) { + return thisScale(d[indexArray.start]) + }); + } + trackGroup.attr("transform", "translate(" + zoom.translate()[0] + ",0)scale(" + zoom.scale() + ",1)"); + } + else + { + trackGroup.attr("transform", null); + trackGroup.selectAll("rect") + .attr("width", function (d) { + return thisScale(d[indexArray.end]) - thisScale(d[indexArray.start]) + }) + .attr("x", function (d) { + return thisScale(d[indexArray.start]) + }); + } + previousScale = zoom.scale(); + } + + this.getData = function(){ + var data; + $.ajax({ + url: serviceURL, + type: 'POST', + dataType: "json", + async : false, + data: { + "getFullTrackData": "", + "fileHandle": fileHandle + } + }).success(function (returnData) { + data = returnData; + console.log(returnData); + data.unshift(["CHROM","CHROM_START","CHROM_END","GENESYMBOL","SCORE","STRAND"]); + }).error(function (req, status, error) { + $("body").append(status + ": " + error); + }); + + return data; + } + + this.getRange = function(){ + var range; + $.ajax({ + url: serviceURL, + type: 'POST', + dataType: "json", + async : false, + data: { + "getRange": "", + "fileHandles": [fileHandle], + "name": [name], + "chrom": chrom_curr + } + }).success(function (returnData) { + range = returnData; + }).error(function (req, status, error) { + $("body").append(status + ": " + error); + }); + + return range; + } + } + + function CustomTrack(name, group, args) { + Track.call(this, name, group, args) + var trackGroup = this.trackGroup; + + var fileHandle = args.table_name; + var data; + var redrawCutoff = 1000; //Scale at which rectangles will be drawn individually + + var getScale = function(){ + if(zoom.scale() < redrawCutoff) + return fullXScale; + else + return xScale; + } + + var drawTrack = function(data, exons) + { + if (data.length === 0) { + return; + } + + var thisScale = getScale(); + + var trackHeight = 10; + + trackGroup.selectAll("rect") + .data(data, function (d) { + return d; + }) + .exit() + .remove(); + + trackGroup.selectAll("rect") + .data(data, function (d) { + return d; + }) + .enter() + .append("rect"); + + trackGroup.selectAll("rect") + .data(data, function (d) { + return d; + }) + .attr("x", function (d) { + return thisScale(d[indexArray.start]); + }) + .attr("y", function (d) { + return d[indexArray.score] > 0 ? -10 : d[indexArray.score] < 0 ? 0 : -5; + }) + .attr("height", 10) + .attr("width", function (d) { + return thisScale(d[indexArray.end]) - thisScale(d[indexArray.start]); + }) + .style("fill-opacity", "1") + .style("stroke", function (d) { + return d[indexArray.score] > 0 ? "red" : d[indexArray.score] < 0 ? "green" : "grey"; + }) + .style("fill", function (d) { + return d[indexArray.score] > 0 ? "red" : d[indexArray.score] < 0 ? "green" : "grey"; + }) + .style("vector-effect", "non-scaling-stroke") + + addTooltip(trackGroup.selectAll("rect") + .data(data, function (d) { + return d;}), "custom") + } + + var addTooltip = function(selection, type) + { + var start = (Math.round(xScale.domain()[0])).toString(); + var end = (Math.round(xScale.domain()[1])).toString(); + var scale = (end - start)/1000; + + selection.each( + function(d){ + $(this).qtip({ + content: { + text: "Loading..." + }, + position: { + my: 'top center', + at: 'top center', + target: 'mouse', + adjust: { + mouse: true, // Can be omitted (e.g. default behaviour) + y: 10 + } + } + }) + }); + + selection.each(function(){ + var selected = $(this); + var hoverTimeout = 0; + $(this).mousemove(function(event) { + clearTimeout(hoverTimeout); + hoverTimeout = setTimeout(function(){ + var pixelWidth = (xScale.domain()[1] - xScale.domain()[0])/1000 + var min = (event.pageX - 60) * pixelWidth + xScale.domain()[0]; + var max = (event.pageX - 58) * pixelWidth + xScale.domain()[0]; + $.ajax({ + url: serviceURL, + type: 'POST', + dataType: "json", + data: { + "loadTooltip": "", + "chrom": chrom_curr, + "type" : "custom", + "min" : min, + "max": max, + 'fileHandle': fileHandle + } + }) + .then(function(content) { + // Set the tooltip content upon successful retrieval + selected.qtip('option', 'content.text', content); + selected.qtip('reposition', event); + }, function(xhr, status, error) { + // Upon failure... set the tooltip content to the status and error value + selected.qtip('option', 'content.text', status + ': ' + error); + }); + } , 200); + }); + }); + } + + this.updateTrack = function(){ + var start = (Math.round(xScale.domain()[0])).toString(); + var end = (Math.round(xScale.domain()[1])).toString(); + var chrom = chrom_curr; + + var LoadingText = group.append("g") + LoadingText.append("rect") + .attr("x", 450) + .attr("width", 100) + .attr("y", -10) + .attr("height", 20) + .attr("rx", 6) + .attr("ry", 6) + .style("fill-opacity", .6) + .style("fill", "white") + + LoadingText.append("text") + .text("Loading...") + .attr("x", 475) + .attr("y", 5); + + $.ajax({ + url: serviceURL, + type: 'POST', + dataType: "json", + data: { + "getTrackData": "", + "fileHandle": fileHandle, + "type": "custom", "chrom": chrom, "start": start, "end": end @@ -1599,10 +1755,11 @@ function VQI_GenomeBrowser(id, serviceURL) { async : false, data: { "getFullTrackData": "", - "fileHandles": [fileHandle] + "fileHandle": fileHandle } }).success(function (returnData) { data = returnData; + console.log(returnData); data.unshift(["CHROM","CHROM_START","CHROM_END","GENESYMBOL","SCORE","STRAND"]); }).error(function (req, status, error) { $("body").append(status + ": " + error); @@ -1638,8 +1795,8 @@ function VQI_GenomeBrowser(id, serviceURL) { Track.call(this, name, group, args); var trackGroup = this.trackGroup; - var file = args.file; - var indexFile = args.indexFile + var file = args.fasta; + var indexFile = args.index var drawTrack = function(data) { diff --git a/VQI_GenomeBrowserDemo.html b/VQI_GenomeBrowserDemo.html index ad9e717..b7e92f7 100644 --- a/VQI_GenomeBrowserDemo.html +++ b/VQI_GenomeBrowserDemo.html @@ -29,22 +29,40 @@ var obj = new VQI_GenomeBrowser("test",'dynamic_loading.php'); //insert path to file and indexfile - obj.addTrack([], "fasta", "fasta", - { file : "", - indexFile : ""}); + /*obj.addTrack([], "fasta", "fasta", + { file : "/Users/corywang/Downloads/hg19.fa.txt", + indexFile : "/Users/corywang/Downloads/hg19.fa.fai.txt"}); obj.addTrack([], "cpg", "cpg", {fileHandle : "upload1437097194,upload1437098473,upload1437098556"}); obj.addTrack([], "HG19", "bed", {fileHandle : "upload1436481988"}); obj.addTrack([], "Tile2 Content Snp", "bed", { fileHandle : "upload1436411775", - exportable : true}); - /*var data = [["chr1", "896004", "896005", ".", "0", "+"], - ["chr1", "976170", "976171", ".", "-.4", "+"], - ["chr1", "1198674", "1198675", ".", "0", "+"], - ["chr1", "1250433", "1250434", ".", "1", "+"], - ["chr1", "1597292", "1597293", "rs79791328", "0", "+"], - ["chr1", "1597292", "1597293", "rs79791328", "0", "+"]];*/ + exportable : true});*/ + + var genomes = { + "HG19":{ + /*fasta: {fasta: "../../genome/hg19.fa", index: "../../genome/hg19.fa.fai"}, + genes: {file: "../../genome/hg19_genes.txt", table_name:'hg19_gene_annotation'}, + cpg: {file: "../../genome/hg19_genes.txt", table_name:'hg19_cpg'},*/ + fasta: {fasta: "/Users/corywang/Downloads/hg19.fa.txt", index : "/Users/corywang/Downloads/hg19.fa.fai.txt"}, + genes: {file: "", table_name: "upload1436481988"}, + cpg: {files: "", table_name: "upload1437097194,upload1437098473,upload1437098556"}, + custom: {file: "", table_name:'upload1436411775'} + }, + "MM9":{ + fasta: {fasta: "/Users/corywang/Downloads/mm9.fa.txt", index: "/Users/corywang/Downloads/mm9.fa.fai.txt"}, + //genes: {file: "../../genome/mm9/mm9_genes.txt", table_name:'mm9_gene_annotation'}, + + // gene_annotation: {label: 'mm9', table_name:'mm9_gene_annotation'}, + }, + }; + + obj.loadGenomes(genomes); //loads the genomes based on the datastructure described above + obj.setGenome("HG19"); + // obj.setGenome("MM9"); //should set hg19 genome in dropdown and display fasta, cpg and genes tracks. + + // addTrack(); should add track using the data array supplied. diff --git a/dynamic_loading.php b/dynamic_loading.php index d2d37d2..70e1c42 100644 --- a/dynamic_loading.php +++ b/dynamic_loading.php @@ -50,7 +50,7 @@ ajaxReturn($result); } else if (isset($_POST["getTrackData"])){ - $result = getTrackData($_POST["fileHandles"], $_POST["name"], $_POST["chrom"], $_POST["start"], $_POST["end"]); + $result = getTrackData($_POST["fileHandle"], $_POST["type"], $_POST["chrom"], $_POST["start"], $_POST["end"]); ajaxReturn($result); } else if (isset($_POST["getRange"])){ @@ -58,7 +58,7 @@ ajaxReturn($result); } else if (isset($_POST["loadTooltip"])){ - $result = loadTooltip($_POST["chrom"],$_POST["trackName"], $_POST["type"], $_POST["min"],$_POST["max"],$_POST["fileHandle"]); + $result = loadTooltip($_POST["chrom"], $_POST["type"], $_POST["min"],$_POST["max"],$_POST["fileHandle"]); ajaxReturn($result); } else if (isset($_POST["loadFastaData"])){ @@ -70,7 +70,7 @@ ajaxReturn($result); } else if (isset($_POST["getFullTrackData"])){ - $result = getFullTrackData($_POST["fileHandles"]); + $result = getFullTrackData($_POST["fileHandle"]); ajaxReturn($result); } else { @@ -442,16 +442,15 @@ return $resArray; } - function getTrackData($fileHandle,$name,$chrom,$start,$end){ - + function getTrackData($fileHandle,$type,$chrom,$start,$end){ # code... - if ($name == "HG19"){ - $resArray = getHG19TrackData($fileHandle,$chrom,$start,$end); + if ($type == "gene"){ + $resArray = getGeneTrackData($fileHandle,$chrom,$start,$end); return $resArray; } - else if ($name == "cpg"){ + else if ($type == "cpg"){ $resArray = getCpgTrackData($fileHandle,$chrom,$start,$end); return $resArray; } @@ -526,8 +525,6 @@ function getFullTrackData($fileHandles){ $returnArray = []; - foreach ($fileHandles as $key => $value) { - $fileHandle = $value; $db_name = $GLOBALS['db_name']; $link = $GLOBALS['DBlink']; @@ -539,7 +536,7 @@ while($row = mysqli_fetch_row($res)){ array_push($returnArray, [$row[0],$row[1],$row[2],$row[3],$row[4],$row[5]]); - } + } return $returnArray; } @@ -596,14 +593,13 @@ return $returnArray; } - function loadTooltip($chrom,$trackName, $type, $min, $max, $fileHandle){ + function loadTooltip($chrom, $type, $min, $max, $fileHandle){ //return $chrom.$trackName.$type.$xCoordinate.$scale.$fileHandle; - - if($trackName == "cpg"){ + if($type == "cpg" || $type == "shore" || $type == "shelve"){ return loadCPGTooltip($chrom,$type, $min,$max,$fileHandle); } - else if($trackName == 'HG19'){ - return loadHG19Tooltip($chrom,$type, $min,$max,$fileHandle); + else if($type == 'gene' || $type == "exon"){ + return loadGeneTooltip($chrom,$type, $min,$max,$fileHandle); } else{ return loadBEDTooltip($chrom,$type, $min,$max,$fileHandle);