ucsc-xena-client
Version:
UCSC Xena Client. Functional genomics visualizations.
84 lines (72 loc) • 2.05 kB
JavaScript
// 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
};
;