Commit f46ea7be authored by Joshua Gould's avatar Joshua Gould

inline tooltips, maf summary

parent a620bde9
This source diff could not be displayed because it is too large. You can view the blob instead.
morpheus.MafFileReader = function() { morpheus.MafFileReader = function () {
this.geneFilter = null; this.geneFilter = null;
}; };
morpheus.MafFileReader.summarizeMutations = function(dataset) { morpheus.MafFileReader.summarizeMutations = function (dataset) {
var v = dataset.getRowMetadata().add('mutation_summary'); var vector = dataset.getRowMetadata().add('mutation_summary');
v.getProperties().set( vector.getProperties().set(
morpheus.VectorKeys.FIELDS, morpheus.VectorKeys.FIELDS,
[ 'Synonymous', 'In Frame Indel', 'Other Non-Synonymous', ['Synonymous', 'In Frame Indel', 'Other Non-Synonymous',
'Missense', 'Splice Site', 'Frame Shift', 'Nonsense' ]); 'Missense', 'Splice Site', 'Frame Shift', 'Nonsense']);
v.getProperties().set(morpheus.VectorKeys.DATA_TYPE, '[number]'); vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE, '[number]');
v.getProperties().set(morpheus.VectorKeys.RECOMPUTE_FUNCTION, true);
v.getProperties().set(morpheus.VectorKeys.FUNCTION, function(view) { // v.getProperties().set(morpheus.VectorKeys.RECOMPUTE_FUNCTION, true);
var bins = new Int8Array(7); // 1-7 // v.getProperties().set(morpheus.VectorKeys.FUNCTION, function (view) {
for (var i = 0, size = view.size(); i < size; i++) { // var bins = new Int32Array(7); // 1-7
var value = view.getValue(i); // for (var i = 0, size = view.size(); i < size; i++) {
// var value = view.getValue(i);
// if (value > 0) {
// bins[value - 1]++;
// }
// }
// return bins;
// });
// computing dynamically screws things up b/c summary is computed for other data types (e.g. CN)
for (var i = 0, nrows = dataset.getRowCount(); i < nrows; i++) {
var bins = new Int32Array(7); // 1-7
for (var j = 0, ncols = dataset.getColumnCount(); j < ncols; j++) {
var value = dataset.getValue(i, j);
if (value > 0) { if (value > 0) {
bins[value - 1]++; bins[value - 1]++;
} }
} }
return bins; vector.setValue(i, bins);
}); }
}; };
morpheus.MafFileReader.getField = function(fieldNames, fieldNameToIndex, morpheus.MafFileReader.getField = function (fieldNames, fieldNameToIndex,
options) { options) {
options = $.extend({}, { options = $.extend({}, {
remove : true, remove: true,
lc : false lc: false
}, options); }, options);
var name; var name;
var index; var index;
...@@ -53,8 +64,8 @@ morpheus.MafFileReader.getField = function(fieldNames, fieldNameToIndex, ...@@ -53,8 +64,8 @@ morpheus.MafFileReader.getField = function(fieldNames, fieldNameToIndex,
} }
if (index !== undefined) { if (index !== undefined) {
return { return {
name : name, name: name,
index : index index: index
}; };
} }
}; };
...@@ -87,13 +98,13 @@ morpheus.MafFileReader.VARIANT_MAP.set('Frame_Shift_Ins', 6); ...@@ -87,13 +98,13 @@ morpheus.MafFileReader.VARIANT_MAP.set('Frame_Shift_Ins', 6);
// non-sense // non-sense
morpheus.MafFileReader.VARIANT_MAP.set('Nonsense_Mutation', 7); morpheus.MafFileReader.VARIANT_MAP.set('Nonsense_Mutation', 7);
morpheus.MafFileReader.prototype = { morpheus.MafFileReader.prototype = {
setGeneFilter : function(geneFilter) { setGeneFilter: function (geneFilter) {
this.geneFilter = geneFilter; this.geneFilter = geneFilter;
}, },
getFormatName : function() { getFormatName: function () {
return 'maf'; return 'maf';
}, },
_getGeneLevelDataset : function(datasetName, reader) { _getGeneLevelDataset: function (datasetName, reader) {
var _this = this; var _this = this;
var tab = /\t/; var tab = /\t/;
var header = reader.readLine().split(tab); var header = reader.readLine().split(tab);
...@@ -105,11 +116,11 @@ morpheus.MafFileReader.prototype = { ...@@ -105,11 +116,11 @@ morpheus.MafFileReader.prototype = {
// TODO six classes of base substitution—C>A, C>G, C>T, T>A, T>C, T>G // TODO six classes of base substitution—C>A, C>G, C>T, T>A, T>C, T>G
// (all substitutions are referred to by the pyrimidine of the mutated // (all substitutions are referred to by the pyrimidine of the mutated
// Watson–Crick base pair) // Watson–Crick base pair)
var fields = [ 'Hugo_Symbol', 'Chromosome', 'Start_position', var fields = ['Hugo_Symbol', 'Chromosome', 'Start_position',
'Reference_Allele', 'Tumor_Seq_Allele2', 'Reference_Allele', 'Tumor_Seq_Allele2',
'Variant_Classification', 'Protein_Change', 'ccf_hat', 'Variant_Classification', 'Protein_Change', 'ccf_hat',
'tumor_f', 'i_tumor_f', 'Tumor_Sample_Barcode', 'tumor_name', 'tumor_f', 'i_tumor_f', 'Tumor_Sample_Barcode', 'tumor_name',
'Tumor_Sample_UUID' ]; 'Tumor_Sample_UUID'];
var fieldNameToIndex = {}; var fieldNameToIndex = {};
for (var i = 0, length = fields.length; i < length; i++) { for (var i = 0, length = fields.length; i < length; i++) {
...@@ -119,17 +130,17 @@ morpheus.MafFileReader.prototype = { ...@@ -119,17 +130,17 @@ morpheus.MafFileReader.prototype = {
} }
} }
var sampleField = morpheus.MafFileReader.getField([ var sampleField = morpheus.MafFileReader.getField([
'Tumor_Sample_Barcode', 'tumor_name', 'Tumor_Sample_UUID' ], 'Tumor_Sample_Barcode', 'tumor_name', 'Tumor_Sample_UUID'],
fieldNameToIndex, { fieldNameToIndex, {
lc : true, lc: true,
remove : true remove: true
}); });
var sampleColumnName = sampleField.name; var sampleColumnName = sampleField.name;
var sampleIdColumnIndex = sampleField.index; var sampleIdColumnIndex = sampleField.index;
var tumorFractionField = morpheus.MafFileReader.getField([ 'ccf_hat', var tumorFractionField = morpheus.MafFileReader.getField(['ccf_hat',
'tumor_f', 'i_tumor_f' ], fieldNameToIndex, { 'tumor_f', 'i_tumor_f'], fieldNameToIndex, {
lc : true, lc: true,
remove : true remove: true
}); });
var ccfColumnName; var ccfColumnName;
var ccfColumnIndex; var ccfColumnIndex;
...@@ -139,28 +150,28 @@ morpheus.MafFileReader.prototype = { ...@@ -139,28 +150,28 @@ morpheus.MafFileReader.prototype = {
} }
var chromosomeColumn = fieldNameToIndex['Chromosome'.toLowerCase()]; var chromosomeColumn = fieldNameToIndex['Chromosome'.toLowerCase()];
var startPositionColumn = fieldNameToIndex['Start_position' var startPositionColumn = fieldNameToIndex['Start_position'
.toLowerCase()]; .toLowerCase()];
var refAlleleColumn = fieldNameToIndex['Reference_Allele'.toLowerCase()]; var refAlleleColumn = fieldNameToIndex['Reference_Allele'.toLowerCase()];
var tumorAllelColumn = fieldNameToIndex['Tumor_Seq_Allele2' var tumorAllelColumn = fieldNameToIndex['Tumor_Seq_Allele2'
.toLowerCase()]; .toLowerCase()];
var proteinChangeColumn = fieldNameToIndex['Protein_Change' var proteinChangeColumn = fieldNameToIndex['Protein_Change'
.toLowerCase()]; .toLowerCase()];
var geneSymbolColumn = fieldNameToIndex['Hugo_Symbol'.toLowerCase()]; var geneSymbolColumn = fieldNameToIndex['Hugo_Symbol'.toLowerCase()];
var variantColumnIndex = headerToIndex['Variant_Classification' var variantColumnIndex = headerToIndex['Variant_Classification'
.toLowerCase()]; .toLowerCase()];
if (variantColumnIndex === undefined) { if (variantColumnIndex === undefined) {
throw new Error('Variant_Classification not found'); throw new Error('Variant_Classification not found');
} }
// keep fields that are in file only // keep fields that are in file only
fields = []; fields = [];
var geneFields = []; var geneFields = [];
for ( var key in fieldNameToIndex) { for (var key in fieldNameToIndex) {
if (key !== sampleColumnName && key !== ccfColumnName) { if (key !== sampleColumnName && key !== ccfColumnName) {
geneFields.push(key); geneFields.push(key);
} }
fields.push(key); fields.push(key);
} }
var geneColumnIndices = geneFields.map(function(field) { var geneColumnIndices = geneFields.map(function (field) {
return fieldNameToIndex[field]; return fieldNameToIndex[field];
}); });
var nGeneFields = geneColumnIndices.length; var nGeneFields = geneColumnIndices.length;
...@@ -182,7 +193,7 @@ morpheus.MafFileReader.prototype = { ...@@ -182,7 +193,7 @@ morpheus.MafFileReader.prototype = {
continue; continue;
} }
if (this.geneFilter == null if (this.geneFilter == null
|| this.geneFilter.has(tokens[geneSymbolColumn])) { || this.geneFilter.has(tokens[geneSymbolColumn])) {
var rowIndex = geneSymbolToIndex.get(gene); var rowIndex = geneSymbolToIndex.get(gene);
if (rowIndex === undefined) { if (rowIndex === undefined) {
rowIndex = geneSymbolToIndex.size(); rowIndex = geneSymbolToIndex.size();
...@@ -201,11 +212,11 @@ morpheus.MafFileReader.prototype = { ...@@ -201,11 +212,11 @@ morpheus.MafFileReader.prototype = {
variantObject.__v = variantCode; variantObject.__v = variantCode;
variantObject.Variant = value; variantObject.Variant = value;
variantObject.Mutation = String(tokens[chromosomeColumn]) + ':' variantObject.Mutation = String(tokens[chromosomeColumn]) + ':'
+ String(tokens[startPositionColumn]) + ' ' + String(tokens[startPositionColumn]) + ' '
+ String(tokens[refAlleleColumn]) + ' > ' + String(tokens[refAlleleColumn]) + ' > '
+ String(tokens[tumorAllelColumn]); + String(tokens[tumorAllelColumn]);
var wrappedVariant = morpheus.Util.wrapNumber(variantCode, var wrappedVariant = morpheus.Util.wrapNumber(variantCode,
variantObject); variantObject);
var variantRow = variantMatrix[rowIndex]; var variantRow = variantMatrix[rowIndex];
if (variantRow === undefined) { if (variantRow === undefined) {
variantRow = []; variantRow = [];
...@@ -235,22 +246,22 @@ morpheus.MafFileReader.prototype = { ...@@ -235,22 +246,22 @@ morpheus.MafFileReader.prototype = {
} }
} }
var dataset = new morpheus.Dataset({ var dataset = new morpheus.Dataset({
name : datasetName, name: datasetName,
array : variantMatrix, array: variantMatrix,
dataType : 'object', dataType: 'object',
rows : geneSymbolToIndex.size(), rows: geneSymbolToIndex.size(),
columns : sampleIdToIndex.size() columns: sampleIdToIndex.size()
}); });
var columnIds = dataset.getColumnMetadata().add('id'); var columnIds = dataset.getColumnMetadata().add('id');
sampleIdToIndex.forEach(function(index, id) { sampleIdToIndex.forEach(function (index, id) {
columnIds.setValue(index, id); columnIds.setValue(index, id);
}); });
var rowIds = dataset.getRowMetadata().add('id'); var rowIds = dataset.getRowMetadata().add('id');
geneSymbolToIndex.forEach(function(index, id) { geneSymbolToIndex.forEach(function (index, id) {
rowIds.setValue(index, id); rowIds.setValue(index, id);
}); });
for (var i = 0, nrows = dataset.getRowCount(), ncols = dataset for (var i = 0, nrows = dataset.getRowCount(), ncols = dataset
.getColumnCount(); i < nrows; i++) { .getColumnCount(); i < nrows; i++) {
for (var j = 0; j < ncols; j++) { for (var j = 0; j < ncols; j++) {
if (variantMatrix[i][j] === undefined) { if (variantMatrix[i][j] === undefined) {
variantMatrix[i][j] = 0; variantMatrix[i][j] = 0;
...@@ -259,9 +270,9 @@ morpheus.MafFileReader.prototype = { ...@@ -259,9 +270,9 @@ morpheus.MafFileReader.prototype = {
} }
if (ccfColumnIndex !== undefined) { if (ccfColumnIndex !== undefined) {
dataset.addSeries({ dataset.addSeries({
dataType : 'object', dataType: 'object',
name : 'allelic_fraction', name: 'allelic_fraction',
array : ccfMatrix array: ccfMatrix
}); });
} }
if (this.geneFilter) { if (this.geneFilter) {
...@@ -272,58 +283,58 @@ morpheus.MafFileReader.prototype = { ...@@ -272,58 +283,58 @@ morpheus.MafFileReader.prototype = {
orderVector.setValue(i, order); orderVector.setValue(i, order);
} }
var project = new morpheus.Project(dataset); var project = new morpheus.Project(dataset);
project.setRowSortKeys([ new morpheus.SortKey('order', project.setRowSortKeys([new morpheus.SortKey('order',
morpheus.SortKey.SortOrder.ASCENDING) ], true); // sort morpheus.SortKey.SortOrder.ASCENDING)], true); // sort
// collapsed // collapsed
// dataset // dataset
var tmp = project.getSortedFilteredDataset(); var tmp = project.getSortedFilteredDataset();
project = new morpheus.Project(tmp); project = new morpheus.Project(tmp);
var columnIndices = morpheus.Util.seq(tmp.getColumnCount()); var columnIndices = morpheus.Util.seq(tmp.getColumnCount());
columnIndices columnIndices
.sort(function(a, b) { .sort(function (a, b) {
for (var i = 0, nrows = tmp.getRowCount(); i < nrows; i++) { for (var i = 0, nrows = tmp.getRowCount(); i < nrows; i++) {
for (var seriesIndex = 0, nseries = tmp for (var seriesIndex = 0, nseries = tmp
.getSeriesCount(); seriesIndex < nseries; seriesIndex++) { .getSeriesCount(); seriesIndex < nseries; seriesIndex++) {
var f1 = tmp.getValue(i, a, seriesIndex); var f1 = tmp.getValue(i, a, seriesIndex);
if (isNaN(f1)) { if (isNaN(f1)) {
f1 = Number.NEGATIVE_INFINITY; f1 = Number.NEGATIVE_INFINITY;
} }
f1 = f1.valueOf(); f1 = f1.valueOf();
var f2 = tmp.getValue(i, b, seriesIndex); var f2 = tmp.getValue(i, b, seriesIndex);
if (isNaN(f2)) { if (isNaN(f2)) {
f2 = Number.NEGATIVE_INFINITY; f2 = Number.NEGATIVE_INFINITY;
}
f2 = f2.valueOf();
var returnVal = (f1 === f2 ? 0 : (f1 < f2 ? 1
: -1));
if (returnVal !== 0) {
return returnVal;
}
}
} }
return 0; f2 = f2.valueOf();
}); var returnVal = (f1 === f2 ? 0 : (f1 < f2 ? 1
: -1));
if (returnVal !== 0) {
return returnVal;
}
}
}
return 0;
});
dataset = new morpheus.SlicedDatasetView(dataset, null, dataset = new morpheus.SlicedDatasetView(dataset, null,
columnIndices); columnIndices);
} }
morpheus.MafFileReader.summarizeMutations(dataset); morpheus.MafFileReader.summarizeMutations(dataset);
morpheus.MafFileReader morpheus.MafFileReader
.summarizeMutations(new morpheus.TransposedDatasetView(dataset)); .summarizeMutations(new morpheus.TransposedDatasetView(dataset));
return dataset; return dataset;
}, },
read : function(fileOrUrl, callback) { read: function (fileOrUrl, callback) {
var _this = this; var _this = this;
var name = morpheus.Util.getBaseFileName(morpheus.Util var name = morpheus.Util.getBaseFileName(morpheus.Util
.getFileName(fileOrUrl)); .getFileName(fileOrUrl));
morpheus.BufferedReader.getArrayBuffer(fileOrUrl, function(err, morpheus.BufferedReader.getArrayBuffer(fileOrUrl, function (err,
arrayBuffer) { arrayBuffer) {
if (err) { if (err) {
callback(err); callback(err);
} else { } else {
try { try {
callback(null, _this._getGeneLevelDataset(name, callback(null, _this._getGeneLevelDataset(name,
new morpheus.BufferedReader(new Uint8Array( new morpheus.BufferedReader(new Uint8Array(
arrayBuffer)))); arrayBuffer))));
} catch (err) { } catch (err) {
callback(err); callback(err);
} }
......
...@@ -376,7 +376,7 @@ morpheus.SampleDatasets.prototype = { ...@@ -376,7 +376,7 @@ morpheus.SampleDatasets.prototype = {
}], }],
columns: [{ columns: [{
field: 'id', field: 'id',
display: 'text' display: 'text,tooltip'
}, { }, {
field: 'mutation_summary', field: 'mutation_summary',
display: 'stacked_bar' display: 'stacked_bar'
......
...@@ -33,36 +33,22 @@ morpheus.HeatMapTooltipProvider = function (heatMap, rowIndex, columnIndex, ...@@ -33,36 +33,22 @@ morpheus.HeatMapTooltipProvider = function (heatMap, rowIndex, columnIndex,
var quickRowTracks = heatMap.rowTracks.filter(function (t) { var quickRowTracks = heatMap.rowTracks.filter(function (t) {
return t.settings.inlineTooltip; return t.settings.inlineTooltip;
}); });
morpheus.HeatMapTooltipProvider._tracksToString(options, morpheus.HeatMapTooltipProvider._tracksToString(quickRowTracks, dataset.getRowMetadata(), rowIndex, tipText, separator);
quickRowTracks, dataset.getRowMetadata(), rowIndex, morpheus.HeatMapTooltipProvider._tracksToString(heatMap.columnTracks.filter(function (t) {
tipText, separator); return t.settings.inlineTooltip;
}), dataset.getColumnMetadata(), columnIndex, tipText, separator);
// if (quickRowTracks.length > 0) {
// tipText
// .push('<div
// style="height:1px;background-color:LightGrey;"></div>');
// }
morpheus.HeatMapTooltipProvider._tracksToString(options,
heatMap.columnTracks.filter(function (t) {
return t.settings.inlineTooltip;
}), dataset.getColumnMetadata(), columnIndex, tipText,
separator);
} }
} else if (quick) { } else if (quick) {
if (rowIndex !== -1) { if (rowIndex !== -1) {
morpheus.HeatMapTooltipProvider._tracksToString(options, morpheus.HeatMapTooltipProvider._tracksToString(heatMap.rowTracks.filter(function (t) {
heatMap.rowTracks.filter(function (t) { return t.settings.inlineTooltip && options.name !== t.getName();
return t.settings.inlineTooltip; }), dataset.getRowMetadata(), rowIndex, tipText, separator);
}), dataset.getRowMetadata(), rowIndex, tipText,
separator);
} }
if (columnIndex !== -1) { if (columnIndex !== -1) {
morpheus.HeatMapTooltipProvider._tracksToString(options, morpheus.HeatMapTooltipProvider._tracksToString(heatMap.columnTracks.filter(function (t) {
heatMap.columnTracks.filter(function (t) { return t.settings.inlineTooltip && options.name !== t.getName();
return t.settings.inlineTooltip; }), dataset.getColumnMetadata(), columnIndex, tipText, separator);
}), dataset.getColumnMetadata(), columnIndex, tipText,
separator);
} }
} }
...@@ -286,7 +272,7 @@ morpheus.HeatMapTooltipProvider.vectorToString = function (vector, index, ...@@ -286,7 +272,7 @@ morpheus.HeatMapTooltipProvider.vectorToString = function (vector, index,
} }
} }
}; };
morpheus.HeatMapTooltipProvider._tracksToString = function (options, tracks, metadata, index, tipText, separator) { morpheus.HeatMapTooltipProvider._tracksToString = function (tracks, metadata, index, tipText, separator) {
for (var i = 0; i < tracks.length; i++) { for (var i = 0; i < tracks.length; i++) {
morpheus.HeatMapTooltipProvider.vectorToString(metadata.getByName(tracks[i].name), index, tipText, morpheus.HeatMapTooltipProvider.vectorToString(metadata.getByName(tracks[i].name), index, tipText,
separator); separator);
...@@ -299,7 +285,7 @@ morpheus.HeatMapTooltipProvider._metadataToString = function (options, tracks, ...@@ -299,7 +285,7 @@ morpheus.HeatMapTooltipProvider._metadataToString = function (options, tracks,
for (var i = 0, ntracks = tracks.length; i < ntracks; i++) { for (var i = 0, ntracks = tracks.length; i < ntracks; i++) {
var track = tracks[i]; var track = tracks[i];
if ((track.isVisible() && track.isShowTooltip())) { if ((track.isVisible() && track.isShowTooltip())) {
if (tracks[i].name === options.name) { if (tracks[i].name === options.name) { // show the vector that we're mousing over 1st
filtered.splice(0, 0, track); filtered.splice(0, 0, track);
} else { } else {
filtered.push(track); filtered.push(track);
...@@ -307,9 +293,7 @@ morpheus.HeatMapTooltipProvider._metadataToString = function (options, tracks, ...@@ -307,9 +293,7 @@ morpheus.HeatMapTooltipProvider._metadataToString = function (options, tracks,
} }
} }
// show the vector that we're mousing over 1st morpheus.HeatMapTooltipProvider._tracksToString(filtered, metadata, index, tipText, separator);
morpheus.HeatMapTooltipProvider._tracksToString(options, filtered,
metadata, index, tipText, separator);
}; };
morpheus.HeatMapTooltipProvider._nodesToString = function (tipText, nodes, morpheus.HeatMapTooltipProvider._nodesToString = function (tipText, nodes,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment