UNPKG

ucsc-xena-client

Version:

UCSC Xena Client. Functional genomics visualizations.

84 lines (72 loc) 2.05 kB
'use strict'; // Find contiguous intron regions across a set of transcripts, i.e. // regions without any exons. These are not, strictly speaking, 'introns', // but intronic regions in every transcript. function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } var _ = require('./underscore_ext'); // Create a group with one exon var initGroup = function initGroup(exon) { return { start: exon.start, end: exon.end, exons: [exon] }; }; var push = function push(arr, v) { return arr.push(v), arr; }; // Update a group with an overlapping exon function updateGroup(group, exon) { var newEnd = group.end < exon.end ? exon.end : group.end; return { start: group.start, end: newEnd, exons: push(group.exons, exon) }; } function mergeTop(groups, exon) { var len = groups.length - 1, last = groups[len]; if (last.start <= exon.end && exon.start <= last.end) { groups[len] = updateGroup(last, exon); } else { groups.push(initGroup(exon)); } return groups; } // findIntrons(exons :: [[{start, end}, {start, end}, ...], ...]) :: // [{start, end, exons: [...]}, ...] // // exons in the returned groups are sorted by start position. function exonGroups(exons) { if (exons.length < 1) { return []; } var sorted = _.sortBy(exons, 'start'), _sorted = _toArray(sorted), first = _sorted[0], rest = _sorted.slice(1); return rest.reduce(mergeTop, [initGroup(first)]); } function intronRegions(groups) { return groups.slice(1).map(function (_ref, i) { var start = _ref.start, end = _ref.end; return [groups[i].end, start]; }); } // exons(transcripts :: [{exonStarts, exonEnds}, ...]) :: [{start, end}, ...] function allExons(transcripts) { return _.flatmap(transcripts, function (_ref2) { var exonStarts = _ref2.exonStarts, exonEnds = _ref2.exonEnds; return _.mmap(exonStarts, exonEnds, function (start, end) { return { start: start, end: end }; }); }); } module.exports = { allExons: allExons, exonGroups: exonGroups, intronRegions: intronRegions };