ucsc-xena-client
Version:
UCSC Xena Client. Functional genomics visualizations.
163 lines (139 loc) • 6.1 kB
JavaScript
;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
var _ = require('../underscore_ext');
var xenaQuery = require('../xenaQuery');
var Rx = require('../rx');
// Hard-coded expression dataset
var expressionHost = 'https://toil.xenahubs.net';
var subtypeDataset = 'TCGA_GTEX_category.txt';
var subtypeField = 'TCGA_GTEX_main_category';
/*
//basic gencode annotataion
var transcriptDataset = {
host: 'https://reference.xenahubs.net',
name: 'wgEncodeGencodeBasicV23'
};
*/
// comprehensive gencode annotataion -- TOIL run was using the v23 comprehensive gencode annotataion
var transcriptDataset = {
host: 'https://reference.xenahubs.net',
name: 'wgEncodeGencodeCompV23'
};
var expressionDataset = {
tpm: "TcgaTargetGtex_rsem_isoform_tpm",
isoformPercentage: "TcgaTargetGtex_rsem_isopct"
};
var identity = function identity(x) {
return x;
};
var prefix = 4; // "TCGA", "GTEX"
// The transcriptExpression query is a bit wonky, because we're pulling the subtypes from TCGA_GTEX_main_category,
// but in transcriptExpression we filter on _sample_type. This assumes the two are kept in sync. It would be
// better to use the same field in both places, but first we need to confirm that it will work.
var fetchExpression = function fetchExpression(transcripts, _ref) {
var studyA = _ref.studyA,
subtypeA = _ref.subtypeA,
studyB = _ref.studyB,
subtypeB = _ref.subtypeB,
unit = _ref.unit;
return xenaQuery.transcriptExpression(expressionHost,
// adding 1 for the space after the prefix
_.pluck(transcripts, 'name'), studyA, subtypeA.slice(prefix + 1), studyB, subtypeB.slice(prefix + 1), expressionDataset[unit]).map(function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 2),
expsA = _ref3[0],
expsB = _ref3[1];
return _.mmap(expsA, expsB, transcripts, function (expA, expB, transcript) {
return _.assoc(transcript, 'expA', expA, 'expB', expB);
});
});
};
function fetchTranscripts(serverBus, params) {
var host = transcriptDataset.host,
name = transcriptDataset.name,
query = Rx.Observable.zip(xenaQuery.geneTranscripts(host, name, params.gene).flatMap(function (transcripts) {
return fetchExpression(transcripts, params);
}), xenaQuery.datasetMetadata(expressionHost, expressionDataset[params.unit]), function (transcripts, _ref4) {
var _ref5 = _slicedToArray(_ref4, 1),
meta = _ref5[0];
return { transcripts: transcripts, unit: meta.unit };
});
serverBus.next(['geneTranscripts', query]);
}
function filterSubtypes(subtypes) {
var study = _.groupBy(subtypes[subtypeField], function (subtype) {
return subtype.slice(0, prefix);
});
return {
tcga: study.TCGA,
gtex: study.GTEX
};
}
function fetchSubtypes(serverBus) {
serverBus.next(['transcriptSampleSubtypes', xenaQuery.fieldCodes(expressionHost, subtypeDataset, [subtypeField]).map(filterSubtypes)]);
}
var controls = {
'init-post!': function initPost(serverBus, state, newState) {
var _ref6 = newState.transcripts || {},
gene = _ref6.gene,
studyA = _ref6.studyA,
status = _ref6.status;
fetchSubtypes(serverBus);
if ((status === 'loading' || status === 'error') && gene && studyA) {
fetchTranscripts(serverBus, newState.transcripts);
}
},
loadGene: function loadGene(state, gene, studyA, subtypeA, studyB, subtypeB, unit) {
var zoom = state.transcripts && gene === state.transcripts.gene ? state.transcripts.zoom : {};
return _.updateIn(state, ['transcripts'], function (s) {
return _.merge(s, {
status: gene ? 'loading' : undefined,
gene: gene,
studyA: studyA,
subtypeA: subtypeA,
studyB: studyB,
subtypeB: subtypeB,
unit: unit,
zoom: zoom });
});
},
'loadGene-post!': function loadGenePost(serverBus, state, newState) {
if (newState.transcripts.gene) {
fetchTranscripts(serverBus, newState.transcripts);
}
},
geneTranscripts: function geneTranscripts(state, _ref7) {
var transcripts = _ref7.transcripts,
unit = _ref7.unit;
return _.assocIn(state, ['transcripts', 'status'], 'loaded', ['transcripts', 'genetranscripts'], transcripts, ['transcripts', 'datasetUnit'], unit);
},
'geneTranscripts-error': function geneTranscriptsError(state) {
return _.assocIn(state, ['transcripts', 'status'], 'error');
},
transcriptSampleSubtypes: function transcriptSampleSubtypes(state, subtypes) {
return _.assocIn(state, ['transcripts', 'subtypes'], subtypes);
},
units: function units(state, _units) {
return _.assocIn(state, ['transcripts', 'units'], _units);
},
transcriptZoom: function transcriptZoom(state, name) {
return _.updateIn(state, ['transcripts', 'zoom', name], function (z) {
return !z;
});
}
};
module.exports = {
action: function action(state, _ref8) {
var _ref9 = _toArray(_ref8),
tag = _ref9[0],
args = _ref9.slice(1);
return (controls[tag] || identity).apply(undefined, [state].concat(_toConsumableArray(args)));
},
postAction: function postAction(serverBus, state, newState, _ref10) {
var _ref11 = _toArray(_ref10),
tag = _ref11[0],
args = _ref11.slice(1);
return (controls[tag + '-post!'] || identity).apply(undefined, [serverBus, state, newState].concat(_toConsumableArray(args)));
}
};