hierarchic-heatmap-table-component
Version:
A visualisation tool for displaying rows in a hiearchic manner with heatmap capabilities
275 lines (248 loc) • 12.4 kB
JavaScript
function convertNextProtDataIntoHeatMapTableFormat (experimentalContext, data) {
console.log(data);
var cvTermList = {};
var xrefDict = data['xrefs'];
$.ajax(
{
type: "get",
url: "https://api.nextprot.org/terminology/nextprot-anatomy-cv.json",
// url: "/data/nextprot-anatomy-cv.json",
async: false,
success: function (data) {
console.log("Get data.")
console.log(data);
cvTermList = data["cvTermList"]
},
error: function (msg) {
console.log(msg);
}
}
);
var termDict = {};
var queue = [];
var heatMapTableRoot = null;
var detailList = [];
for (var i = 0; i < cvTermList.length; i++) {
termDict[cvTermList[i].accession] = cvTermList[i];
if (cvTermList[i].ancestorAccession === null) {
var node = {};
node.ancestorIds = null;
node.children = [];
node.values = [{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""}];
node.detailData = [];
node.rowLabel = cvTermList[i].name;
node.id = cvTermList[i].accession;
node.linkLabel = "[" + cvTermList[i].accession + "]"
node.linkURL = "http://www.nextprot.org/db/term/" + cvTermList[i].name;
heatMapTableRoot = node;
queue.push(heatMapTableRoot);
detailList.push(node.detailData);
}
}
while (queue.length !== 0) {
var currNode = queue.shift();
var currTerm = termDict[currNode.id];
if (currTerm && currTerm.childAccession) {
for (var i = 0; i < currTerm.childAccession.length; i++) {
var childTerm = termDict[currTerm.childAccession[i]];
var childNode = {};
childNode.ancestorIds = currNode;
childNode.children = [];
childNode.values = [{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""},
{value:"", cssClass:""}];
childNode.detailData = [];
childNode.id= childTerm.accession;
childNode.rowLabel = childTerm.name;
childNode.linkLabel = "[" + childTerm.accession + "]"
childNode.linkURL = "http://www.nextprot.org/db/term/" + childTerm.name;
queue.push(childNode);
currNode.children.push(childNode);
detailList.push(childNode.detailData);
}
}
}
function updateAncestorValues(data, values) {
for (var i = 0; i < data.values.length; i++) {
if (data.values[i].value === "" || data.values[i].value === undefined) {
data.values[i].value = values[i].value;
}
}
if (data.ancestorIds) {
updateAncestorValues(data.ancestorIds, values);
}
}
var codeNameToShortName = {
"microarray RNA expression level evidence": "Microarray",
"transcript expression evidence": "EST",
"immunolocalization evidence": "IHC"
}
function createDetailWithEvidence(evidence, value) {
var detail = {};
detail['evidenceCodeName'] = codeNameToShortName[evidence.evidenceCodeName];
detail['dbSource'] = evidence.resourceDb;
detail['value'] = value;
detail['ensemblLink'] = xrefDict[evidence.resourceId].resolvedUrl.replace(/amp;/g, "");
//setting ensembl
if (evidence.antibodies) {
detail['ensembl'] = evidence.antibodies;
} else {
detail['ensembl'] = evidence.resourceAccession.slice(evidence.resourceAccession.indexOf("gene_id=")+8);
if (detail['ensembl'].indexOf("&") !== -1) {
detail['ensembl'] = detail['ensembl'].substring(0, detail['ensembl'].indexOf("&"));
}
}
if (evidence.qualityQualifier === "SILVER") {
detail['qualityQualifier'] = evidence.qualityQualifier;
}
if (experimentalContext[evidence.experimentalContextId]) {
if (evidence.expressionLevel === "negative") {
detail['description'] = "Expression not detected at " + experimentalContext[evidence.experimentalContextId];
} else {
detail['description'] = "Expression " + evidence.expressionLevel + " at " + experimentalContext[evidence.experimentalContextId];
}
} else {
if (evidence.expressionLevel === "negative") {
detail['description'] = "Expression not detected";
} else {
detail['description'] = "Expression " + evidence.expressionLevel
}
}
return detail;
}
function addAnnotToHeatMapTable(data, annot) {
if (data.id === annot.cvTermAccessionCode) {
for(var i = 0; i < annot.evidences.length; i++) {
var evidence = annot.evidences[i]; //There might be more than one evidence for each "statement", this should be reflected on the heatMapTable table as well
var detail = {};
if (evidence.evidenceCodeName === "microarray RNA expression level evidence" && evidence.expressionLevel === "positive") {
data.values[0]['value'] = 'Positive';
data.values[0]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[0].value);
} else if ((evidence.evidenceCodeName === "microarray RNA expression level evidence" && evidence.expressionLevel === "not detected")
|| (evidence.evidenceCodeName === "microarray RNA expression level evidence" && evidence.expressionLevel === "negative" && evidence.negativeEvidence === true)) {
data.values[1]['value'] = 'NotDetected';
data.values[1]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[1].value);
} else if (evidence.evidenceCodeName === "transcript expression evidence" && evidence.expressionLevel === "positive") {
// data.values[2] = "Positive";
data.values[2]['value'] = 'Positive';
data.values[2]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[2].value);
} else if (evidence.evidenceCodeName === "immunolocalization evidence" && evidence.expressionLevel === "high") {
// data.values[3] = "High";
// data.valuesCssClass[3] = "bold";
data.values[3]['value'] = 'High';
data.values[3]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[3].value);
} else if (evidence.evidenceCodeName === "immunolocalization evidence" && evidence.expressionLevel === "medium") {
// data.values[4] = "Medium";
// data.valuesCssClass[4] = "bold";
data.values[4]['value'] = 'Medium';
data.values[4]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[4].value);
} else if (evidence.evidenceCodeName === "immunolocalization evidence" && evidence.expressionLevel === "low") {
// data.values[5] = "Low";
data.values[5]['value'] = 'Low';
data.values[5]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[5].value);
} else if (evidence.evidenceCodeName === "immunolocalization evidence" && evidence.expressionLevel === "not detected") {
// data.values[6] = "NotDetected";
data.values[6]['value'] = 'NotDetected';
data.values[6]['cssClass'] = "bold";
detail = createDetailWithEvidence(evidence, data.values[6].value);
detail['description'] = "Expression not detected";
}
data.detailData.push(detail);
}
if (data.ancestorIds) {
updateAncestorValues(data.ancestorIds, data.values);
}
}
for (var i = 0; i < data.children.length; i++) {
addAnnotToHeatMapTable(data.children[i], annot);
}
}
for(var i = 0; i < data.annot.length; i++) {
var annot = data.annot[i];
addAnnotToHeatMapTable(heatMapTableRoot, annot);
}
var rowLabelsToheatMapTable = {
"Alimentary system": "alimentary-system",
"Cardiovascular system": "cardiovascular-system",
"Dermal system": "dermal-system",
"Endocrine system": "endocrine-system",
"Exocrine system": "exocrine-system",
"Hemolymphoid and immune system": "hemolymphoid-and-immune-system",
"Musculoskeletal system": "musculoskeletal-system",
"Nervous system": "nervous-system",
"Reproductive system": "reproductive-system",
"Respiratory system": "respiratory-system",
"Urinary system": "urinary-system",
"Sense organ": "sense-organ",
"Body part": "body-part",
"Tissue": "tissue",
"Cell type": "cell-type",
"Fluid and secretion": "fluid-and-secretion",
"Gestational structure": "gestational-structure"
}
var heatmapData = [];
function findHeatMapData(data, step) {
if (step > 2) return;
if (rowLabelsToheatMapTable[data.rowLabel]) {
heatmapData.push(data);
}
for (var i = 0; i < data.children.length; i++) {
findHeatMapData(data.children[i], step+1);
}
}
findHeatMapData(heatMapTableRoot, 0);
heatmapData.sort(function(a, b) {
if (a.rowLabel.indexOf("system") !== -1 && b.rowLabel.indexOf("system") === -1 ) return -1;
if (a.rowLabel.indexOf("system") === -1 && b.rowLabel.indexOf("system") !== -1 ) return 1;
if (a.rowLabel < b.rowLabel) return -1;
if (a.rowLabel > b.rowLabel) return 1;
return 0;
});
function sortDetail(detailList) {
var levelPriorityDict = {
"High": 5,
"Medium": 4,
"Low": 3,
"Positive": 2,
"NotDetected": 1
}
var codePriorityDict = {
"Microarray": 3,
"EST": 2,
"IHC": 1
}
for (var i = 0; i < detailList.length; i++) {
if (detailList[i].length > 0) {
detailList[i].sort(function(a, b) {
if (levelPriorityDict[a.value] === levelPriorityDict[b.value]) {
if (codePriorityDict[a.evidenceCodeName] === codePriorityDict[b.evidenceCodeName]) return 0;
if (codePriorityDict[a.evidenceCodeName] < codePriorityDict[b.evidenceCodeName]) return -1;
if (codePriorityDict[a.evidenceCodeName] > codePriorityDict[b.evidenceCodeName]) return 1;
} else if (levelPriorityDict[a.value] < levelPriorityDict[b.value]) {
return 1;
} else if (levelPriorityDict[a.value] > levelPriorityDict[b.value]) {
return -1;
}
});
}
}
}
sortDetail(detailList);
return heatmapData;
}