UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

74 lines (73 loc) 2.75 kB
import { revcom } from "../../util/index.js"; import { calculateUTRs2, calculateUTRs, filterSuccessiveElementsWithSameStartAndEndCoord, revlist, } from "../util.js"; function prepareSubfeatures(feature) { const { start, subfeatures } = feature; return (subfeatures ?.sort((a, b) => a.start - b.start) .map(sub => ({ ...sub, start: sub.start - start, end: sub.end - start, })) || []); } function processFeatureData(children, feature) { const featureType = feature.type?.toLowerCase(); const isMatureProteinRegion = featureType === 'mature_protein_region_of_cds'; const cds = isMatureProteinRegion ? [{ start: 0, end: feature.end - feature.start, type: 'CDS' }] : filterSuccessiveElementsWithSameStartAndEndCoord(children.filter(sub => { const type = sub.type?.toLowerCase(); return type === 'cds' || type === 'mature_protein_region_of_cds'; })); const exons = filterSuccessiveElementsWithSameStartAndEndCoord(children.filter(sub => sub.type === 'exon')); let utr = filterSuccessiveElementsWithSameStartAndEndCoord(children.filter(sub => sub.type?.match(/utr/i))); if (!utr.length && cds.length && exons.length) { utr = calculateUTRs(cds, exons); } else if (!utr.length && cds.length && !exons.length) { utr = calculateUTRs2(cds, { start: 0, end: feature.end - feature.start, type: 'gene', }); } return { cds, exons, utr, }; } function handleReverseStrand(sequence, cds, exons, utr) { const { seq, upstream = '', downstream = '' } = sequence; return { sequence: { seq: revcom(seq), upstream: downstream ? revcom(downstream) : '', downstream: upstream ? revcom(upstream) : '', }, cds: revlist(cds, seq.length), exons: revlist(exons, seq.length), utr: revlist(utr, seq.length), }; } export function useSequenceData({ feature, sequence, }) { const children = prepareSubfeatures(feature); const { cds, exons, utr } = processFeatureData(children, feature); if (!sequence || 'error' in sequence) { return undefined; } else { const { sequence: adjustedSequence, cds: adjustedCds, exons: adjustedExons, utr: adjustedUtr, } = feature.strand === -1 ? handleReverseStrand(sequence, cds, exons, utr) : { sequence, cds, exons, utr }; const { seq, upstream, downstream } = adjustedSequence; return { seq, upstream, downstream, cds: adjustedCds, exons: adjustedExons, utr: adjustedUtr, }; } }