diff --git a/model/src/main/java/lcsb/mapviewer/model/map/layout/GeneVariation.java b/model/src/main/java/lcsb/mapviewer/model/map/layout/GeneVariation.java index 9239fc6c7542b72e9e46c918eab82dee5f5e9e4f..76eeee8ea91697cc6d490192ec827a4b0f58e405 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/layout/GeneVariation.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/layout/GeneVariation.java @@ -41,6 +41,9 @@ public class GeneVariation implements Serializable { */ private String contig; + private String allelFrequency; + private String variantIdentifier; + /** * Reference genome type. */ @@ -70,6 +73,8 @@ public class GeneVariation implements Serializable { this.setReferenceGenomeVersion(original.getReferenceGenomeVersion()); this.addReferences(original.getReferences()); this.setContig(original.getContig()); + this.setAllelFrequency(original.getAllelFrequency()); + this.setVariantIdentifier(original.getVariantIdentifier()); } /** @@ -235,4 +240,38 @@ public class GeneVariation implements Serializable { this.position = (long) position; } + /** + * @return the allelFrequency + * @see #allelFrequency + */ + public String getAllelFrequency() { + return allelFrequency; + } + + /** + * @param allelFrequency + * the allelFrequency to set + * @see #allelFrequency + */ + public void setAllelFrequency(String allelFrequency) { + this.allelFrequency = allelFrequency; + } + + /** + * @return the variantIdentifier + * @see #variantIdentifier + */ + public String getVariantIdentifier() { + return variantIdentifier; + } + + /** + * @param variantIdentifier + * the variantIdentifier to set + * @see #variantIdentifier + */ + public void setVariantIdentifier(String variantIdentifier) { + this.variantIdentifier = variantIdentifier; + } + } diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java index d06c19183f1019116142d54131801dac457b6f4c..1d59bc9127d17416136204f696e6601f3fad8afe 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java @@ -151,6 +151,8 @@ public class ColorSchemaReader { Integer contigColumn = schemaColumns.get(ColorSchemaColumn.CONTIG); Integer nameColumn = schemaColumns.get(ColorSchemaColumn.NAME); Integer identifierColumn = schemaColumns.get(ColorSchemaColumn.IDENTIFIER); + Integer variantIdentifierColumn = schemaColumns.get(ColorSchemaColumn.VARIANT_IDENTIFIER); + Integer allelFrequencyColumn = schemaColumns.get(ColorSchemaColumn.ALLEL_FREQUENCY); Integer compartmentColumn = schemaColumns.get(ColorSchemaColumn.COMPARTMENT); Integer typeColumn = schemaColumns.get(ColorSchemaColumn.TYPE); Integer positionColumn = schemaColumns.get(ColorSchemaColumn.POSITION); @@ -233,6 +235,12 @@ public class ColorSchemaReader { if (originalDnaColumn != null) { gv.setOriginalDna(values[originalDnaColumn]); } + if (allelFrequencyColumn != null) { + gv.setAllelFrequency(values[allelFrequencyColumn]); + } + if (variantIdentifierColumn != null) { + gv.setVariantIdentifier(values[variantIdentifierColumn]); + } if (alternativeDnaColumn != null) { gv.setModifiedDna(values[alternativeDnaColumn]); } diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java b/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java index 2dfd6d892c2747ef8845b72a605357cab7d35ad5..a7f6ed47414cfab0c7d833e2575cee3013659371 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java @@ -97,6 +97,10 @@ public enum ColorSchemaColumn { * Contig where variant was observed. */ CONTIG("contig", new ColorSchemaType[] { ColorSchemaType.GENETIC_VARIANT }), // + + ALLEL_FREQUENCY("allel_frequency", new ColorSchemaType[] { ColorSchemaType.GENETIC_VARIANT }), // + + VARIANT_IDENTIFIER("variant_identifier", new ColorSchemaType[] { ColorSchemaType.GENETIC_VARIANT }), // /** * Should the direction of reaction be reversed. diff --git a/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java b/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java index 4cb1a9685bf767d2ca8bd5c15997f7577282b9e5..4b86da5e966329268caaae83de02578a4f4f3278 100644 --- a/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/utils/ColorSchemaReaderTest.java @@ -99,6 +99,39 @@ public class ColorSchemaReaderTest extends ServiceTestFunctions { } } + @Test + public void testReadGeneVariantsSchemaWithAF() throws Exception { + try { + File f = new File("testFiles/coloring/gene_variants_all_freq.txt"); + InputStream in = new FileInputStream(f); + + byte[] buff = new byte[8000]; + + int bytesRead = 0; + + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + + while ((bytesRead = in.read(buff)) != -1) { + bao.write(buff, 0, bytesRead); + } + in.close(); + bao.close(); + + byte[] data = bao.toByteArray(); + + ByteArrayInputStream bin = new ByteArrayInputStream(data); + + ColorSchemaReader reader = new ColorSchemaReader(); + + Collection<ColorSchema> schemas = reader.readColorSchema(bin, TextFileUtils.getHeaderParametersFromFile(new ByteArrayInputStream(data))); + assertNotNull(schemas); + assertEquals(2, schemas.size()); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + @Test public void testReadInvalidGeneVariantsSchema() throws Exception { try { diff --git a/service/testFiles/coloring/gene_variants_all_freq.txt b/service/testFiles/coloring/gene_variants_all_freq.txt new file mode 100644 index 0000000000000000000000000000000000000000..c63af80978611c50da87d3a47836dcfc4dd740be --- /dev/null +++ b/service/testFiles/coloring/gene_variants_all_freq.txt @@ -0,0 +1,8 @@ +#TYPE=GENETIC_VARIANT +#GENOME_TYPE=UCSC +#GENOME_VERSION=hg38 +position original_dna alternative_dna name description color contig allel_frequency variant_identifier +10146 AC A DDX11L1 upstream #ff0000 chr1 0.8 identifier_1 +10439 AC A DDX11L1;WASH7P upstream;downstream #ff0001 chr1 0.5 identifier_2 +10441 AC A DDX11L1;WASH7P upstream;downstream #ff0001 chr1 0.2 identifier_3 +10443 AC A DDX11L1;WASH7P upstream;downstream #ff0001 chr1 0.9 identifier_4 diff --git a/web/src/main/webapp/resources/js/AliasInfoWindow.js b/web/src/main/webapp/resources/js/AliasInfoWindow.js index 63b01c02abb4654df9238615b09ce6d067b910e1..858dfbed15eb50a129e31eed7199e143c7f16449 100644 --- a/web/src/main/webapp/resources/js/AliasInfoWindow.js +++ b/web/src/main/webapp/resources/js/AliasInfoWindow.js @@ -1,355 +1,366 @@ -/** - * Class representing info window that should be opened when clicking on alias. - */ -function AliasInfoWindow(alias, map) { - // call super constructor - AbstractInfoWindow.call(this, alias, map); - - if (alias instanceof AliasMarker) { - this.alias = alias.getAliasData(); - } else { - this.alias = alias; - } - var self = this; - - if (this.alias != null) { - var point = new google.maps.Point(this.alias.x + this.alias.width / 2, - this.alias.y + this.alias.height / 2); - var latLng = this.customMap.fromPointToLatLng(point); - this.googleInfowindow = new google.maps.InfoWindow({ - content : this.content, - position : latLng - }); - this.googleInfowindow.open(this.customMap.map, this.getGoogleMarker()); - } else { - logger.warn("Opening window without alias specified"); - } - this.update(alias); -}; - -AliasInfoWindow.prototype = Object.create(AbstractInfoWindow.prototype); -AliasInfoWindow.prototype.constructor = AliasInfoWindow; - -/** - * Updates content of info window. The content will be automatically obtained - * from {@link CustomMap} instance. The only optional parameter is {@link Alias} - * data. - * - * @param newAlias - * optional {@link Alias} data for which this {@link AliasInfoWindow} - * was created - */ -AliasInfoWindow.prototype.update = function(newAlias) { - if (this.alias == null && newAlias != null) { - this.alias = newAlias; - } - this._updateContent(); -}; - -/** - * Creates and returns chart representing data related to alias on different - * layouts. - * - * @returns {String} html string representing chart with data related to alias - * on different layouts - */ -AliasInfoWindow.prototype.createChartDiv = function() { - var result = document.createElement("div"); - for (var i = 0; i < this.layoutAliases.length; i++) { - var rowDiv = document.createElement("div"); - if (i % 2 == 0) { - rowDiv.className = "mapChartRowEvenDiv"; - } else { - rowDiv.className = "mapChartRowOddDiv"; - } - var data = this.layoutAliases[i]; - - var nameDiv = document.createElement("div"); - nameDiv.className = "mapChartNameDiv"; - nameDiv.innerHTML = this.layoutNames[i]; - rowDiv.appendChild(nameDiv); - - if (data != null) { - var value = parseFloat(data.value); - var color = intToColorString(data.color.value); - var leftMarginDiv = document.createElement("div"); - leftMarginDiv.innerHTML = " "; - leftMarginDiv.style.float = "left"; - var centerBarDiv = document.createElement("div"); - centerBarDiv.style.width = "1px"; - centerBarDiv.style.float = "left"; - centerBarDiv.style.background = "#000000"; - centerBarDiv.innerHTML = " "; - - var rightBarDiv = document.createElement("div"); - rightBarDiv.innerHTML = " "; - rightBarDiv.style.float = "left"; - rightBarDiv.style.background = color; - rightBarDiv.style.width = Math.abs(value * 100) + "px"; - if (!isNaN(value)) { - rightBarDiv.innerHTML = value.toFixed(2); - if (value > 0) { - var offset = 100; - leftMarginDiv.style.width = offset + "px"; - - rightBarDiv.style.textAlign = "right"; - - rowDiv.appendChild(leftMarginDiv); - rowDiv.appendChild(centerBarDiv); - rowDiv.appendChild(rightBarDiv); - } else { - var offset = 100 + (value * 100); - leftMarginDiv.style.width = offset + "px"; - - rowDiv.appendChild(leftMarginDiv); - rowDiv.appendChild(rightBarDiv); - rowDiv.appendChild(centerBarDiv); - } - - } else { - var offset = 100; - leftMarginDiv.style.width = offset + "px"; - leftMarginDiv.style.background = color; - rightBarDiv.style.width = offset + "px"; - rightBarDiv.style.background = color; - rowDiv.appendChild(leftMarginDiv); - rowDiv.appendChild(centerBarDiv); - rowDiv.appendChild(rightBarDiv); - } - } else { - var emptyDiv = document.createElement("div"); - emptyDiv.innerHTML = " "; - emptyDiv.style.float = "left"; - emptyDiv.style.width = "201px"; - rowDiv.appendChild(emptyDiv); - } - result.appendChild(rowDiv); - } - return result; -}; - -/** - * Methods that creates and return DOM object with the content of the window. - * - * @returns DOM object representing html code for content of the info window - */ -AliasInfoWindow.prototype.createContentDiv = function() { - if (this.alias != null && this.alias.completness == 'FULL') { - var result = document.createElement("div"); - var title = document.createElement("h3"); - title.innerHTML = this.alias.type + ": " + this.alias.name; - result.appendChild(title); - - this.layoutAliases = this.customMap - .getAliasVisibleLayoutsData(this.alias.id); - this.layoutNames = this.customMap.getVisibleLayoutNames(); - - var selectedLayouts = this.customMap.getTopMap().getSelectedLayouts(); - for (var i = 0; i < this.layoutAliases.length; i++) { - if (this.layoutAliases[i] != null) { - if (this.layoutAliases[i].getType() == LayoutAlias.LIGTH) { - if (!ServerConnector.isWaitingForFullAliasLayoutData( - parseInt(selectedLayouts[i]), parseInt(this.alias.getId()))) { - ServerConnector.retreiveFullAliasesForLayout(selectedLayouts[i], - this.alias.getId(), this.alias.getModelId()); - } - } - } - } - - var chartDiv = this.createChartDiv(); - if (chartDiv !== null) { - result.appendChild(chartDiv); - } - - var genomicDiv = this.createGenomicDiv(); - if (genomicDiv !== null) { - result.appendChild(genomicDiv); - } - - return result; - } else { - return null; - } -}; - -/** - * Returns array with data taken from all known {@link OverlayCollection}. - * - * @returns array with data from {@link OverlayCollection} - */ -AliasInfoWindow.prototype.getOverlaysData = function(general) { - if (this.alias != null) { - return this.getCustomMap().getTopMap().getOverlayDataForAlias(this.alias, - general); - } else { - return null; - } -}; - -/** - * Method returning identifier of the object for which this window was created. - */ -AliasInfoWindow.prototype.getElementId = function() { - if (this.alias != null) { - return this.alias.getId(); - } else { - return null; - } -} - -/** - * Method returning type of the object for which this window was created. - */ -AliasInfoWindow.prototype.getElementType = function() { - return "ALIAS"; -}; - -AliasInfoWindow.prototype.createGenomicDiv = function() { - var result = document.createElement("div"); - result.style.width = '640px'; - - var titleElement = document.createElement("h3"); - titleElement.innerHTML = "Gene variants"; - result.appendChild(titleElement); - - var contentElement = document.createElement("div"); - result.appendChild(contentElement); - - var geneticInformation = false; - var genomes = []; - var pileupSource = [ { - viz : pileup.viz.scale(), - name : 'Scale' - }, { - viz : pileup.viz.location(), - name : 'Location' - } ]; - var pileupRange = { - contig : 'chr1', - start : 3000000000, - stop : 0 - }; - - var globalGeneVariants = []; - var missingGeneVariantsData = false; - for (var i = 0; i < this.layoutAliases.length; i++) { - var data = this.layoutAliases[i]; - globalGeneVariants.push([]); - - if (data != null && !missingGeneVariantsData) { - if (data.getType() == LayoutAlias.LIGHT || data.getType() == null) { - missingGeneVariantsData = true; - } else if (data.getType() == LayoutAlias.GENETIC_VARIANT) { - var geneVariants = data.getGeneVariants(); - for (var j = 0; j < geneVariants.length; j++) { - if (!missingGeneVariantsData) { - var variant = geneVariants[j]; - - globalGeneVariants[i].push(variant); - - var genome = this.getCustomMap().getReferenceGenome( - variant.getReferenceGenomeType(), - variant.getReferenceGenomeVersion()); - - if (variant.getContig() != null) { - pileupRange.contig = variant.getContig(); - } - pileupRange.start = Math.min(pileupRange.start, variant - .getPosition()); - var length = Math.max(variant.getModifiedDna().length, variant - .getOriginalDna().length); - pileupRange.stop = Math.max(pileupRange.stop, variant.getPosition() - + length); - - if (genome != null && genome.getUrl() != null) { - if (genomes[genome.getUrl()] == null) { - - geneticInformation = true; - genomes[genome.getUrl()] = true; - pileupSource.splice(0, 0, { - viz : pileup.viz.genome(), - isReference : pileupSource.length == 2, - data : pileup.formats.twoBit({ - url : genome.getUrl() - }), - name : 'Reference ' + variant.getReferenceGenomeVersion() - }); - for (var k = 0; k < genome.getGeneMappings().length; k++) { - var mapping = genome.getGeneMappings()[k]; - pileupSource.push({ - viz : pileup.viz.genes(), - data : pileup.formats.bigBed({ - url : mapping.getUrl() - }), - name : 'Genes ' + mapping.getName() - }); - } - - } - } else { - logger.debug("Genome for " + variant.getReferenceGenomeType() - + "," + variant.getReferenceGenomeVersion() + " not loaded"); - missingGeneVariantsData = true; - } - } - } - } - } - } - if (missingGeneVariantsData) { - geneticInformation = false; - } - - if (geneticInformation) { - for (var i = 0; i < this.layoutAliases.length; i++) { - if (globalGeneVariants[i].length > 0) { - var vcfContent = this.createVcfString(globalGeneVariants[i]); - pileupSource.push({ - viz : pileup.viz.variants(), - data : pileup.formats.vcf({ - content : vcfContent - }), - name : this.layoutNames[i] + ' - Variants' - }); - } - } - - pileupRange.stop = Math.max(pileupRange.stop, pileupRange.start + 50); - - pileupRange.start--; - pileupRange.stop++; - - if (this.pileup != null) { - logger.debug("Destroy pileup"); - this.pileup.destroy(); - logger.debug("Pileup destroyed"); - } - this.pileup = pileup.create(contentElement, { - range : pileupRange, - tracks : pileupSource - }); - - return result; - } else { - return null; - } -}; - -AliasInfoWindow.prototype.createVcfString = function(geneVariants) { - var result = ""; - result += "##fileformat=VCFv4.0\n"; - result += "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"; - for (var i = 0; i < geneVariants.length; i++) { - var variant = geneVariants[i]; - result += variant.getContig() + "\t" + // - variant.getPosition() + "\t" + // - ".\t" + // - variant.getOriginalDna() + "\t" + // - variant.getModifiedDna() + "\t" + // - "100.0\t" + // - "PASS\t" + // - "\n"; - } - return result; -}; +/** + * Class representing info window that should be opened when clicking on alias. + */ +function AliasInfoWindow(alias, map) { + // call super constructor + AbstractInfoWindow.call(this, alias, map); + + if (alias instanceof AliasMarker) { + this.alias = alias.getAliasData(); + } else { + this.alias = alias; + } + var self = this; + + if (this.alias != null) { + var point = new google.maps.Point(this.alias.x + this.alias.width / 2, + this.alias.y + this.alias.height / 2); + var latLng = this.customMap.fromPointToLatLng(point); + this.googleInfowindow = new google.maps.InfoWindow({ + content : this.content, + position : latLng + }); + this.googleInfowindow.open(this.customMap.map, this.getGoogleMarker()); + } else { + logger.warn("Opening window without alias specified"); + } + this.update(alias); +}; + +AliasInfoWindow.prototype = Object.create(AbstractInfoWindow.prototype); +AliasInfoWindow.prototype.constructor = AliasInfoWindow; + +/** + * Updates content of info window. The content will be automatically obtained + * from {@link CustomMap} instance. The only optional parameter is {@link Alias} + * data. + * + * @param newAlias + * optional {@link Alias} data for which this {@link AliasInfoWindow} + * was created + */ +AliasInfoWindow.prototype.update = function(newAlias) { + if (this.alias == null && newAlias != null) { + this.alias = newAlias; + } + this._updateContent(); +}; + +/** + * Creates and returns chart representing data related to alias on different + * layouts. + * + * @returns {String} html string representing chart with data related to alias + * on different layouts + */ +AliasInfoWindow.prototype.createChartDiv = function() { + var result = document.createElement("div"); + for (var i = 0; i < this.layoutAliases.length; i++) { + var rowDiv = document.createElement("div"); + if (i % 2 == 0) { + rowDiv.className = "mapChartRowEvenDiv"; + } else { + rowDiv.className = "mapChartRowOddDiv"; + } + var data = this.layoutAliases[i]; + + var nameDiv = document.createElement("div"); + nameDiv.className = "mapChartNameDiv"; + nameDiv.innerHTML = this.layoutNames[i]; + rowDiv.appendChild(nameDiv); + + if (data != null) { + var value = parseFloat(data.value); + var color = intToColorString(data.color.value); + var leftMarginDiv = document.createElement("div"); + leftMarginDiv.innerHTML = " "; + leftMarginDiv.style.float = "left"; + var centerBarDiv = document.createElement("div"); + centerBarDiv.style.width = "1px"; + centerBarDiv.style.float = "left"; + centerBarDiv.style.background = "#000000"; + centerBarDiv.innerHTML = " "; + + var rightBarDiv = document.createElement("div"); + rightBarDiv.innerHTML = " "; + rightBarDiv.style.float = "left"; + rightBarDiv.style.background = color; + rightBarDiv.style.width = Math.abs(value * 100) + "px"; + if (!isNaN(value)) { + rightBarDiv.innerHTML = value.toFixed(2); + if (value > 0) { + var offset = 100; + leftMarginDiv.style.width = offset + "px"; + + rightBarDiv.style.textAlign = "right"; + + rowDiv.appendChild(leftMarginDiv); + rowDiv.appendChild(centerBarDiv); + rowDiv.appendChild(rightBarDiv); + } else { + var offset = 100 + (value * 100); + leftMarginDiv.style.width = offset + "px"; + + rowDiv.appendChild(leftMarginDiv); + rowDiv.appendChild(rightBarDiv); + rowDiv.appendChild(centerBarDiv); + } + + } else { + var offset = 100; + leftMarginDiv.style.width = offset + "px"; + leftMarginDiv.style.background = color; + rightBarDiv.style.width = offset + "px"; + rightBarDiv.style.background = color; + rowDiv.appendChild(leftMarginDiv); + rowDiv.appendChild(centerBarDiv); + rowDiv.appendChild(rightBarDiv); + } + } else { + var emptyDiv = document.createElement("div"); + emptyDiv.innerHTML = " "; + emptyDiv.style.float = "left"; + emptyDiv.style.width = "201px"; + rowDiv.appendChild(emptyDiv); + } + result.appendChild(rowDiv); + } + return result; +}; + +/** + * Methods that creates and return DOM object with the content of the window. + * + * @returns DOM object representing html code for content of the info window + */ +AliasInfoWindow.prototype.createContentDiv = function() { + if (this.alias != null && this.alias.completness == 'FULL') { + var result = document.createElement("div"); + var title = document.createElement("h3"); + title.innerHTML = this.alias.type + ": " + this.alias.name; + result.appendChild(title); + + this.layoutAliases = this.customMap + .getAliasVisibleLayoutsData(this.alias.id); + this.layoutNames = this.customMap.getVisibleLayoutNames(); + + var selectedLayouts = this.customMap.getTopMap().getSelectedLayouts(); + for (var i = 0; i < this.layoutAliases.length; i++) { + if (this.layoutAliases[i] != null) { + if (this.layoutAliases[i].getType() == LayoutAlias.LIGTH) { + if (!ServerConnector.isWaitingForFullAliasLayoutData( + parseInt(selectedLayouts[i]), parseInt(this.alias.getId()))) { + ServerConnector.retreiveFullAliasesForLayout(selectedLayouts[i], + this.alias.getId(), this.alias.getModelId()); + } + } + } + } + + var chartDiv = this.createChartDiv(); + if (chartDiv !== null) { + result.appendChild(chartDiv); + } + + var genomicDiv = this.createGenomicDiv(); + if (genomicDiv !== null) { + result.appendChild(genomicDiv); + } + + return result; + } else { + return null; + } +}; + +/** + * Returns array with data taken from all known {@link OverlayCollection}. + * + * @returns array with data from {@link OverlayCollection} + */ +AliasInfoWindow.prototype.getOverlaysData = function(general) { + if (this.alias != null) { + return this.getCustomMap().getTopMap().getOverlayDataForAlias(this.alias, + general); + } else { + return null; + } +}; + +/** + * Method returning identifier of the object for which this window was created. + */ +AliasInfoWindow.prototype.getElementId = function() { + if (this.alias != null) { + return this.alias.getId(); + } else { + return null; + } +} + +/** + * Method returning type of the object for which this window was created. + */ +AliasInfoWindow.prototype.getElementType = function() { + return "ALIAS"; +}; + +AliasInfoWindow.prototype.createGenomicDiv = function() { + var result = document.createElement("div"); + result.style.width = '640px'; + + var titleElement = document.createElement("h3"); + titleElement.innerHTML = "Gene variants"; + result.appendChild(titleElement); + + var contentElement = document.createElement("div"); + result.appendChild(contentElement); + + var geneticInformation = false; + var genomes = []; + var pileupSource = [ { + viz : pileup.viz.scale(), + name : 'Scale' + }, { + viz : pileup.viz.location(), + name : 'Location' + } ]; + var pileupRange = { + contig : 'chr1', + start : 3000000000, + stop : 0 + }; + + var globalGeneVariants = []; + var missingGeneVariantsData = false; + for (var i = 0; i < this.layoutAliases.length; i++) { + var data = this.layoutAliases[i]; + globalGeneVariants.push([]); + + if (data != null && !missingGeneVariantsData) { + if (data.getType() == LayoutAlias.LIGHT || data.getType() == null) { + missingGeneVariantsData = true; + } else if (data.getType() == LayoutAlias.GENETIC_VARIANT) { + var geneVariants = data.getGeneVariants(); + for (var j = 0; j < geneVariants.length; j++) { + if (!missingGeneVariantsData) { + var variant = geneVariants[j]; + + globalGeneVariants[i].push(variant); + + var genome = this.getCustomMap().getReferenceGenome( + variant.getReferenceGenomeType(), + variant.getReferenceGenomeVersion()); + + if (variant.getContig() != null) { + pileupRange.contig = variant.getContig(); + } + pileupRange.start = Math.min(pileupRange.start, variant + .getPosition()); + var length = Math.max(variant.getModifiedDna().length, variant + .getOriginalDna().length); + pileupRange.stop = Math.max(pileupRange.stop, variant.getPosition() + + length); + + if (genome != null && genome.getUrl() != null) { + if (genomes[genome.getUrl()] == null) { + + geneticInformation = true; + genomes[genome.getUrl()] = true; + pileupSource.splice(0, 0, { + viz : pileup.viz.genome(), + isReference : pileupSource.length == 2, + data : pileup.formats.twoBit({ + url : genome.getUrl() + }), + name : 'Reference ' + variant.getReferenceGenomeVersion() + }); + for (var k = 0; k < genome.getGeneMappings().length; k++) { + var mapping = genome.getGeneMappings()[k]; + pileupSource.push({ + viz : pileup.viz.genes(), + data : pileup.formats.bigBed({ + url : mapping.getUrl() + }), + name : 'Genes ' + mapping.getName() + }); + } + + } + } else { + logger.debug("Genome for " + variant.getReferenceGenomeType() + + "," + variant.getReferenceGenomeVersion() + " not loaded"); + missingGeneVariantsData = true; + } + } + } + } + } + } + if (missingGeneVariantsData) { + geneticInformation = false; + } + + if (geneticInformation) { + for (var i = 0; i < this.layoutAliases.length; i++) { + if (globalGeneVariants[i].length > 0) { + var vcfContent = this.createVcfString(globalGeneVariants[i]); + pileupSource.push({ + viz : pileup.viz.variants(), + data : pileup.formats.vcf({ + content : vcfContent + }), + name : this.layoutNames[i] + ' - Variants', + options : { + variantHeightByFrequency : true + }, + }); + } + } + + pileupRange.stop = Math.max(pileupRange.stop, pileupRange.start + 50); + + pileupRange.start--; + pileupRange.stop++; + + if (this.pileup != null) { + logger.debug("Destroy pileup"); + this.pileup.destroy(); + logger.debug("Pileup destroyed"); + } + this.pileup = pileup.create(contentElement, { + range : pileupRange, + tracks : pileupSource + }); + + return result; + } else { + return null; + } +}; + +AliasInfoWindow.prototype.createVcfString = function(geneVariants) { + var result = ""; + result += "##fileformat=VCFv4.0\n"; + result += "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"; + for (var i = 0; i < geneVariants.length; i++) { + var variant = geneVariants[i]; + var additionalInfo = ""; + if (variant.getAllelFrequency() != null) { + additionalInfo = "AF=" + variant.getAllelFrequency(); + } + var variantId = "."; + if (variant.getVariantIdentifier() != null) { + variantId = variant.getVariantIdentifier(); + } + result += variant.getContig() + "\t" + // + variant.getPosition() + "\t" + // + variantId + "\t" + // + variant.getOriginalDna() + "\t" + // + variant.getModifiedDna() + "\t" + // + "100.0\t" + // + "PASS\t" + // + additionalInfo + "\n"; + } + return result; +}; diff --git a/web/src/main/webapp/resources/js/GeneVariant.js b/web/src/main/webapp/resources/js/GeneVariant.js index 5c62e0b6caa2b2257a7c7b29c96d8bf994f34548..5500d57c928ebf0ed0934816514f9294fffb6678 100644 --- a/web/src/main/webapp/resources/js/GeneVariant.js +++ b/web/src/main/webapp/resources/js/GeneVariant.js @@ -5,6 +5,8 @@ function GeneVariant(javaObject) { this.setReferenceGenomeType(javaObject.referenceGenomeType); this.setReferenceGenomeVersion(javaObject.referenceGenomeVersion); this.setContig(javaObject.contig); + this.setAllelFrequency(javaObject.allelFrequency); + this.setVariantIdentifier(javaObject.variantIdentifier); }; GeneVariant.prototype.setPosition = function(position) { @@ -39,6 +41,22 @@ GeneVariant.prototype.getContig = function() { return this._contig; }; +GeneVariant.prototype.setAllelFrequency = function(allelFrequency) { + this._allelFrequency = allelFrequency; +}; + +GeneVariant.prototype.getAllelFrequency = function() { + return this._allelFrequency; +}; + +GeneVariant.prototype.setVariantIdentifier = function(variantIdentifier) { + this._variantIdentifier = variantIdentifier; +}; + +GeneVariant.prototype.getVariantIdentifier = function() { + return this._variantIdentifier; +}; + GeneVariant.prototype.setReferenceGenomeType = function(referenceGenomeType) { this._referenceGenomeType = referenceGenomeType; };