@jbrowse/plugin-wiggle
Version:
JBrowse 2 wiggle adapters, tracks, etc.
111 lines (110 loc) • 4.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const BaseAdapter_1 = require("@jbrowse/core/data_adapters/BaseAdapter");
const util_1 = require("@jbrowse/core/util");
const rxjs_1 = require("@jbrowse/core/util/rxjs");
const rxjs_2 = require("rxjs");
const operators_1 = require("rxjs/operators");
function getFilename(uri) {
const filename = uri.slice(uri.lastIndexOf('/') + 1);
return filename.slice(0, filename.lastIndexOf('.'));
}
function getFilenameFromAdapterConfig(config) {
try {
if (config.type === 'BigWigAdapter' && config.bigWigLocation) {
const location = config.bigWigLocation;
if ('uri' in location && location.uri) {
return getFilename(location.uri);
}
if ('localPath' in location && location.localPath) {
return getFilename(location.localPath);
}
if ('blob' in location && location.blob) {
const blob = location.blob;
return blob.name ? getFilename(blob.name) : undefined;
}
}
return undefined;
}
catch (e) {
return undefined;
}
}
class MultiWiggleAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
async getAdapters() {
const getSubAdapter = this.getSubAdapter;
if (!getSubAdapter) {
throw new Error('no getSubAdapter available');
}
let subConfs = this.getConf('subadapters');
if (!(subConfs === null || subConfs === void 0 ? void 0 : subConfs.length)) {
const entries = this.getConf('bigWigs');
subConfs = entries.map(entry => ({
type: 'BigWigAdapter',
source: getFilename(entry),
bigWigLocation: {
uri: entry,
},
}));
}
const ret = await Promise.all(subConfs.map(async (conf) => {
const dataAdapter = (await getSubAdapter(conf))
.dataAdapter;
const source = conf.source ||
conf.name ||
getFilenameFromAdapterConfig(conf) ||
dataAdapter.id;
return {
...conf,
dataAdapter,
source,
};
}));
return ret;
}
async getRefNames(opts) {
const adapters = await this.getAdapters();
const allNames = await Promise.all(adapters.map(a => a.dataAdapter.getRefNames(opts)));
return [...new Set(allNames.flat())];
}
async getGlobalStats(opts) {
const adapters = await this.getAdapters();
const stats = (await Promise.all(adapters.map(adp => { var _a, _b; return (_b = (_a = adp.dataAdapter).getGlobalStats) === null || _b === void 0 ? void 0 : _b.call(_a, opts); }))).filter(f => !!f);
return {
scoreMin: (0, util_1.min)(stats.map(s => s.scoreMin)),
scoreMax: (0, util_1.max)(stats.map(s => s.scoreMax)),
};
}
getFeatures(region, opts = {}) {
return (0, rxjs_1.ObservableCreate)(async (observer) => {
const adapters = await this.getAdapters();
(0, rxjs_2.merge)(...adapters.map(adp => adp.dataAdapter.getFeatures(region, opts).pipe((0, operators_1.map)(p => p.get('source')
? p
: new util_1.SimpleFeature({
...p.toJSON(),
uniqueId: `${adp.source}-${p.id()}`,
source: adp.source,
}))))).subscribe(observer);
}, opts.stopToken);
}
async getMultiRegionFeatureDensityStats(_regions) {
return {
featureDensity: 0,
};
}
async getSources(_regions) {
const adapters = await this.getAdapters();
return adapters.map(({ type, bigWigLocation, dataAdapter, ...rest }) => {
return {
...rest,
name: rest.source,
};
});
}
}
MultiWiggleAdapter.capabilities = [
'hasResolution',
'hasLocalStats',
'hasGlobalStats',
];
exports.default = MultiWiggleAdapter;