@jbrowse/plugin-bed 2.17.0 → 3.0.0
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 +15 -5
- package/dist/BedAdapter/BedAdapter.js +7 -10
- package/dist/BedAdapter/configSchema.d.ts +0 -21
- package/dist/BedAdapter/configSchema.js +1 -25
- package/dist/BedAdapter/index.d.ts +1 -1
- package/dist/BedAdapter/index.js +17 -7
- package/dist/BedGraphAdapter/BedGraphAdapter.d.ts +24 -0
- package/dist/BedGraphAdapter/BedGraphAdapter.js +130 -0
- package/dist/BedGraphAdapter/configSchema.d.ts +15 -0
- package/dist/BedGraphAdapter/configSchema.js +19 -0
- package/dist/BedGraphAdapter/index.d.ts +2 -0
- package/dist/BedGraphAdapter/index.js +49 -0
- package/dist/BedGraphTabixAdapter/BedGraphTabixAdapter.d.ts +18 -0
- package/dist/BedGraphTabixAdapter/BedGraphTabixAdapter.js +108 -0
- package/dist/BedGraphTabixAdapter/configSchema.d.ts +29 -0
- package/dist/BedGraphTabixAdapter/configSchema.js +34 -0
- package/dist/BedGraphTabixAdapter/index.d.ts +2 -0
- package/dist/BedGraphTabixAdapter/index.js +49 -0
- package/dist/BedTabixAdapter/BedTabixAdapter.d.ts +6 -5
- package/dist/BedTabixAdapter/BedTabixAdapter.js +12 -5
- package/dist/BedTabixAdapter/configSchema.d.ts +0 -18
- package/dist/BedTabixAdapter/configSchema.js +1 -22
- package/dist/BedTabixAdapter/index.d.ts +1 -1
- package/dist/BedTabixAdapter/index.js +17 -7
- package/dist/BedpeAdapter/BedpeAdapter.d.ts +3 -3
- package/dist/BedpeAdapter/BedpeAdapter.js +7 -64
- package/dist/BedpeAdapter/configSchema.d.ts +0 -7
- package/dist/BedpeAdapter/configSchema.js +1 -12
- package/dist/BedpeAdapter/index.d.ts +1 -1
- package/dist/BedpeAdapter/index.js +17 -7
- package/dist/BedpeAdapter/util.d.ts +2 -0
- package/dist/BedpeAdapter/util.js +55 -0
- package/dist/BigBedAdapter/BigBedAdapter.d.ts +5 -4
- package/dist/BigBedAdapter/BigBedAdapter.js +13 -8
- package/dist/BigBedAdapter/configSchema.d.ts +0 -9
- package/dist/BigBedAdapter/configSchema.js +2 -14
- package/dist/BigBedAdapter/index.d.ts +1 -1
- package/dist/BigBedAdapter/index.js +17 -7
- package/dist/GuessAdapter/index.d.ts +2 -0
- package/dist/GuessAdapter/index.js +68 -0
- package/dist/generateBedMethylFeature.d.ts +3 -3
- package/dist/generateBedMethylFeature.js +6 -6
- package/dist/generateRepeatMaskerFeature.js +2 -1
- package/dist/generateUcscTranscript.d.ts +1 -1
- package/dist/generateUcscTranscript.js +4 -6
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -72
- package/dist/util.d.ts +171 -6
- package/dist/util.js +65 -61
- package/esm/BedAdapter/BedAdapter.d.ts +15 -5
- package/esm/BedAdapter/BedAdapter.js +8 -11
- package/esm/BedAdapter/configSchema.d.ts +0 -21
- package/esm/BedAdapter/configSchema.js +1 -25
- package/esm/BedAdapter/index.d.ts +1 -1
- package/esm/BedGraphAdapter/BedGraphAdapter.d.ts +24 -0
- package/esm/BedGraphAdapter/BedGraphAdapter.js +124 -0
- package/esm/BedGraphAdapter/configSchema.d.ts +15 -0
- package/esm/BedGraphAdapter/configSchema.js +17 -0
- package/esm/BedGraphAdapter/index.d.ts +2 -0
- package/esm/BedGraphAdapter/index.js +10 -0
- package/esm/BedGraphTabixAdapter/BedGraphTabixAdapter.d.ts +18 -0
- package/esm/BedGraphTabixAdapter/BedGraphTabixAdapter.js +105 -0
- package/esm/BedGraphTabixAdapter/configSchema.d.ts +29 -0
- package/esm/BedGraphTabixAdapter/configSchema.js +32 -0
- package/esm/BedGraphTabixAdapter/index.d.ts +2 -0
- package/esm/BedGraphTabixAdapter/index.js +10 -0
- package/esm/BedTabixAdapter/BedTabixAdapter.d.ts +6 -5
- package/esm/BedTabixAdapter/BedTabixAdapter.js +13 -6
- package/esm/BedTabixAdapter/configSchema.d.ts +0 -18
- package/esm/BedTabixAdapter/configSchema.js +1 -22
- package/esm/BedTabixAdapter/index.d.ts +1 -1
- package/esm/BedpeAdapter/BedpeAdapter.d.ts +3 -3
- package/esm/BedpeAdapter/BedpeAdapter.js +6 -62
- package/esm/BedpeAdapter/configSchema.d.ts +0 -7
- package/esm/BedpeAdapter/configSchema.js +1 -12
- package/esm/BedpeAdapter/index.d.ts +1 -1
- package/esm/BedpeAdapter/util.d.ts +2 -0
- package/esm/BedpeAdapter/util.js +52 -0
- package/esm/BigBedAdapter/BigBedAdapter.d.ts +5 -4
- package/esm/BigBedAdapter/BigBedAdapter.js +14 -9
- package/esm/BigBedAdapter/configSchema.d.ts +0 -9
- package/esm/BigBedAdapter/configSchema.js +2 -14
- package/esm/BigBedAdapter/index.d.ts +1 -1
- package/esm/GuessAdapter/index.d.ts +2 -0
- package/esm/GuessAdapter/index.js +65 -0
- package/esm/generateBedMethylFeature.d.ts +3 -3
- package/esm/generateBedMethylFeature.js +6 -6
- package/esm/generateRepeatMaskerFeature.js +2 -1
- package/esm/generateUcscTranscript.d.ts +1 -1
- package/esm/generateUcscTranscript.js +4 -6
- package/esm/index.d.ts +1 -1
- package/esm/index.js +9 -72
- package/esm/util.d.ts +171 -6
- package/esm/util.js +65 -61
- package/package.json +5 -5
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import BED from '@gmod/bed';
|
|
2
|
-
import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
|
-
import { Region, Feature } from '@jbrowse/core/util';
|
|
4
1
|
import IntervalTree from '@flatten-js/interval-tree';
|
|
2
|
+
import BED from '@gmod/bed';
|
|
3
|
+
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
4
|
+
import type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
5
|
+
import type { Feature, Region } from '@jbrowse/core/util';
|
|
5
6
|
export default class BedAdapter extends BaseFeatureDataAdapter {
|
|
6
7
|
protected bedFeatures?: Promise<{
|
|
7
8
|
header: string;
|
|
@@ -16,12 +17,21 @@ export default class BedAdapter extends BaseFeatureDataAdapter {
|
|
|
16
17
|
protected intervalTrees: Record<string, Promise<IntervalTree | undefined> | undefined>;
|
|
17
18
|
static capabilities: string[];
|
|
18
19
|
private loadDataP;
|
|
19
|
-
|
|
20
|
+
loadData(opts?: BaseOptions): Promise<{
|
|
21
|
+
header: string;
|
|
22
|
+
features: Record<string, string[]>;
|
|
23
|
+
parser: BED;
|
|
24
|
+
columnNames: string[];
|
|
25
|
+
scoreColumn: string;
|
|
26
|
+
colRef: number;
|
|
27
|
+
colStart: number;
|
|
28
|
+
colEnd: number;
|
|
29
|
+
}>;
|
|
20
30
|
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
21
31
|
getHeader(opts?: BaseOptions): Promise<string>;
|
|
22
32
|
getNames(): Promise<string[] | undefined>;
|
|
23
33
|
private loadFeatureIntervalTreeHelper;
|
|
24
|
-
|
|
34
|
+
loadFeatureIntervalTree(refName: string): Promise<IntervalTree<any> | undefined>;
|
|
25
35
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
26
36
|
freeResources(): void;
|
|
27
37
|
}
|
|
@@ -3,13 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const interval_tree_1 = __importDefault(require("@flatten-js/interval-tree"));
|
|
6
7
|
const bed_1 = __importDefault(require("@gmod/bed"));
|
|
7
8
|
const BaseAdapter_1 = require("@jbrowse/core/data_adapters/BaseAdapter");
|
|
9
|
+
const util_1 = require("@jbrowse/core/util");
|
|
8
10
|
const io_1 = require("@jbrowse/core/util/io");
|
|
9
11
|
const rxjs_1 = require("@jbrowse/core/util/rxjs");
|
|
10
|
-
const util_1 = require("@jbrowse/core/util");
|
|
11
|
-
const interval_tree_1 = __importDefault(require("@flatten-js/interval-tree"));
|
|
12
|
-
// locals
|
|
13
12
|
const util_2 = require("../util");
|
|
14
13
|
class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
15
14
|
constructor() {
|
|
@@ -20,7 +19,6 @@ class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
20
19
|
const pm = this.pluginManager;
|
|
21
20
|
const bedLoc = this.getConf('bedLocation');
|
|
22
21
|
const buffer = await (0, util_1.fetchAndMaybeUnzip)((0, io_1.openLocation)(bedLoc, pm), opts);
|
|
23
|
-
// 512MB max chrome string length is 512MB
|
|
24
22
|
if (buffer.length > 536870888) {
|
|
25
23
|
throw new Error('Data exceeds maximum string length (512MB)');
|
|
26
24
|
}
|
|
@@ -99,9 +97,10 @@ class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
99
97
|
}
|
|
100
98
|
const names = await this.getNames();
|
|
101
99
|
const intervalTree = new interval_tree_1.default();
|
|
102
|
-
|
|
100
|
+
for (let i = 0; i < lines.length; i++) {
|
|
101
|
+
const line = lines[i];
|
|
103
102
|
const uniqueId = `${this.id}-${refName}-${i}`;
|
|
104
|
-
|
|
103
|
+
const feat = new util_1.SimpleFeature((0, util_2.featureData)({
|
|
105
104
|
line,
|
|
106
105
|
colRef,
|
|
107
106
|
colStart,
|
|
@@ -111,9 +110,7 @@ class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
111
110
|
uniqueId,
|
|
112
111
|
names,
|
|
113
112
|
}));
|
|
114
|
-
|
|
115
|
-
for (const obj of ret) {
|
|
116
|
-
intervalTree.insert([obj.get('start'), obj.get('end')], obj);
|
|
113
|
+
intervalTree.insert([feat.get('start'), feat.get('end')], feat);
|
|
117
114
|
}
|
|
118
115
|
return intervalTree;
|
|
119
116
|
}
|
|
@@ -134,7 +131,7 @@ class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
134
131
|
observer.next(f);
|
|
135
132
|
});
|
|
136
133
|
observer.complete();
|
|
137
|
-
}, opts.
|
|
134
|
+
}, opts.stopToken);
|
|
138
135
|
}
|
|
139
136
|
freeResources() { }
|
|
140
137
|
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
declare const BedAdapter: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
|
|
2
|
-
/**
|
|
3
|
-
* #slot
|
|
4
|
-
*/
|
|
5
2
|
bedLocation: {
|
|
6
3
|
type: string;
|
|
7
4
|
defaultValue: {
|
|
@@ -9,49 +6,31 @@ declare const BedAdapter: import("@jbrowse/core/configuration/configurationSchem
|
|
|
9
6
|
locationType: string;
|
|
10
7
|
};
|
|
11
8
|
};
|
|
12
|
-
/**
|
|
13
|
-
* #slot
|
|
14
|
-
*/
|
|
15
9
|
columnNames: {
|
|
16
10
|
type: string;
|
|
17
11
|
description: string;
|
|
18
12
|
defaultValue: never[];
|
|
19
13
|
};
|
|
20
|
-
/**
|
|
21
|
-
* #slot
|
|
22
|
-
*/
|
|
23
14
|
scoreColumn: {
|
|
24
15
|
type: string;
|
|
25
16
|
description: string;
|
|
26
17
|
defaultValue: string;
|
|
27
18
|
};
|
|
28
|
-
/**
|
|
29
|
-
* #slot
|
|
30
|
-
*/
|
|
31
19
|
autoSql: {
|
|
32
20
|
type: string;
|
|
33
21
|
description: string;
|
|
34
22
|
defaultValue: string;
|
|
35
23
|
};
|
|
36
|
-
/**
|
|
37
|
-
* #slot
|
|
38
|
-
*/
|
|
39
24
|
colRef: {
|
|
40
25
|
type: string;
|
|
41
26
|
description: string;
|
|
42
27
|
defaultValue: number;
|
|
43
28
|
};
|
|
44
|
-
/**
|
|
45
|
-
* #slot
|
|
46
|
-
*/
|
|
47
29
|
colStart: {
|
|
48
30
|
type: string;
|
|
49
31
|
description: string;
|
|
50
32
|
defaultValue: number;
|
|
51
33
|
};
|
|
52
|
-
/**
|
|
53
|
-
* #slot
|
|
54
|
-
*/
|
|
55
34
|
colEnd: {
|
|
56
35
|
type: string;
|
|
57
36
|
description: string;
|
|
@@ -1,61 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const configuration_1 = require("@jbrowse/core/configuration");
|
|
4
|
-
|
|
5
|
-
* #config BedAdapter
|
|
6
|
-
*/
|
|
7
|
-
function x() { } // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
4
|
+
function x() { }
|
|
8
5
|
const BedAdapter = (0, configuration_1.ConfigurationSchema)('BedAdapter', {
|
|
9
|
-
/**
|
|
10
|
-
* #slot
|
|
11
|
-
*/
|
|
12
6
|
bedLocation: {
|
|
13
7
|
type: 'fileLocation',
|
|
14
8
|
defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },
|
|
15
9
|
},
|
|
16
|
-
/**
|
|
17
|
-
* #slot
|
|
18
|
-
*/
|
|
19
10
|
columnNames: {
|
|
20
11
|
type: 'stringArray',
|
|
21
12
|
description: 'List of column names',
|
|
22
13
|
defaultValue: [],
|
|
23
14
|
},
|
|
24
|
-
/**
|
|
25
|
-
* #slot
|
|
26
|
-
*/
|
|
27
15
|
scoreColumn: {
|
|
28
16
|
type: 'string',
|
|
29
17
|
description: 'The column to use as a "score" attribute',
|
|
30
18
|
defaultValue: '',
|
|
31
19
|
},
|
|
32
|
-
/**
|
|
33
|
-
* #slot
|
|
34
|
-
*/
|
|
35
20
|
autoSql: {
|
|
36
21
|
type: 'string',
|
|
37
22
|
description: 'The autoSql definition for the data fields in the file',
|
|
38
23
|
defaultValue: '',
|
|
39
24
|
},
|
|
40
|
-
/**
|
|
41
|
-
* #slot
|
|
42
|
-
*/
|
|
43
25
|
colRef: {
|
|
44
26
|
type: 'number',
|
|
45
27
|
description: 'The column to use as a "refName" attribute',
|
|
46
28
|
defaultValue: 0,
|
|
47
29
|
},
|
|
48
|
-
/**
|
|
49
|
-
* #slot
|
|
50
|
-
*/
|
|
51
30
|
colStart: {
|
|
52
31
|
type: 'number',
|
|
53
32
|
description: 'The column to use as a "start" attribute',
|
|
54
33
|
defaultValue: 1,
|
|
55
34
|
},
|
|
56
|
-
/**
|
|
57
|
-
* #slot
|
|
58
|
-
*/
|
|
59
35
|
colEnd: {
|
|
60
36
|
type: 'number',
|
|
61
37
|
description: 'The column to use as a "end" attribute',
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import PluginManager from '@jbrowse/core/PluginManager';
|
|
1
|
+
import type PluginManager from '@jbrowse/core/PluginManager';
|
|
2
2
|
export default function BedAdapterF(pluginManager: PluginManager): void;
|
package/dist/BedAdapter/index.js
CHANGED
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import IntervalTree from '@flatten-js/interval-tree';
|
|
2
|
+
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
|
+
import type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
4
|
+
import type { Feature, Region } from '@jbrowse/core/util';
|
|
5
|
+
export default class BedGraphAdapter extends BaseFeatureDataAdapter {
|
|
6
|
+
protected bedFeatures?: Promise<{
|
|
7
|
+
header: string;
|
|
8
|
+
features: Record<string, string[]>;
|
|
9
|
+
columnNames: string[];
|
|
10
|
+
}>;
|
|
11
|
+
protected intervalTrees: Record<string, Promise<IntervalTree | undefined> | undefined>;
|
|
12
|
+
getNames(): Promise<string[] | undefined>;
|
|
13
|
+
private loadFeatureIntervalTreeHelper;
|
|
14
|
+
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
15
|
+
private loadDataP;
|
|
16
|
+
loadFeatureIntervalTree(refName: string): Promise<IntervalTree<any> | undefined>;
|
|
17
|
+
loadData(opts?: BaseOptions): Promise<{
|
|
18
|
+
header: string;
|
|
19
|
+
features: Record<string, string[]>;
|
|
20
|
+
columnNames: string[];
|
|
21
|
+
}>;
|
|
22
|
+
getFeatures(query: Region, _opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
23
|
+
freeResources(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const interval_tree_1 = __importDefault(require("@flatten-js/interval-tree"));
|
|
7
|
+
const BaseAdapter_1 = require("@jbrowse/core/data_adapters/BaseAdapter");
|
|
8
|
+
const util_1 = require("@jbrowse/core/util");
|
|
9
|
+
const io_1 = require("@jbrowse/core/util/io");
|
|
10
|
+
const rxjs_1 = require("@jbrowse/core/util/rxjs");
|
|
11
|
+
class BedGraphAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.intervalTrees = {};
|
|
15
|
+
}
|
|
16
|
+
async getNames() {
|
|
17
|
+
const { header, columnNames } = await this.loadData();
|
|
18
|
+
if (columnNames.length) {
|
|
19
|
+
return columnNames;
|
|
20
|
+
}
|
|
21
|
+
const defs = header.split(/\n|\r\n|\r/).filter(f => !!f);
|
|
22
|
+
const defline = defs.at(-1);
|
|
23
|
+
return (defline === null || defline === void 0 ? void 0 : defline.includes('\t'))
|
|
24
|
+
? defline
|
|
25
|
+
.slice(1)
|
|
26
|
+
.split('\t')
|
|
27
|
+
.map(field => field.trim())
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
async loadFeatureIntervalTreeHelper(refName) {
|
|
31
|
+
var _a;
|
|
32
|
+
const { features } = await this.loadData();
|
|
33
|
+
const lines = features[refName];
|
|
34
|
+
if (!lines) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const names = ((_a = (await this.getNames())) === null || _a === void 0 ? void 0 : _a.slice(3)) || [];
|
|
38
|
+
const intervalTree = new interval_tree_1.default();
|
|
39
|
+
for (let i = 0; i < lines.length; i++) {
|
|
40
|
+
const line = lines[i];
|
|
41
|
+
const [refName, s, e, ...rest] = line.split('\t');
|
|
42
|
+
for (let j = 0; j < rest.length; j++) {
|
|
43
|
+
const uniqueId = `${this.id}-${refName}-${i}-${j}`;
|
|
44
|
+
const start = +s;
|
|
45
|
+
const end = +e;
|
|
46
|
+
const score = +rest[j];
|
|
47
|
+
const source = names[j] || `col${j}`;
|
|
48
|
+
if (score) {
|
|
49
|
+
intervalTree.insert([start, end], new util_1.SimpleFeature({
|
|
50
|
+
id: uniqueId,
|
|
51
|
+
data: {
|
|
52
|
+
refName,
|
|
53
|
+
start,
|
|
54
|
+
end,
|
|
55
|
+
score,
|
|
56
|
+
source,
|
|
57
|
+
},
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return intervalTree;
|
|
63
|
+
}
|
|
64
|
+
async getRefNames(opts = {}) {
|
|
65
|
+
const { features } = await this.loadData(opts);
|
|
66
|
+
return Object.keys(features);
|
|
67
|
+
}
|
|
68
|
+
async loadDataP(opts = {}) {
|
|
69
|
+
const pm = this.pluginManager;
|
|
70
|
+
const bedLoc = this.getConf('bedGraphLocation');
|
|
71
|
+
const buffer = await (0, util_1.fetchAndMaybeUnzip)((0, io_1.openLocation)(bedLoc, pm), opts);
|
|
72
|
+
if (buffer.length > 536870888) {
|
|
73
|
+
throw new Error('Data exceeds maximum string length (512MB)');
|
|
74
|
+
}
|
|
75
|
+
const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
|
|
76
|
+
const lines = data.split(/\n|\r\n|\r/).filter(f => !!f);
|
|
77
|
+
const headerLines = [];
|
|
78
|
+
let i = 0;
|
|
79
|
+
for (; i < lines.length && lines[i].startsWith('#'); i++) {
|
|
80
|
+
headerLines.push(lines[i]);
|
|
81
|
+
}
|
|
82
|
+
const header = headerLines.join('\n');
|
|
83
|
+
const features = {};
|
|
84
|
+
for (; i < lines.length; i++) {
|
|
85
|
+
const line = lines[i];
|
|
86
|
+
const tab = line.indexOf('\t');
|
|
87
|
+
const refName = line.slice(0, tab);
|
|
88
|
+
if (!features[refName]) {
|
|
89
|
+
features[refName] = [];
|
|
90
|
+
}
|
|
91
|
+
features[refName].push(line);
|
|
92
|
+
}
|
|
93
|
+
const columnNames = this.getConf('columnNames');
|
|
94
|
+
return {
|
|
95
|
+
header,
|
|
96
|
+
features,
|
|
97
|
+
columnNames,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async loadFeatureIntervalTree(refName) {
|
|
101
|
+
if (!this.intervalTrees[refName]) {
|
|
102
|
+
this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(refName).catch((e) => {
|
|
103
|
+
this.intervalTrees[refName] = undefined;
|
|
104
|
+
throw e;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return this.intervalTrees[refName];
|
|
108
|
+
}
|
|
109
|
+
async loadData(opts = {}) {
|
|
110
|
+
if (!this.bedFeatures) {
|
|
111
|
+
this.bedFeatures = this.loadDataP(opts).catch((e) => {
|
|
112
|
+
this.bedFeatures = undefined;
|
|
113
|
+
throw e;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return this.bedFeatures;
|
|
117
|
+
}
|
|
118
|
+
getFeatures(query, _opts = {}) {
|
|
119
|
+
return (0, rxjs_1.ObservableCreate)(async (observer) => {
|
|
120
|
+
const { start, end, refName } = query;
|
|
121
|
+
const intervalTree = await this.loadFeatureIntervalTree(refName);
|
|
122
|
+
intervalTree === null || intervalTree === void 0 ? void 0 : intervalTree.search([start, end]).forEach(f => {
|
|
123
|
+
observer.next(f);
|
|
124
|
+
});
|
|
125
|
+
observer.complete();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
freeResources() { }
|
|
129
|
+
}
|
|
130
|
+
exports.default = BedGraphAdapter;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare const BedGraphAdapter: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
|
|
2
|
+
bedGraphLocation: {
|
|
3
|
+
type: string;
|
|
4
|
+
defaultValue: {
|
|
5
|
+
uri: string;
|
|
6
|
+
locationType: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
columnNames: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
defaultValue: never[];
|
|
13
|
+
};
|
|
14
|
+
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
|
|
15
|
+
export default BedGraphAdapter;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const configuration_1 = require("@jbrowse/core/configuration");
|
|
4
|
+
function x() { }
|
|
5
|
+
const BedGraphAdapter = (0, configuration_1.ConfigurationSchema)('BedGraphAdapter', {
|
|
6
|
+
bedGraphLocation: {
|
|
7
|
+
type: 'fileLocation',
|
|
8
|
+
defaultValue: {
|
|
9
|
+
uri: '/path/to/my.bedgraph',
|
|
10
|
+
locationType: 'UriLocation',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
columnNames: {
|
|
14
|
+
type: 'stringArray',
|
|
15
|
+
description: 'List of column names',
|
|
16
|
+
defaultValue: [],
|
|
17
|
+
},
|
|
18
|
+
}, { explicitlyTyped: true });
|
|
19
|
+
exports.default = BedGraphAdapter;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.default = BedGraphAdapterF;
|
|
40
|
+
const AdapterType_1 = __importDefault(require("@jbrowse/core/pluggableElementTypes/AdapterType"));
|
|
41
|
+
const configSchema_1 = __importDefault(require("./configSchema"));
|
|
42
|
+
function BedGraphAdapterF(pluginManager) {
|
|
43
|
+
pluginManager.addAdapterType(() => new AdapterType_1.default({
|
|
44
|
+
name: 'BedGraphAdapter',
|
|
45
|
+
displayName: 'BedGraph adapter',
|
|
46
|
+
configSchema: configSchema_1.default,
|
|
47
|
+
getAdapterClass: () => Promise.resolve().then(() => __importStar(require('./BedGraphAdapter'))).then(r => r.default),
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TabixIndexedFile } from '@gmod/tabix';
|
|
2
|
+
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
|
+
import type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
4
|
+
import type { Feature, Region } from '@jbrowse/core/util';
|
|
5
|
+
export default class BedGraphAdapter extends BaseFeatureDataAdapter {
|
|
6
|
+
private configured?;
|
|
7
|
+
private configurePre;
|
|
8
|
+
protected configure(): Promise<{
|
|
9
|
+
bedGraph: TabixIndexedFile;
|
|
10
|
+
header: string;
|
|
11
|
+
columnNames: string[];
|
|
12
|
+
}>;
|
|
13
|
+
getNames(): Promise<string[] | undefined>;
|
|
14
|
+
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
15
|
+
getHeader(): Promise<string>;
|
|
16
|
+
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
17
|
+
freeResources(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tabix_1 = require("@gmod/tabix");
|
|
4
|
+
const BaseAdapter_1 = require("@jbrowse/core/data_adapters/BaseAdapter");
|
|
5
|
+
const util_1 = require("@jbrowse/core/util");
|
|
6
|
+
const io_1 = require("@jbrowse/core/util/io");
|
|
7
|
+
const rxjs_1 = require("@jbrowse/core/util/rxjs");
|
|
8
|
+
class BedGraphAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
9
|
+
async configurePre() {
|
|
10
|
+
const pm = this.pluginManager;
|
|
11
|
+
const bedGraphGzLocation = this.getConf('bedGraphGzLocation');
|
|
12
|
+
const location = this.getConf(['index', 'location']);
|
|
13
|
+
const indexType = this.getConf(['index', 'indexType']);
|
|
14
|
+
const filehandle = (0, io_1.openLocation)(bedGraphGzLocation, pm);
|
|
15
|
+
const isCSI = indexType === 'CSI';
|
|
16
|
+
const bedGraph = new tabix_1.TabixIndexedFile({
|
|
17
|
+
filehandle,
|
|
18
|
+
csiFilehandle: isCSI ? (0, io_1.openLocation)(location, pm) : undefined,
|
|
19
|
+
tbiFilehandle: !isCSI ? (0, io_1.openLocation)(location, pm) : undefined,
|
|
20
|
+
chunkCacheSize: 50 * 2 ** 20,
|
|
21
|
+
});
|
|
22
|
+
const columnNames = this.getConf('columnNames');
|
|
23
|
+
const header = await bedGraph.getHeader();
|
|
24
|
+
return {
|
|
25
|
+
columnNames,
|
|
26
|
+
bedGraph,
|
|
27
|
+
header,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async configure() {
|
|
31
|
+
if (!this.configured) {
|
|
32
|
+
this.configured = this.configurePre().catch((e) => {
|
|
33
|
+
this.configured = undefined;
|
|
34
|
+
throw e;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return this.configured;
|
|
38
|
+
}
|
|
39
|
+
async getNames() {
|
|
40
|
+
const { bedGraph, columnNames } = await this.configure();
|
|
41
|
+
if (columnNames.length) {
|
|
42
|
+
return columnNames;
|
|
43
|
+
}
|
|
44
|
+
const header = await bedGraph.getHeader();
|
|
45
|
+
const defs = header.split(/\n|\r\n|\r/).filter(f => !!f);
|
|
46
|
+
const defline = defs.at(-1);
|
|
47
|
+
return (defline === null || defline === void 0 ? void 0 : defline.includes('\t'))
|
|
48
|
+
? defline
|
|
49
|
+
.slice(1)
|
|
50
|
+
.split('\t')
|
|
51
|
+
.map(f => f.trim())
|
|
52
|
+
: undefined;
|
|
53
|
+
}
|
|
54
|
+
async getRefNames(opts = {}) {
|
|
55
|
+
const { bedGraph } = await this.configure();
|
|
56
|
+
return bedGraph.getReferenceSequenceNames(opts);
|
|
57
|
+
}
|
|
58
|
+
async getHeader() {
|
|
59
|
+
const { bedGraph } = await this.configure();
|
|
60
|
+
return bedGraph.getHeader();
|
|
61
|
+
}
|
|
62
|
+
getFeatures(query, opts = {}) {
|
|
63
|
+
return (0, rxjs_1.ObservableCreate)(async (observer) => {
|
|
64
|
+
var _a;
|
|
65
|
+
const { bedGraph } = await this.configure();
|
|
66
|
+
const meta = await bedGraph.getMetadata();
|
|
67
|
+
const { columnNumbers } = meta;
|
|
68
|
+
const colRef = columnNumbers.ref - 1;
|
|
69
|
+
const colStart = columnNumbers.start - 1;
|
|
70
|
+
const colEnd = columnNumbers.end - 1;
|
|
71
|
+
const same = colStart === colEnd;
|
|
72
|
+
const names = ((_a = (await this.getNames())) === null || _a === void 0 ? void 0 : _a.slice(same ? 2 : 3)) || [];
|
|
73
|
+
await bedGraph.getLines(query.refName, query.start + (same ? -1 : 0), query.end, {
|
|
74
|
+
lineCallback: (line, fileOffset) => {
|
|
75
|
+
const cols = line.split('\t');
|
|
76
|
+
const refName = cols[colRef];
|
|
77
|
+
const start = +cols[colStart];
|
|
78
|
+
const end = +(same ? start + 1 : cols[colEnd]);
|
|
79
|
+
const rest = cols.slice(colEnd + 1);
|
|
80
|
+
if (Number.isNaN(start) || Number.isNaN(end)) {
|
|
81
|
+
throw new Error(`start/end NaN on line "${line}", with colStart:${colStart} and colEnd:${colEnd}. run "tabix -p bed" to ensure bed preset`);
|
|
82
|
+
}
|
|
83
|
+
for (let j = 0; j < rest.length; j++) {
|
|
84
|
+
const uniqueId = `${this.id}-${fileOffset}-${j}`;
|
|
85
|
+
const score = Math.abs(+rest[j]);
|
|
86
|
+
const source = names[j] || `col${j}`;
|
|
87
|
+
if (score) {
|
|
88
|
+
observer.next(new util_1.SimpleFeature({
|
|
89
|
+
id: uniqueId,
|
|
90
|
+
data: {
|
|
91
|
+
refName,
|
|
92
|
+
start,
|
|
93
|
+
end,
|
|
94
|
+
score,
|
|
95
|
+
source,
|
|
96
|
+
},
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
...opts,
|
|
102
|
+
});
|
|
103
|
+
observer.complete();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
freeResources() { }
|
|
107
|
+
}
|
|
108
|
+
exports.default = BedGraphAdapter;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const BedGraphTabixAdapter: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
|
|
2
|
+
bedGraphGzLocation: {
|
|
3
|
+
type: string;
|
|
4
|
+
defaultValue: {
|
|
5
|
+
uri: string;
|
|
6
|
+
locationType: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
index: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
|
|
10
|
+
indexType: {
|
|
11
|
+
model: import("mobx-state-tree").ISimpleType<string>;
|
|
12
|
+
type: string;
|
|
13
|
+
defaultValue: string;
|
|
14
|
+
};
|
|
15
|
+
location: {
|
|
16
|
+
type: string;
|
|
17
|
+
defaultValue: {
|
|
18
|
+
uri: string;
|
|
19
|
+
locationType: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
|
|
23
|
+
columnNames: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
defaultValue: never[];
|
|
27
|
+
};
|
|
28
|
+
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
|
|
29
|
+
export default BedGraphTabixAdapter;
|