UNPKG

ucsc-xena-client

Version:

UCSC Xena Client. Functional genomics visualizations.

163 lines (139 loc) 6.1 kB
'use strict'; 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))); } };