@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
72 lines (71 loc) • 2.33 kB
JavaScript
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;
}