UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

72 lines (71 loc) 2.33 kB
import { SimpleFeature, mergeIntervals } from '@jbrowse/core/util'; export async function fetchFeatureByIdRpc({ rpcManager, sessionId, trackId, rendererType, featureId, parentFeatureId, }) { const lookupId = parentFeatureId || featureId; const { feature: featureData } = (await rpcManager.call(sessionId, 'CoreGetFeatureDetails', { featureId: lookupId, sessionId, trackInstanceId: trackId, rendererType, })); if (!featureData) { return undefined; } const feature = new SimpleFeature(featureData); if (parentFeatureId) { return findSubfeatureById(feature, featureId); } return feature; } export function findSubfeatureById(feature, targetId) { const subfeatures = feature.get('subfeatures'); if (subfeatures) { for (const sub of subfeatures) { if (sub.id() === targetId) { return sub; } const found = findSubfeatureById(sub, targetId); if (found) { return found; } } } return undefined; } export function featureHasExonsOrCDS(feature) { const subs = feature.get('subfeatures') ?? []; return subs.some((f) => f.get('type') === 'exon' || f.get('type') === 'CDS'); } export function hasExonsOrCDS(transcripts) { return transcripts.some(t => featureHasExonsOrCDS(t)); } export function hasIntrons(transcripts) { const subs = transcripts.flatMap(transcript => transcript .get('subfeatures') ?.filter((f) => f.get('type') === 'exon' || f.get('type') === 'CDS') ?? []); if (subs.length < 2) { return false; } const merged = mergeIntervals(subs.map((f) => ({ start: f.get('start'), end: f.get('end') })), 0); return merged.length > 1; } export function getTranscripts(feature) { if (!feature) { return []; } return featureHasExonsOrCDS(feature) ? [feature] : (feature.get('subfeatures') ?? []); } export function drawCanvasImageData(canvas, imageData) { if (!canvas || !imageData) { return false; } const ctx = canvas.getContext('2d'); if (!ctx) { return false; } ctx.resetTransform(); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(imageData, 0, 0); return true; }