@jbrowse/plugin-bed 1.7.10 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BedAdapter/BedAdapter.d.ts +29 -0
- package/dist/BedAdapter/BedAdapter.js +273 -0
- package/dist/BedAdapter/BedAdapter.js.map +1 -0
- package/dist/BedAdapter/configSchema.d.ts +2 -0
- package/dist/BedAdapter/configSchema.js +40 -0
- package/dist/BedAdapter/configSchema.js.map +1 -0
- package/dist/BedAdapter/index.d.ts +1 -0
- package/dist/BedAdapter/index.js +9 -0
- package/dist/BedAdapter/index.js.map +1 -0
- package/dist/BedTabixAdapter/BedTabixAdapter.d.ts +3 -7
- package/dist/BedTabixAdapter/BedTabixAdapter.js +154 -289
- package/dist/BedTabixAdapter/BedTabixAdapter.js.map +1 -0
- package/dist/BedTabixAdapter/configSchema.js +38 -51
- package/dist/BedTabixAdapter/configSchema.js.map +1 -0
- package/dist/BedTabixAdapter/index.js +8 -14
- package/dist/BedTabixAdapter/index.js.map +1 -0
- package/dist/BigBedAdapter/BigBedAdapter.js +228 -335
- package/dist/BigBedAdapter/BigBedAdapter.js.map +1 -0
- package/dist/BigBedAdapter/configSchema.js +9 -21
- package/dist/BigBedAdapter/configSchema.js.map +1 -0
- package/dist/BigBedAdapter/index.js +8 -14
- package/dist/BigBedAdapter/index.js.map +1 -0
- package/dist/index.js +132 -129
- package/dist/index.js.map +1 -0
- package/dist/util.d.ts +3 -1
- package/dist/util.js +161 -121
- package/dist/util.js.map +1 -0
- package/esm/BedAdapter/BedAdapter.d.ts +29 -0
- package/esm/BedAdapter/BedAdapter.js +130 -0
- package/esm/BedAdapter/BedAdapter.js.map +1 -0
- package/esm/BedAdapter/configSchema.d.ts +2 -0
- package/esm/BedAdapter/configSchema.js +38 -0
- package/esm/BedAdapter/configSchema.js.map +1 -0
- package/esm/BedAdapter/index.d.ts +1 -0
- package/esm/BedAdapter/index.js +2 -0
- package/esm/BedAdapter/index.js.map +1 -0
- package/esm/BedTabixAdapter/BedTabixAdapter.d.ts +19 -0
- package/esm/BedTabixAdapter/BedTabixAdapter.js +69 -0
- package/esm/BedTabixAdapter/BedTabixAdapter.js.map +1 -0
- package/esm/BedTabixAdapter/configSchema.d.ts +2 -0
- package/esm/BedTabixAdapter/configSchema.js +38 -0
- package/esm/BedTabixAdapter/configSchema.js.map +1 -0
- package/esm/BedTabixAdapter/index.d.ts +1 -0
- package/esm/BedTabixAdapter/index.js +2 -0
- package/esm/BedTabixAdapter/index.js.map +1 -0
- package/esm/BigBedAdapter/BigBedAdapter.d.ts +46 -0
- package/esm/BigBedAdapter/BigBedAdapter.js +104 -0
- package/esm/BigBedAdapter/BigBedAdapter.js.map +1 -0
- package/esm/BigBedAdapter/configSchema.d.ts +2 -0
- package/esm/BigBedAdapter/configSchema.js +8 -0
- package/esm/BigBedAdapter/configSchema.js.map +1 -0
- package/esm/BigBedAdapter/index.d.ts +1 -0
- package/esm/BigBedAdapter/index.js +2 -0
- package/esm/BigBedAdapter/index.js.map +1 -0
- package/esm/index.d.ts +6 -0
- package/esm/index.js +81 -0
- package/esm/index.js.map +1 -0
- package/esm/util.d.ts +4 -0
- package/esm/util.js +154 -0
- package/esm/util.js.map +1 -0
- package/package.json +18 -7
- package/src/BedAdapter/BedAdapter.test.ts +170 -0
- package/src/BedAdapter/BedAdapter.ts +172 -0
- package/src/BedAdapter/__snapshots__/BedAdapter.test.ts.snap +437 -0
- package/src/BedAdapter/configSchema.ts +45 -0
- package/src/BedAdapter/index.ts +1 -0
- package/src/BedAdapter/test_data/gwas.bed +20 -0
- package/src/BedAdapter/test_data/volvox-autosql.bed +1 -0
- package/src/BedAdapter/test_data/volvox-bed12.bed +4 -0
- package/src/BedAdapter/test_data/volvox.sort.bed +109 -0
- package/src/BedAdapter/test_data/volvox.sort.with.header.bed +121 -0
- package/src/BedTabixAdapter/BedTabixAdapter.ts +29 -80
- package/src/index.ts +34 -1
- package/src/util.ts +65 -6
- package/dist/BedTabixAdapter/BedTabixAdapter.test.js +0 -276
- package/dist/BigBedAdapter/BigBedAdapter.test.js +0 -63
- package/dist/declare.d.js +0 -1
- package/dist/index.test.js +0 -24
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import BED from '@gmod/bed';
|
|
2
|
+
import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
|
+
import { openLocation } from '@jbrowse/core/util/io';
|
|
4
|
+
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
|
|
5
|
+
import { featureData } from '../util';
|
|
6
|
+
import IntervalTree from '@flatten-js/interval-tree';
|
|
7
|
+
import { unzip } from '@gmod/bgzf-filehandle';
|
|
8
|
+
function isGzip(buf) {
|
|
9
|
+
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
10
|
+
}
|
|
11
|
+
export default class BedAdapter extends BaseFeatureDataAdapter {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.intervalTrees = {};
|
|
15
|
+
}
|
|
16
|
+
async loadDataP(opts = {}) {
|
|
17
|
+
const pm = this.pluginManager;
|
|
18
|
+
const bedLoc = this.getConf('bedLocation');
|
|
19
|
+
const buf = await openLocation(bedLoc, pm).readFile(opts);
|
|
20
|
+
const buffer = isGzip(buf) ? await unzip(buf) : buf;
|
|
21
|
+
// 512MB max chrome string length is 512MB
|
|
22
|
+
if (buffer.length > 536870888) {
|
|
23
|
+
throw new Error('Data exceeds maximum string length (512MB)');
|
|
24
|
+
}
|
|
25
|
+
const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
|
|
26
|
+
const lines = data.split('\n').filter(f => !!f);
|
|
27
|
+
const headerLines = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
for (; i < lines.length && lines[i].startsWith('#'); i++) {
|
|
30
|
+
headerLines.push(lines[i]);
|
|
31
|
+
}
|
|
32
|
+
const header = headerLines.join('\n');
|
|
33
|
+
const features = {};
|
|
34
|
+
for (; i < lines.length; i++) {
|
|
35
|
+
const line = lines[i];
|
|
36
|
+
const tab = line.indexOf('\t');
|
|
37
|
+
const refName = line.slice(0, tab);
|
|
38
|
+
if (!features[refName]) {
|
|
39
|
+
features[refName] = [];
|
|
40
|
+
}
|
|
41
|
+
features[refName].push(line);
|
|
42
|
+
}
|
|
43
|
+
const autoSql = this.getConf('autoSql');
|
|
44
|
+
const parser = new BED({ autoSql });
|
|
45
|
+
const columnNames = this.getConf('columnNames');
|
|
46
|
+
const scoreColumn = this.getConf('scoreColumn');
|
|
47
|
+
const colRef = this.getConf('colRef');
|
|
48
|
+
const colStart = this.getConf('colStart');
|
|
49
|
+
const colEnd = this.getConf('colEnd');
|
|
50
|
+
return {
|
|
51
|
+
header,
|
|
52
|
+
features,
|
|
53
|
+
parser,
|
|
54
|
+
columnNames,
|
|
55
|
+
scoreColumn,
|
|
56
|
+
colRef,
|
|
57
|
+
colStart,
|
|
58
|
+
colEnd,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async loadData(opts = {}) {
|
|
62
|
+
if (!this.bedFeatures) {
|
|
63
|
+
this.bedFeatures = this.loadDataP(opts).catch(e => {
|
|
64
|
+
this.bedFeatures = undefined;
|
|
65
|
+
throw e;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return this.bedFeatures;
|
|
69
|
+
}
|
|
70
|
+
async getRefNames(opts = {}) {
|
|
71
|
+
const { features } = await this.loadData(opts);
|
|
72
|
+
return Object.keys(features);
|
|
73
|
+
}
|
|
74
|
+
async getHeader(opts = {}) {
|
|
75
|
+
const { header } = await this.loadData(opts);
|
|
76
|
+
return header;
|
|
77
|
+
}
|
|
78
|
+
async getNames() {
|
|
79
|
+
const { header, columnNames } = await this.loadData();
|
|
80
|
+
if (columnNames.length) {
|
|
81
|
+
return columnNames;
|
|
82
|
+
}
|
|
83
|
+
const defs = header.split('\n').filter(f => !!f);
|
|
84
|
+
const defline = defs[defs.length - 1];
|
|
85
|
+
return (defline === null || defline === void 0 ? void 0 : defline.includes('\t'))
|
|
86
|
+
? defline
|
|
87
|
+
.slice(1)
|
|
88
|
+
.split('\t')
|
|
89
|
+
.map(field => field.trim())
|
|
90
|
+
: undefined;
|
|
91
|
+
}
|
|
92
|
+
async loadFeatureIntervalTreeHelper(refName) {
|
|
93
|
+
const { colRef, colStart, colEnd, features, parser, scoreColumn } = await this.loadData();
|
|
94
|
+
const lines = features[refName];
|
|
95
|
+
if (!lines) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const names = await this.getNames();
|
|
99
|
+
const intervalTree = new IntervalTree();
|
|
100
|
+
const ret = lines.map((f, i) => {
|
|
101
|
+
const uniqueId = `${this.id}-${refName}-${i}`;
|
|
102
|
+
return featureData(f, colRef, colStart, colEnd, scoreColumn, parser, uniqueId, names);
|
|
103
|
+
});
|
|
104
|
+
for (let i = 0; i < ret.length; i++) {
|
|
105
|
+
const obj = ret[i];
|
|
106
|
+
intervalTree.insert([obj.get('start'), obj.get('end')], obj);
|
|
107
|
+
}
|
|
108
|
+
return intervalTree;
|
|
109
|
+
}
|
|
110
|
+
async loadFeatureIntervalTree(refName) {
|
|
111
|
+
if (!this.intervalTrees[refName]) {
|
|
112
|
+
this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(refName).catch(e => {
|
|
113
|
+
this.intervalTrees[refName] = undefined;
|
|
114
|
+
throw e;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return this.intervalTrees[refName];
|
|
118
|
+
}
|
|
119
|
+
getFeatures(query, opts = {}) {
|
|
120
|
+
return ObservableCreate(async (observer) => {
|
|
121
|
+
const { start, end, refName } = query;
|
|
122
|
+
const intervalTree = await this.loadFeatureIntervalTree(refName);
|
|
123
|
+
intervalTree === null || intervalTree === void 0 ? void 0 : intervalTree.search([start, end]).forEach(f => observer.next(f));
|
|
124
|
+
observer.complete();
|
|
125
|
+
}, opts.signal);
|
|
126
|
+
}
|
|
127
|
+
freeResources() { }
|
|
128
|
+
}
|
|
129
|
+
BedAdapter.capabilities = ['getFeatures', 'getRefNames'];
|
|
130
|
+
//# sourceMappingURL=BedAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BedAdapter.js","sourceRoot":"","sources":["../../src/BedAdapter/BedAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ConfigurationSchema } from '@jbrowse/core/configuration';
|
|
2
|
+
export default ConfigurationSchema('BedAdapter', {
|
|
3
|
+
bedLocation: {
|
|
4
|
+
type: 'fileLocation',
|
|
5
|
+
defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },
|
|
6
|
+
},
|
|
7
|
+
columnNames: {
|
|
8
|
+
type: 'stringArray',
|
|
9
|
+
description: 'List of column names',
|
|
10
|
+
defaultValue: [],
|
|
11
|
+
},
|
|
12
|
+
scoreColumn: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'The column to use as a "score" attribute',
|
|
15
|
+
defaultValue: '',
|
|
16
|
+
},
|
|
17
|
+
autoSql: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'The autoSql definition for the data fields in the file',
|
|
20
|
+
defaultValue: '',
|
|
21
|
+
},
|
|
22
|
+
colRef: {
|
|
23
|
+
type: 'number',
|
|
24
|
+
description: 'The column to use as a "refName" attribute',
|
|
25
|
+
defaultValue: 0,
|
|
26
|
+
},
|
|
27
|
+
colStart: {
|
|
28
|
+
type: 'number',
|
|
29
|
+
description: 'The column to use as a "start" attribute',
|
|
30
|
+
defaultValue: 1,
|
|
31
|
+
},
|
|
32
|
+
colEnd: {
|
|
33
|
+
type: 'number',
|
|
34
|
+
description: 'The column to use as a "end" attribute',
|
|
35
|
+
defaultValue: 2,
|
|
36
|
+
},
|
|
37
|
+
}, { explicitlyTyped: true });
|
|
38
|
+
//# sourceMappingURL=configSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/BedAdapter/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,eAAe,mBAAmB,CAChC,YAAY,EACZ;IACE,WAAW,EAAE;QACX,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE;KACzE;IAED,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,EAAE;KACjB;IAED,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0CAA0C;QACvD,YAAY,EAAE,EAAE;KACjB;IAED,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wDAAwD;QACrE,YAAY,EAAE,EAAE;KACjB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,4CAA4C;QACzD,YAAY,EAAE,CAAC;KAChB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0CAA0C;QACvD,YAAY,EAAE,CAAC;KAChB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wCAAwC;QACrD,YAAY,EAAE,CAAC;KAChB;CACF,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as configSchema } from './configSchema';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/BedAdapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
2
|
+
import { Region, Feature } from '@jbrowse/core/util';
|
|
3
|
+
import { TabixIndexedFile } from '@gmod/tabix';
|
|
4
|
+
import PluginManager from '@jbrowse/core/PluginManager';
|
|
5
|
+
import { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
6
|
+
import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache';
|
|
7
|
+
export default class BedTabixAdapter extends BaseFeatureDataAdapter {
|
|
8
|
+
private parser;
|
|
9
|
+
protected bed: TabixIndexedFile;
|
|
10
|
+
protected columnNames: string[];
|
|
11
|
+
protected scoreColumn: string;
|
|
12
|
+
static capabilities: string[];
|
|
13
|
+
constructor(config: AnyConfigurationModel, getSubAdapter?: getSubAdapterType, pluginManager?: PluginManager);
|
|
14
|
+
getRefNames(opts?: BaseOptions): Promise<any>;
|
|
15
|
+
getHeader(): Promise<string>;
|
|
16
|
+
getNames(): Promise<string[] | undefined>;
|
|
17
|
+
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
18
|
+
freeResources(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import BED from '@gmod/bed';
|
|
3
|
+
import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
4
|
+
import { openLocation } from '@jbrowse/core/util/io';
|
|
5
|
+
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
|
|
6
|
+
import { TabixIndexedFile } from '@gmod/tabix';
|
|
7
|
+
import { featureData } from '../util';
|
|
8
|
+
export default class BedTabixAdapter extends BaseFeatureDataAdapter {
|
|
9
|
+
constructor(config, getSubAdapter, pluginManager) {
|
|
10
|
+
super(config, getSubAdapter, pluginManager);
|
|
11
|
+
const bedGzLoc = this.getConf('bedGzLocation');
|
|
12
|
+
const type = this.getConf(['index', 'indexType']);
|
|
13
|
+
const loc = this.getConf(['index', 'location']);
|
|
14
|
+
const autoSql = this.getConf('autoSql');
|
|
15
|
+
const pm = this.pluginManager;
|
|
16
|
+
this.bed = new TabixIndexedFile({
|
|
17
|
+
filehandle: openLocation(bedGzLoc, pm),
|
|
18
|
+
csiFilehandle: type === 'CSI' ? openLocation(loc, pm) : undefined,
|
|
19
|
+
tbiFilehandle: type !== 'CSI' ? openLocation(loc, pm) : undefined,
|
|
20
|
+
chunkCacheSize: 50 * 2 ** 20,
|
|
21
|
+
});
|
|
22
|
+
this.columnNames = this.getConf('columnNames');
|
|
23
|
+
this.scoreColumn = this.getConf('scoreColumn');
|
|
24
|
+
this.parser = new BED({ autoSql });
|
|
25
|
+
}
|
|
26
|
+
async getRefNames(opts = {}) {
|
|
27
|
+
return this.bed.getReferenceSequenceNames(opts);
|
|
28
|
+
}
|
|
29
|
+
async getHeader() {
|
|
30
|
+
return this.bed.getHeader();
|
|
31
|
+
}
|
|
32
|
+
async getNames() {
|
|
33
|
+
if (this.columnNames.length) {
|
|
34
|
+
return this.columnNames;
|
|
35
|
+
}
|
|
36
|
+
const header = await this.bed.getHeader();
|
|
37
|
+
const defs = header.split('\n').filter(f => !!f);
|
|
38
|
+
const defline = defs[defs.length - 1];
|
|
39
|
+
return (defline === null || defline === void 0 ? void 0 : defline.includes('\t'))
|
|
40
|
+
? defline
|
|
41
|
+
.slice(1)
|
|
42
|
+
.split('\t')
|
|
43
|
+
.map(f => f.trim())
|
|
44
|
+
: undefined;
|
|
45
|
+
}
|
|
46
|
+
getFeatures(query, opts = {}) {
|
|
47
|
+
return ObservableCreate(async (observer) => {
|
|
48
|
+
const meta = await this.bed.getMetadata();
|
|
49
|
+
const { columnNumbers } = meta;
|
|
50
|
+
const colRef = columnNumbers.ref - 1;
|
|
51
|
+
const colStart = columnNumbers.start - 1;
|
|
52
|
+
const colEnd = columnNumbers.end - 1;
|
|
53
|
+
// colSame handles special case for tabix where a single column is both
|
|
54
|
+
// the start and end, this is assumed to be covering the base at this
|
|
55
|
+
// position (e.g. tabix -s 1 -b 2 -e 2) begin and end are same
|
|
56
|
+
const names = await this.getNames();
|
|
57
|
+
await this.bed.getLines(query.refName, query.start, query.end, {
|
|
58
|
+
lineCallback: (line, fileOffset) => {
|
|
59
|
+
observer.next(featureData(line, colRef, colStart, colEnd, this.scoreColumn, this.parser, `${this.id}-${fileOffset}`, names));
|
|
60
|
+
},
|
|
61
|
+
signal: opts.signal,
|
|
62
|
+
});
|
|
63
|
+
observer.complete();
|
|
64
|
+
}, opts.signal);
|
|
65
|
+
}
|
|
66
|
+
freeResources() { }
|
|
67
|
+
}
|
|
68
|
+
BedTabixAdapter.capabilities = ['getFeatures', 'getRefNames'];
|
|
69
|
+
//# sourceMappingURL=BedTabixAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BedTabixAdapter.js","sourceRoot":"","sources":["../../src/BedTabixAdapter/BedTabixAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ConfigurationSchema } from '@jbrowse/core/configuration';
|
|
2
|
+
import { types } from 'mobx-state-tree';
|
|
3
|
+
export default ConfigurationSchema('BedTabixAdapter', {
|
|
4
|
+
bedGzLocation: {
|
|
5
|
+
type: 'fileLocation',
|
|
6
|
+
defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },
|
|
7
|
+
},
|
|
8
|
+
index: ConfigurationSchema('TabixIndex', {
|
|
9
|
+
indexType: {
|
|
10
|
+
model: types.enumeration('IndexType', ['TBI', 'CSI']),
|
|
11
|
+
type: 'stringEnum',
|
|
12
|
+
defaultValue: 'TBI',
|
|
13
|
+
},
|
|
14
|
+
location: {
|
|
15
|
+
type: 'fileLocation',
|
|
16
|
+
defaultValue: {
|
|
17
|
+
uri: '/path/to/my.bed.gz.tbi',
|
|
18
|
+
locationType: 'UriLocation',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
}),
|
|
22
|
+
columnNames: {
|
|
23
|
+
type: 'stringArray',
|
|
24
|
+
description: 'List of column names',
|
|
25
|
+
defaultValue: [],
|
|
26
|
+
},
|
|
27
|
+
scoreColumn: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'The column to use as a "score" attribute',
|
|
30
|
+
defaultValue: '',
|
|
31
|
+
},
|
|
32
|
+
autoSql: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'The autoSql definition for the data fields in the file',
|
|
35
|
+
defaultValue: '',
|
|
36
|
+
},
|
|
37
|
+
}, { explicitlyTyped: true });
|
|
38
|
+
//# sourceMappingURL=configSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/BedTabixAdapter/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,eAAe,mBAAmB,CAChC,iBAAiB,EACjB;IACE,aAAa,EAAE;QACb,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE;KACzE;IAED,KAAK,EAAE,mBAAmB,CAAC,YAAY,EAAE;QACvC,SAAS,EAAE;YACT,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,KAAK;SACpB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE;gBACZ,GAAG,EAAE,wBAAwB;gBAC7B,YAAY,EAAE,aAAa;aAC5B;SACF;KACF,CAAC;IAEF,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,EAAE;KACjB;IAED,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0CAA0C;QACvD,YAAY,EAAE,EAAE;KACjB;IAED,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wDAAwD;QACrE,YAAY,EAAE,EAAE;KACjB;CACF,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as configSchema } from './configSchema';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/BedTabixAdapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BigBed } from '@gmod/bbi';
|
|
2
|
+
import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
|
+
import { Region } from '@jbrowse/core/util/types';
|
|
4
|
+
import { Feature } from '@jbrowse/core/util/simpleFeature';
|
|
5
|
+
interface BEDFeature {
|
|
6
|
+
chrom: string;
|
|
7
|
+
chromStart: number;
|
|
8
|
+
chromEnd: number;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
interface Parser {
|
|
12
|
+
parseLine: (line: string, opts: {
|
|
13
|
+
uniqueId: string | number;
|
|
14
|
+
}) => BEDFeature;
|
|
15
|
+
autoSql: {
|
|
16
|
+
fields: {
|
|
17
|
+
name: string;
|
|
18
|
+
comment: string;
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
23
|
+
private cached?;
|
|
24
|
+
configurePre(opts?: BaseOptions): Promise<{
|
|
25
|
+
bigbed: BigBed;
|
|
26
|
+
header: any;
|
|
27
|
+
parser: Parser;
|
|
28
|
+
}>;
|
|
29
|
+
configure(opts?: BaseOptions): Promise<{
|
|
30
|
+
bigbed: BigBed;
|
|
31
|
+
header: any;
|
|
32
|
+
parser: Parser;
|
|
33
|
+
}>;
|
|
34
|
+
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
35
|
+
getHeader(opts?: BaseOptions): Promise<{
|
|
36
|
+
version: any;
|
|
37
|
+
fileType: any;
|
|
38
|
+
autoSql: {};
|
|
39
|
+
fields: {
|
|
40
|
+
[k: string]: string;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
getFeatures(region: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
44
|
+
freeResources(): void;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { BigBed } from '@gmod/bbi';
|
|
3
|
+
import BED from '@gmod/bed';
|
|
4
|
+
import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
5
|
+
import { openLocation } from '@jbrowse/core/util/io';
|
|
6
|
+
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
|
|
7
|
+
import SimpleFeature from '@jbrowse/core/util/simpleFeature';
|
|
8
|
+
import { map, mergeAll } from 'rxjs/operators';
|
|
9
|
+
import { readConfObject } from '@jbrowse/core/configuration';
|
|
10
|
+
import { ucscProcessedTranscript } from '../util';
|
|
11
|
+
function isUCSC(f) {
|
|
12
|
+
return f.get('thickStart') && f.get('blockCount') && f.get('strand') !== 0;
|
|
13
|
+
}
|
|
14
|
+
export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
15
|
+
async configurePre(opts) {
|
|
16
|
+
const bigbed = new BigBed({
|
|
17
|
+
filehandle: openLocation(readConfObject(this.config, 'bigBedLocation'), this.pluginManager),
|
|
18
|
+
});
|
|
19
|
+
const header = await bigbed.getHeader(opts);
|
|
20
|
+
const parser = new BED({ autoSql: header.autoSql });
|
|
21
|
+
return { bigbed, header, parser };
|
|
22
|
+
}
|
|
23
|
+
async configure(opts) {
|
|
24
|
+
if (!this.cached) {
|
|
25
|
+
this.cached = this.configurePre(opts).catch(e => {
|
|
26
|
+
this.cached = undefined;
|
|
27
|
+
throw e;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return this.cached;
|
|
31
|
+
}
|
|
32
|
+
async getRefNames(opts) {
|
|
33
|
+
const { header } = await this.configure(opts);
|
|
34
|
+
return Object.keys(header.refsByName);
|
|
35
|
+
}
|
|
36
|
+
async getHeader(opts) {
|
|
37
|
+
const { parser, header } = await this.configure(opts);
|
|
38
|
+
const { version, fileType } = header;
|
|
39
|
+
const { fields, ...rest } = parser.autoSql;
|
|
40
|
+
return {
|
|
41
|
+
version,
|
|
42
|
+
fileType,
|
|
43
|
+
autoSql: { ...rest },
|
|
44
|
+
fields: Object.fromEntries(fields.map(({ name, comment }) => [name, comment])),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
getFeatures(region, opts = {}) {
|
|
48
|
+
const { refName, start, end } = region;
|
|
49
|
+
const { signal } = opts;
|
|
50
|
+
return ObservableCreate(async (observer) => {
|
|
51
|
+
try {
|
|
52
|
+
const { parser, bigbed } = await this.configure(opts);
|
|
53
|
+
const ob = await bigbed.getFeatureStream(refName, start, end, {
|
|
54
|
+
signal,
|
|
55
|
+
basesPerSpan: end - start,
|
|
56
|
+
});
|
|
57
|
+
ob.pipe(mergeAll(), map(r => {
|
|
58
|
+
const data = parser.parseLine(`${refName}\t${r.start}\t${r.end}\t${r.rest}`, {
|
|
59
|
+
uniqueId: r.uniqueId,
|
|
60
|
+
});
|
|
61
|
+
const { blockCount, blockSizes, blockStarts, chromStarts } = data;
|
|
62
|
+
if (blockCount) {
|
|
63
|
+
const starts = chromStarts || blockStarts || [];
|
|
64
|
+
const sizes = blockSizes;
|
|
65
|
+
const blocksOffset = r.start;
|
|
66
|
+
data.subfeatures = [];
|
|
67
|
+
for (let b = 0; b < blockCount; b += 1) {
|
|
68
|
+
const bmin = (starts[b] || 0) + blocksOffset;
|
|
69
|
+
const bmax = bmin + (sizes[b] || 0);
|
|
70
|
+
data.subfeatures.push({
|
|
71
|
+
uniqueId: `${r.uniqueId}-${b}`,
|
|
72
|
+
start: bmin,
|
|
73
|
+
end: bmax,
|
|
74
|
+
type: 'block',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (r.uniqueId === undefined) {
|
|
79
|
+
throw new Error('invalid bbi feature');
|
|
80
|
+
}
|
|
81
|
+
const { chromStart, chromEnd, chrom, ...rest } = data;
|
|
82
|
+
const f = new SimpleFeature({
|
|
83
|
+
id: `${this.id}-${r.uniqueId}`,
|
|
84
|
+
data: {
|
|
85
|
+
...rest,
|
|
86
|
+
start: r.start,
|
|
87
|
+
end: r.end,
|
|
88
|
+
refName,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
// collection of heuristics for suggesting that this feature
|
|
92
|
+
// should be converted to a gene, CNV bigbed has many gene like
|
|
93
|
+
// features including thickStart and blockCount but no strand
|
|
94
|
+
return isUCSC(f) ? ucscProcessedTranscript(f) : f;
|
|
95
|
+
})).subscribe(observer);
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
observer.error(e);
|
|
99
|
+
}
|
|
100
|
+
}, opts.signal);
|
|
101
|
+
}
|
|
102
|
+
freeResources() { }
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=BigBedAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigBedAdapter.js","sourceRoot":"","sources":["../../src/BigBedAdapter/BigBedAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ConfigurationSchema } from '@jbrowse/core/configuration';
|
|
2
|
+
export default ConfigurationSchema('BigBedAdapter', {
|
|
3
|
+
bigBedLocation: {
|
|
4
|
+
type: 'fileLocation',
|
|
5
|
+
defaultValue: { uri: '/path/to/my.bb', locationType: 'UriLocation' },
|
|
6
|
+
},
|
|
7
|
+
}, { explicitlyTyped: true });
|
|
8
|
+
//# sourceMappingURL=configSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/BigBedAdapter/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,eAAe,mBAAmB,CAChC,eAAe,EACf;IACE,cAAc,EAAE;QACd,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE;KACrE;CACF,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as configSchema } from './configSchema';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/BigBedAdapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
package/esm/index.d.ts
ADDED
package/esm/index.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType';
|
|
2
|
+
import Plugin from '@jbrowse/core/Plugin';
|
|
3
|
+
import { configSchema as bigBedAdapterConfigSchema } from './BigBedAdapter';
|
|
4
|
+
import { configSchema as bedTabixAdapterConfigSchema } from './BedTabixAdapter';
|
|
5
|
+
import { configSchema as bedAdapterConfigSchema } from './BedAdapter';
|
|
6
|
+
import { getFileName, makeIndex, makeIndexType, } from '@jbrowse/core/util/tracks';
|
|
7
|
+
export default class BedPlugin extends Plugin {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.name = 'BedPlugin';
|
|
11
|
+
}
|
|
12
|
+
install(pluginManager) {
|
|
13
|
+
pluginManager.addAdapterType(() => new AdapterType({
|
|
14
|
+
name: 'BigBedAdapter',
|
|
15
|
+
configSchema: bigBedAdapterConfigSchema,
|
|
16
|
+
getAdapterClass: () => import('./BigBedAdapter/BigBedAdapter').then(r => r.default),
|
|
17
|
+
}));
|
|
18
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
|
|
19
|
+
return (file, index, adapterHint) => {
|
|
20
|
+
const regexGuess = /\.(bb|bigbed)$/i;
|
|
21
|
+
const adapterName = 'BigBedAdapter';
|
|
22
|
+
const fileName = getFileName(file);
|
|
23
|
+
const obj = {
|
|
24
|
+
type: adapterName,
|
|
25
|
+
bigBedLocation: file,
|
|
26
|
+
};
|
|
27
|
+
if (regexGuess.test(fileName) && !adapterHint) {
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
else if (adapterHint === adapterName) {
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
return adapterGuesser(file, index, adapterHint);
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
pluginManager.addAdapterType(() => new AdapterType({
|
|
37
|
+
name: 'BedTabixAdapter',
|
|
38
|
+
configSchema: bedTabixAdapterConfigSchema,
|
|
39
|
+
getAdapterClass: () => import('./BedTabixAdapter/BedTabixAdapter').then(r => r.default),
|
|
40
|
+
}));
|
|
41
|
+
pluginManager.addAdapterType(() => new AdapterType({
|
|
42
|
+
name: 'BedAdapter',
|
|
43
|
+
configSchema: bedAdapterConfigSchema,
|
|
44
|
+
getAdapterClass: () => import('./BedAdapter/BedAdapter').then(r => r.default),
|
|
45
|
+
}));
|
|
46
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
|
|
47
|
+
return (file, index, adapterHint) => {
|
|
48
|
+
const regexGuess = /\.bed\.b?gz$/i;
|
|
49
|
+
const adapterName = 'BedTabixAdapter';
|
|
50
|
+
const fileName = getFileName(file);
|
|
51
|
+
const indexName = index && getFileName(index);
|
|
52
|
+
if (regexGuess.test(fileName) || adapterHint === adapterName) {
|
|
53
|
+
return {
|
|
54
|
+
type: adapterName,
|
|
55
|
+
bedGzLocation: file,
|
|
56
|
+
index: {
|
|
57
|
+
location: index || makeIndex(file, '.tbi'),
|
|
58
|
+
indexType: makeIndexType(indexName, 'CSI', 'TBI'),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return adapterGuesser(file, index, adapterHint);
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
|
|
66
|
+
return (file, index, adapterHint) => {
|
|
67
|
+
const regexGuess = /\.bed$/i;
|
|
68
|
+
const adapterName = 'BedAdapter';
|
|
69
|
+
const fileName = getFileName(file);
|
|
70
|
+
if (regexGuess.test(fileName) || adapterHint === adapterName) {
|
|
71
|
+
return {
|
|
72
|
+
type: adapterName,
|
|
73
|
+
bedLocation: file,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return adapterGuesser(file, index, adapterHint);
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|