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