@jbrowse/plugin-config
Version:
JBrowse 2 config utilities
50 lines (49 loc) • 1.78 kB
JavaScript
import { readConfObject } from '@jbrowse/core/configuration';
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
import SimpleFeature from '@jbrowse/core/util/simpleFeature';
export function makeFeatures(fdata) {
const features = new Map();
for (const entry of fdata) {
const f = new SimpleFeature(entry);
const refName = f.get('refName');
let bucket = features.get(refName);
if (!bucket) {
bucket = [];
features.set(refName, bucket);
}
bucket.push(f);
}
for (const refFeatures of features.values()) {
refFeatures.sort((a, b) => a.get('start') - b.get('start'));
}
return features;
}
export default class FromConfigAdapter extends BaseFeatureDataAdapter {
constructor(conf, getSubAdapter, pluginManager) {
super(conf, getSubAdapter, pluginManager);
const feats = readConfObject(conf, 'features');
this.features = makeFeatures(feats);
}
async getRefNames() {
return [...this.features.keys()];
}
async getRefNameAliases() {
return [...this.features.values()].map(featureArray => ({
refName: featureArray[0].get('refName'),
aliases: featureArray[0].get('aliases'),
}));
}
getFeatures(region) {
const { refName, start, end } = region;
return ObservableCreate(async (observer) => {
const features = this.features.get(refName) || [];
for (const f of features) {
if (f.get('end') > start && f.get('start') < end) {
observer.next(f);
}
}
observer.complete();
});
}
}