@jbrowse/plugin-wiggle
Version:
JBrowse 2 wiggle adapters, tracks, etc.
33 lines (32 loc) • 1.34 kB
JavaScript
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache';
import { groupBy } from '@jbrowse/core/util';
import { firstValueFrom, toArray } from 'rxjs';
export async function getScoreMatrix({ pluginManager, args, }) {
const { sources, regions, adapterConfig, sessionId, bpPerPx } = args;
const adapter = await getAdapter(pluginManager, sessionId, adapterConfig);
const dataAdapter = adapter.dataAdapter;
const r0 = regions[0];
const r0len = r0.end - r0.start;
const w = Math.floor(r0len / bpPerPx);
const feats = await firstValueFrom(dataAdapter.getFeatures(r0, args).pipe(toArray()));
const groups = groupBy(feats, f => f.get('source'));
const rows = {};
for (const source of sources) {
const { name } = source;
const features = groups[name] || [];
const arr = new Array(w).fill(0);
for (const feat of features) {
const fstart = feat.get('start');
const fend = feat.get('end');
const score = feat.get('score');
for (let i = fstart; i < fend; i += bpPerPx) {
const x = Math.floor((i - r0.start) / bpPerPx);
if (x >= 0 && x < w) {
arr[x] || (arr[x] = score);
}
}
}
rows[name] = arr;
}
return rows;
}