UNPKG

cttv.genome

Version:

Lightweight genome browser for CTTV targets based on TnT Genome

268 lines (235 loc) 8.95 kB
var tnt_tooltip = require("tnt.tooltip"); var apijs = require("tnt.api"); var tooltips = function () { var conf = { cttvRestApi : undefined, ensemblRestApi : undefined, prefix : undefined, view : undefined }; var id = 1; var target; var m = {}; var api = apijs(m) .getset(conf); var snp_data = function (data, ensembl_data) { var obj = {}; obj.header = data.name; obj.rows = []; if (ensembl_data) { obj.rows.push({ "label" : "Ancestral allele", "value" : ensembl_data.ancestral_allele }); obj.rows.push({ "label" : "Allele string", "value" : ensembl_data.mappings[0].allele_string }); obj.rows.push({ "label" : "Most severe consequence", "value" : ensembl_data.most_severe_consequence }); if (ensembl_data.MAF) { obj.rows.push({ "label" : "MAF", "value" : ensembl_data.MAF }); } obj.rows.push({ "label" : "Location", "link" : function (d) { conf.view.start({ from : d.pos - 50, to : d.pos + 50 }); }, obj : data, value : "Jump to sequence" }); obj.rows.push({ "label": "target", "value": data.target.symbol }); } if (data.associations && data.associations.length) { obj.rows.push({ "label" : "Associations", "value" : "" }); for (var i=0; i<data.associations.length; i++) { var association = data.associations[i]; obj.rows.push({ "label" : "<a href=" + conf.prefix + "/evidence/" + data.target.geneid + "/" + (association.efo.split("/").pop()) + ">" + association.label + "</a>", "value" : association.pmids.length + (association.pmids.length === 1 ? " article" : " articles") + " <a href='http://europepmc.org/search?query=" + association.pmids.map(function (d) {return "EXT_ID:"+d;}).join("%20OR%20") + "' target=_blank <i class='fa fa-newspaper-o fa-lg'></i></a>" }); } } if (data.study && data.study.length) { obj.rows.push({ "label" : "Associations", "value" : "" }); for (var i=0; i<data.study.length; i++) { obj.rows.push({ "label" : "<a href='" + conf.prefix + "/evidence/" + data.target.geneid + "/"+ (data.study[i].efo.split("/").pop()) + "'>" + data.study[i].efo_label + '</a>', "value" : parseFloat(data.study[i].pvalue).toPrecision(1) + " <a target=_blank href='http://europepmc.org/abstract/med/" + (data.study[i].pmid.split("/").pop()) + "'><i class='fa fa-newspaper-o fa-lg'></i></a>" }); } } return obj; }; // Tooltip on GWAS api.method('snp', function (data) { var t = tnt.tooltip.table() .width(250) .id(data.name); var event = d3.event; var elem = this; var spinner = tnt.tooltip.plain() .id(data.name); var url = conf.ensemblRestApi.url() .endpoint("/variation/:species") .parameters({ species: "human" }); // var url = conf.ensemblRestApi.url.variation({ // species : "human" // }); conf.ensemblRestApi.call (url, { "ids" : [data.name] }) .catch (function () { console.log("NO VARIANT INFORMATION FOR THIS SNP"); }) .then (function (resp) { var obj = snp_data (data, resp.body[data.name]); t.call (elem, obj, event); }); spinner.call (elem, { header : data.name, body : "<i class='fa fa-spinner fa-2x fa-spin'></i>" }); }); // Tooltip on genes api.method('gene', function (gene) { // Gene tooltip data var tooltip_obj = function (ensemblData, cttvData, transcriptData) { var obj = {}; obj.header = (ensemblData.display_name || ensemblData.external_name) + " (" + ensemblData.id + ")"; obj.rows = []; // Associations and target links maybe var associationsValue; var targetValue; if (cttvData && cttvData.data && cttvData.data.length > 0) { associationsValue = "<a href='" + conf.prefix + "/target/" + ensemblData.id + "/associations'>" + (cttvData.data.length) + " disease associations</a> "; targetValue = "<a href='" + conf.prefix + "/target/" + ensemblData.id + "'>View Open Targets profile</a>"; } obj.rows.push ({ "label" : "Gene", "value" : "" }); obj.rows.push( { "label" : "Biotype", "value" : ensemblData.biotype }); obj.rows.push({ "label" : "Location", "value" : "<a target='_blank' href='http://www.ensembl.org/Homo_sapiens/Location/View?db=core;g=" + ensemblData.id + "'>" + ensemblData.seq_region_name + ":" + ensemblData.start + "-" + ensemblData.end + "</a>" }); if (associationsValue !== undefined) { obj.rows.push({ "label" : "Associations", "value" : associationsValue }); } if (targetValue !== undefined) { obj.rows.push({ "label" : "Profile", "value" : targetValue }); } obj.rows.push( { "label" : "Description", "value" : ensemblData.description }); if (transcriptData) { obj.rows.push({ "label" : "Transcript", "value" : "" }); obj.rows.push({ "label" : "Name", "value" : transcriptData.display_name }); obj.rows.push({ "label" : "ID", "value" : "<a target='_blank' href='http://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=" + transcriptData.id + "'>" + transcriptData.id + "</a>" }); obj.rows.push({ "label" : "biotype", "value" : transcriptData.biotype }); } return obj; }; var id = (gene.isGene ? gene.id : gene.gene.id); var t = tnt_tooltip.table() .id(id); var event = d3.event; var elem = this; var s = tnt_tooltip.plain() .id(id); var url = conf.cttvRestApi.url.associations ({ "target" : (gene.isGene ? gene.id : gene.gene.id), // "datastructure" : "flat", "filterbyscorevalue_min": 0, "stringency": 1, "size": 10000, "direct": true }); conf.cttvRestApi.call(url) .catch (function (x) { var obj = tooltip_obj(gene); t.call(elem, obj, event); }) .then(function (resp) { var obj; if (gene.isGene) { obj = tooltip_obj (gene, resp.body); } else { obj = tooltip_obj (gene.gene, resp.body, gene); // gene is a transcript } // var obj = tooltip_obj (gene, resp.body); t.call(elem, obj, event); }); s.call(elem, { header : (gene.isGene? gene.external_name + " (" + gene.gene_id + ")" : gene.gene.display_name + "(" + gene.gene.id + ")"), body : "<i class='fa fa-spinner fa-2x fa-spin'></i>" }); }); // m.ensemblRestApi = function (api) { // if (!arguments.length) { // return ensemblRestApi; // } // ensemblRestApi = api; // return this; // }; // // m.cttvRestApi = function (api) { // if (!arguments.length) { // return cttvRestApi; // } // cttvRestApi = api; // return this; // }; // // m.view = function (v) { // if (!arguments.length) { // return view; // } // view = v; // return this; // }; return m; }; module.exports = exports = tooltips;