@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.
Files changed (95) hide show
  1. package/dist/BedAdapter/BedAdapter.d.ts +15 -5
  2. package/dist/BedAdapter/BedAdapter.js +7 -10
  3. package/dist/BedAdapter/configSchema.d.ts +0 -21
  4. package/dist/BedAdapter/configSchema.js +1 -25
  5. package/dist/BedAdapter/index.d.ts +1 -1
  6. package/dist/BedAdapter/index.js +17 -7
  7. package/dist/BedGraphAdapter/BedGraphAdapter.d.ts +24 -0
  8. package/dist/BedGraphAdapter/BedGraphAdapter.js +130 -0
  9. package/dist/BedGraphAdapter/configSchema.d.ts +15 -0
  10. package/dist/BedGraphAdapter/configSchema.js +19 -0
  11. package/dist/BedGraphAdapter/index.d.ts +2 -0
  12. package/dist/BedGraphAdapter/index.js +49 -0
  13. package/dist/BedGraphTabixAdapter/BedGraphTabixAdapter.d.ts +18 -0
  14. package/dist/BedGraphTabixAdapter/BedGraphTabixAdapter.js +108 -0
  15. package/dist/BedGraphTabixAdapter/configSchema.d.ts +29 -0
  16. package/dist/BedGraphTabixAdapter/configSchema.js +34 -0
  17. package/dist/BedGraphTabixAdapter/index.d.ts +2 -0
  18. package/dist/BedGraphTabixAdapter/index.js +49 -0
  19. package/dist/BedTabixAdapter/BedTabixAdapter.d.ts +6 -5
  20. package/dist/BedTabixAdapter/BedTabixAdapter.js +12 -5
  21. package/dist/BedTabixAdapter/configSchema.d.ts +0 -18
  22. package/dist/BedTabixAdapter/configSchema.js +1 -22
  23. package/dist/BedTabixAdapter/index.d.ts +1 -1
  24. package/dist/BedTabixAdapter/index.js +17 -7
  25. package/dist/BedpeAdapter/BedpeAdapter.d.ts +3 -3
  26. package/dist/BedpeAdapter/BedpeAdapter.js +7 -64
  27. package/dist/BedpeAdapter/configSchema.d.ts +0 -7
  28. package/dist/BedpeAdapter/configSchema.js +1 -12
  29. package/dist/BedpeAdapter/index.d.ts +1 -1
  30. package/dist/BedpeAdapter/index.js +17 -7
  31. package/dist/BedpeAdapter/util.d.ts +2 -0
  32. package/dist/BedpeAdapter/util.js +55 -0
  33. package/dist/BigBedAdapter/BigBedAdapter.d.ts +5 -4
  34. package/dist/BigBedAdapter/BigBedAdapter.js +13 -8
  35. package/dist/BigBedAdapter/configSchema.d.ts +0 -9
  36. package/dist/BigBedAdapter/configSchema.js +2 -14
  37. package/dist/BigBedAdapter/index.d.ts +1 -1
  38. package/dist/BigBedAdapter/index.js +17 -7
  39. package/dist/GuessAdapter/index.d.ts +2 -0
  40. package/dist/GuessAdapter/index.js +68 -0
  41. package/dist/generateBedMethylFeature.d.ts +3 -3
  42. package/dist/generateBedMethylFeature.js +6 -6
  43. package/dist/generateRepeatMaskerFeature.js +2 -1
  44. package/dist/generateUcscTranscript.d.ts +1 -1
  45. package/dist/generateUcscTranscript.js +4 -6
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.js +9 -72
  48. package/dist/util.d.ts +171 -6
  49. package/dist/util.js +65 -61
  50. package/esm/BedAdapter/BedAdapter.d.ts +15 -5
  51. package/esm/BedAdapter/BedAdapter.js +8 -11
  52. package/esm/BedAdapter/configSchema.d.ts +0 -21
  53. package/esm/BedAdapter/configSchema.js +1 -25
  54. package/esm/BedAdapter/index.d.ts +1 -1
  55. package/esm/BedGraphAdapter/BedGraphAdapter.d.ts +24 -0
  56. package/esm/BedGraphAdapter/BedGraphAdapter.js +124 -0
  57. package/esm/BedGraphAdapter/configSchema.d.ts +15 -0
  58. package/esm/BedGraphAdapter/configSchema.js +17 -0
  59. package/esm/BedGraphAdapter/index.d.ts +2 -0
  60. package/esm/BedGraphAdapter/index.js +10 -0
  61. package/esm/BedGraphTabixAdapter/BedGraphTabixAdapter.d.ts +18 -0
  62. package/esm/BedGraphTabixAdapter/BedGraphTabixAdapter.js +105 -0
  63. package/esm/BedGraphTabixAdapter/configSchema.d.ts +29 -0
  64. package/esm/BedGraphTabixAdapter/configSchema.js +32 -0
  65. package/esm/BedGraphTabixAdapter/index.d.ts +2 -0
  66. package/esm/BedGraphTabixAdapter/index.js +10 -0
  67. package/esm/BedTabixAdapter/BedTabixAdapter.d.ts +6 -5
  68. package/esm/BedTabixAdapter/BedTabixAdapter.js +13 -6
  69. package/esm/BedTabixAdapter/configSchema.d.ts +0 -18
  70. package/esm/BedTabixAdapter/configSchema.js +1 -22
  71. package/esm/BedTabixAdapter/index.d.ts +1 -1
  72. package/esm/BedpeAdapter/BedpeAdapter.d.ts +3 -3
  73. package/esm/BedpeAdapter/BedpeAdapter.js +6 -62
  74. package/esm/BedpeAdapter/configSchema.d.ts +0 -7
  75. package/esm/BedpeAdapter/configSchema.js +1 -12
  76. package/esm/BedpeAdapter/index.d.ts +1 -1
  77. package/esm/BedpeAdapter/util.d.ts +2 -0
  78. package/esm/BedpeAdapter/util.js +52 -0
  79. package/esm/BigBedAdapter/BigBedAdapter.d.ts +5 -4
  80. package/esm/BigBedAdapter/BigBedAdapter.js +14 -9
  81. package/esm/BigBedAdapter/configSchema.d.ts +0 -9
  82. package/esm/BigBedAdapter/configSchema.js +2 -14
  83. package/esm/BigBedAdapter/index.d.ts +1 -1
  84. package/esm/GuessAdapter/index.d.ts +2 -0
  85. package/esm/GuessAdapter/index.js +65 -0
  86. package/esm/generateBedMethylFeature.d.ts +3 -3
  87. package/esm/generateBedMethylFeature.js +6 -6
  88. package/esm/generateRepeatMaskerFeature.js +2 -1
  89. package/esm/generateUcscTranscript.d.ts +1 -1
  90. package/esm/generateUcscTranscript.js +4 -6
  91. package/esm/index.d.ts +1 -1
  92. package/esm/index.js +9 -72
  93. package/esm/util.d.ts +171 -6
  94. package/esm/util.js +65 -61
  95. package/package.json +5 -5
package/dist/util.js CHANGED
@@ -5,61 +5,60 @@ exports.featureData = featureData;
5
5
  exports.featureData2 = featureData2;
6
6
  exports.arrayify = arrayify;
7
7
  const generateBedMethylFeature_1 = require("./generateBedMethylFeature");
8
- const generateUcscTranscript_1 = require("./generateUcscTranscript");
9
8
  const generateRepeatMaskerFeature_1 = require("./generateRepeatMaskerFeature");
10
- function stringToStrand(f) {
11
- if (f === '-1') {
12
- return -1;
9
+ const generateUcscTranscript_1 = require("./generateUcscTranscript");
10
+ function defaultParser(fields, splitLine) {
11
+ let hasBlockCount = false;
12
+ const r = [];
13
+ for (let i = 0; i < splitLine.length; i++) {
14
+ if (fields[i] === 'blockCount') {
15
+ hasBlockCount = true;
16
+ }
17
+ r.push([fields[i], splitLine[i]]);
13
18
  }
14
- else if (f === '+') {
15
- return 1;
19
+ const obj = Object.fromEntries(r);
20
+ if (hasBlockCount) {
21
+ const { blockStarts, blockCount, chromStarts, thickEnd, thickStart, blockSizes, ...rest } = obj;
22
+ return {
23
+ ...rest,
24
+ blockStarts: arrayify(blockStarts),
25
+ chromStarts: arrayify(chromStarts),
26
+ blockSizes: arrayify(blockSizes),
27
+ thickStart: thickStart ? +thickStart : undefined,
28
+ thickEnd: thickEnd ? +thickEnd : undefined,
29
+ blockCount: blockCount ? +blockCount : undefined,
30
+ };
16
31
  }
17
32
  else {
18
- return 0;
33
+ return obj;
19
34
  }
20
35
  }
21
- function defaultParser(fields, line) {
22
- const obj = Object.fromEntries(line.split('\t').map((f, i) => [fields[i], f]));
23
- const { blockStarts, blockCount, chromStarts, thickEnd, thickStart, blockSizes, ...rest } = obj;
24
- return {
25
- ...rest,
26
- blockStarts: arrayify(blockStarts),
27
- chromStarts: arrayify(chromStarts),
28
- blockSizes: arrayify(blockSizes),
29
- thickStart: thickStart ? +thickStart : undefined,
30
- thickEnd: thickEnd ? +thickEnd : undefined,
31
- blockCount: blockCount ? +blockCount : undefined,
32
- };
33
- }
34
36
  function makeBlocks({ start, uniqueId, refName, chromStarts, blockCount, blockSizes, blockStarts, }) {
35
- if (blockCount) {
36
- const subfeatures = [];
37
- const starts = chromStarts || blockStarts || [];
38
- for (let b = 0; b < blockCount; b++) {
39
- const bmin = (starts[b] || 0) + start;
40
- const bsize = blockSizes === null || blockSizes === void 0 ? void 0 : blockSizes[b];
41
- if (bsize && bsize > 0) {
42
- const bmax = bmin + bsize;
43
- subfeatures.push({
44
- uniqueId: `${uniqueId}-${b}`,
45
- start: bmin,
46
- end: bmax,
47
- refName,
48
- type: 'block',
49
- });
50
- }
37
+ const subfeatures = [];
38
+ const starts = chromStarts || blockStarts || [];
39
+ for (let b = 0; b < blockCount; b++) {
40
+ const bmin = (starts[b] || 0) + start;
41
+ const bsize = blockSizes === null || blockSizes === void 0 ? void 0 : blockSizes[b];
42
+ if (bsize && bsize > 0) {
43
+ const bmax = bmin + bsize;
44
+ subfeatures.push({
45
+ uniqueId: `${uniqueId}-${b}`,
46
+ start: bmin,
47
+ end: bmax,
48
+ refName,
49
+ type: 'block',
50
+ });
51
51
  }
52
- return subfeatures;
53
52
  }
54
- return [];
53
+ return subfeatures;
55
54
  }
56
55
  function featureData({ line, colRef, colStart, colEnd, scoreColumn, parser, uniqueId, names, }) {
57
56
  const splitLine = line.split('\t');
58
57
  const refName = splitLine[colRef];
59
- const start = +splitLine[colStart];
60
- const end = +splitLine[colEnd] + (colStart === colEnd ? 1 : 0);
58
+ const start = Number.parseInt(splitLine[colStart], 10);
59
+ const end = Number.parseInt(splitLine[colEnd], 10) + (colStart === colEnd ? 1 : 0);
61
60
  return featureData2({
62
- line,
61
+ splitLine,
63
62
  refName,
64
63
  start,
65
64
  end,
@@ -69,34 +68,35 @@ function featureData({ line, colRef, colStart, colEnd, scoreColumn, parser, uniq
69
68
  names,
70
69
  });
71
70
  }
72
- function featureData2({ line, refName, start, end, parser, uniqueId, scoreColumn, names, }) {
73
- const splitLine = line.split('\t');
71
+ function featureData2({ splitLine, refName, start, end, parser, uniqueId, scoreColumn, names, }) {
74
72
  const data = names
75
- ? defaultParser(names, line)
76
- : parser.parseLine(line, { uniqueId });
73
+ ? defaultParser(names, splitLine)
74
+ : parser.parseLine(splitLine, { uniqueId });
77
75
  const { strand: strand2, score: score2, chrom: _1, chromStart: _2, chromEnd: _3, ...rest } = data;
78
- const { chromStarts, blockSizes, blockStarts, type, blockCount, thickStart, thickEnd, description, ...rest2 } = rest;
79
76
  const score = scoreColumn ? +data[scoreColumn] : score2 ? +score2 : undefined;
80
- const strand = typeof strand2 === 'string' ? stringToStrand(strand2) : strand2;
81
- const subfeatures = makeBlocks({
82
- start,
83
- uniqueId,
84
- refName,
85
- chromStarts,
86
- blockCount,
87
- blockSizes,
88
- blockStarts,
89
- });
77
+ const strand = typeof strand2 === 'string' ? (strand2 === '-' ? -1 : 1) : strand2;
78
+ const subfeatures = rest.blockCount
79
+ ? makeBlocks({
80
+ start,
81
+ uniqueId,
82
+ refName,
83
+ chromStarts: rest.chromStarts,
84
+ blockCount: rest.blockCount,
85
+ blockSizes: rest.blockSizes,
86
+ blockStarts: rest.blockStarts,
87
+ })
88
+ : undefined;
90
89
  if ((0, generateBedMethylFeature_1.isBedMethylFeature)({ splitLine, start, end })) {
91
90
  return (0, generateBedMethylFeature_1.generateBedMethylFeature)({
92
- line,
91
+ splitLine,
93
92
  uniqueId,
94
93
  refName,
95
94
  start,
96
95
  end,
97
96
  });
98
97
  }
99
- else if ((0, generateRepeatMaskerFeature_1.isRepeatMaskerDescriptionField)(description)) {
98
+ else if ((0, generateRepeatMaskerFeature_1.isRepeatMaskerDescriptionField)(rest.description)) {
99
+ const { chromStarts, blockSizes, blockStarts, type, blockCount, thickStart, thickEnd, description, ...rest2 } = rest;
100
100
  return (0, generateRepeatMaskerFeature_1.generateRepeatMaskerFeature)({
101
101
  ...rest2,
102
102
  uniqueId,
@@ -110,7 +110,13 @@ function featureData2({ line, refName, start, end, parser, uniqueId, scoreColumn
110
110
  subfeatures,
111
111
  });
112
112
  }
113
- else if ((0, generateUcscTranscript_1.isUcscTranscript)({ strand, blockCount, thickStart })) {
113
+ else if (subfeatures &&
114
+ (0, generateUcscTranscript_1.isUcscTranscript)({
115
+ strand,
116
+ blockCount: rest.blockCount,
117
+ thickStart: rest.thickStart,
118
+ })) {
119
+ const { chromStarts, blockSizes, type, blockCount, thickStart, thickEnd, description, } = rest;
114
120
  return (0, generateUcscTranscript_1.generateUcscTranscript)({
115
121
  ...rest,
116
122
  description,
@@ -133,8 +139,6 @@ function featureData2({ line, refName, start, end, parser, uniqueId, scoreColumn
133
139
  return {
134
140
  ...rest,
135
141
  uniqueId,
136
- description,
137
- type,
138
142
  score,
139
143
  start,
140
144
  end,
@@ -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
- private loadData;
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
- private loadFeatureIntervalTree;
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
  }
@@ -1,10 +1,9 @@
1
+ import IntervalTree from '@flatten-js/interval-tree';
1
2
  import BED from '@gmod/bed';
2
- import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
3
+ import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
4
+ import { SimpleFeature, fetchAndMaybeUnzip } from '@jbrowse/core/util';
3
5
  import { openLocation } from '@jbrowse/core/util/io';
4
6
  import { ObservableCreate } from '@jbrowse/core/util/rxjs';
5
- import { fetchAndMaybeUnzip, SimpleFeature, } from '@jbrowse/core/util';
6
- import IntervalTree from '@flatten-js/interval-tree';
7
- // locals
8
7
  import { featureData } from '../util';
9
8
  class BedAdapter extends BaseFeatureDataAdapter {
10
9
  constructor() {
@@ -15,7 +14,6 @@ class BedAdapter extends BaseFeatureDataAdapter {
15
14
  const pm = this.pluginManager;
16
15
  const bedLoc = this.getConf('bedLocation');
17
16
  const buffer = await fetchAndMaybeUnzip(openLocation(bedLoc, pm), opts);
18
- // 512MB max chrome string length is 512MB
19
17
  if (buffer.length > 536870888) {
20
18
  throw new Error('Data exceeds maximum string length (512MB)');
21
19
  }
@@ -94,9 +92,10 @@ class BedAdapter extends BaseFeatureDataAdapter {
94
92
  }
95
93
  const names = await this.getNames();
96
94
  const intervalTree = new IntervalTree();
97
- const ret = lines.map((line, i) => {
95
+ for (let i = 0; i < lines.length; i++) {
96
+ const line = lines[i];
98
97
  const uniqueId = `${this.id}-${refName}-${i}`;
99
- return new SimpleFeature(featureData({
98
+ const feat = new SimpleFeature(featureData({
100
99
  line,
101
100
  colRef,
102
101
  colStart,
@@ -106,9 +105,7 @@ class BedAdapter extends BaseFeatureDataAdapter {
106
105
  uniqueId,
107
106
  names,
108
107
  }));
109
- });
110
- for (const obj of ret) {
111
- intervalTree.insert([obj.get('start'), obj.get('end')], obj);
108
+ intervalTree.insert([feat.get('start'), feat.get('end')], feat);
112
109
  }
113
110
  return intervalTree;
114
111
  }
@@ -129,7 +126,7 @@ class BedAdapter extends BaseFeatureDataAdapter {
129
126
  observer.next(f);
130
127
  });
131
128
  observer.complete();
132
- }, opts.signal);
129
+ }, opts.stopToken);
133
130
  }
134
131
  freeResources() { }
135
132
  }
@@ -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,59 +1,35 @@
1
1
  import { ConfigurationSchema } from '@jbrowse/core/configuration';
2
- /**
3
- * #config BedAdapter
4
- */
5
- function x() { } // eslint-disable-line @typescript-eslint/no-unused-vars
2
+ function x() { }
6
3
  const BedAdapter = ConfigurationSchema('BedAdapter', {
7
- /**
8
- * #slot
9
- */
10
4
  bedLocation: {
11
5
  type: 'fileLocation',
12
6
  defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },
13
7
  },
14
- /**
15
- * #slot
16
- */
17
8
  columnNames: {
18
9
  type: 'stringArray',
19
10
  description: 'List of column names',
20
11
  defaultValue: [],
21
12
  },
22
- /**
23
- * #slot
24
- */
25
13
  scoreColumn: {
26
14
  type: 'string',
27
15
  description: 'The column to use as a "score" attribute',
28
16
  defaultValue: '',
29
17
  },
30
- /**
31
- * #slot
32
- */
33
18
  autoSql: {
34
19
  type: 'string',
35
20
  description: 'The autoSql definition for the data fields in the file',
36
21
  defaultValue: '',
37
22
  },
38
- /**
39
- * #slot
40
- */
41
23
  colRef: {
42
24
  type: 'number',
43
25
  description: 'The column to use as a "refName" attribute',
44
26
  defaultValue: 0,
45
27
  },
46
- /**
47
- * #slot
48
- */
49
28
  colStart: {
50
29
  type: 'number',
51
30
  description: 'The column to use as a "start" attribute',
52
31
  defaultValue: 1,
53
32
  },
54
- /**
55
- * #slot
56
- */
57
33
  colEnd: {
58
34
  type: 'number',
59
35
  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;
@@ -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,124 @@
1
+ import IntervalTree from '@flatten-js/interval-tree';
2
+ import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
3
+ import { SimpleFeature, fetchAndMaybeUnzip } from '@jbrowse/core/util';
4
+ import { openLocation } from '@jbrowse/core/util/io';
5
+ import { ObservableCreate } from '@jbrowse/core/util/rxjs';
6
+ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.intervalTrees = {};
10
+ }
11
+ async getNames() {
12
+ const { header, columnNames } = await this.loadData();
13
+ if (columnNames.length) {
14
+ return columnNames;
15
+ }
16
+ const defs = header.split(/\n|\r\n|\r/).filter(f => !!f);
17
+ const defline = defs.at(-1);
18
+ return (defline === null || defline === void 0 ? void 0 : defline.includes('\t'))
19
+ ? defline
20
+ .slice(1)
21
+ .split('\t')
22
+ .map(field => field.trim())
23
+ : undefined;
24
+ }
25
+ async loadFeatureIntervalTreeHelper(refName) {
26
+ var _a;
27
+ const { features } = await this.loadData();
28
+ const lines = features[refName];
29
+ if (!lines) {
30
+ return undefined;
31
+ }
32
+ const names = ((_a = (await this.getNames())) === null || _a === void 0 ? void 0 : _a.slice(3)) || [];
33
+ const intervalTree = new IntervalTree();
34
+ for (let i = 0; i < lines.length; i++) {
35
+ const line = lines[i];
36
+ const [refName, s, e, ...rest] = line.split('\t');
37
+ for (let j = 0; j < rest.length; j++) {
38
+ const uniqueId = `${this.id}-${refName}-${i}-${j}`;
39
+ const start = +s;
40
+ const end = +e;
41
+ const score = +rest[j];
42
+ const source = names[j] || `col${j}`;
43
+ if (score) {
44
+ intervalTree.insert([start, end], new SimpleFeature({
45
+ id: uniqueId,
46
+ data: {
47
+ refName,
48
+ start,
49
+ end,
50
+ score,
51
+ source,
52
+ },
53
+ }));
54
+ }
55
+ }
56
+ }
57
+ return intervalTree;
58
+ }
59
+ async getRefNames(opts = {}) {
60
+ const { features } = await this.loadData(opts);
61
+ return Object.keys(features);
62
+ }
63
+ async loadDataP(opts = {}) {
64
+ const pm = this.pluginManager;
65
+ const bedLoc = this.getConf('bedGraphLocation');
66
+ const buffer = await fetchAndMaybeUnzip(openLocation(bedLoc, pm), opts);
67
+ if (buffer.length > 536870888) {
68
+ throw new Error('Data exceeds maximum string length (512MB)');
69
+ }
70
+ const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
71
+ const lines = data.split(/\n|\r\n|\r/).filter(f => !!f);
72
+ const headerLines = [];
73
+ let i = 0;
74
+ for (; i < lines.length && lines[i].startsWith('#'); i++) {
75
+ headerLines.push(lines[i]);
76
+ }
77
+ const header = headerLines.join('\n');
78
+ const features = {};
79
+ for (; i < lines.length; i++) {
80
+ const line = lines[i];
81
+ const tab = line.indexOf('\t');
82
+ const refName = line.slice(0, tab);
83
+ if (!features[refName]) {
84
+ features[refName] = [];
85
+ }
86
+ features[refName].push(line);
87
+ }
88
+ const columnNames = this.getConf('columnNames');
89
+ return {
90
+ header,
91
+ features,
92
+ columnNames,
93
+ };
94
+ }
95
+ async loadFeatureIntervalTree(refName) {
96
+ if (!this.intervalTrees[refName]) {
97
+ this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(refName).catch((e) => {
98
+ this.intervalTrees[refName] = undefined;
99
+ throw e;
100
+ });
101
+ }
102
+ return this.intervalTrees[refName];
103
+ }
104
+ async loadData(opts = {}) {
105
+ if (!this.bedFeatures) {
106
+ this.bedFeatures = this.loadDataP(opts).catch((e) => {
107
+ this.bedFeatures = undefined;
108
+ throw e;
109
+ });
110
+ }
111
+ return this.bedFeatures;
112
+ }
113
+ getFeatures(query, _opts = {}) {
114
+ return ObservableCreate(async (observer) => {
115
+ const { start, end, refName } = query;
116
+ const intervalTree = await this.loadFeatureIntervalTree(refName);
117
+ intervalTree === null || intervalTree === void 0 ? void 0 : intervalTree.search([start, end]).forEach(f => {
118
+ observer.next(f);
119
+ });
120
+ observer.complete();
121
+ });
122
+ }
123
+ freeResources() { }
124
+ }
@@ -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,17 @@
1
+ import { ConfigurationSchema } from '@jbrowse/core/configuration';
2
+ function x() { }
3
+ const BedGraphAdapter = ConfigurationSchema('BedGraphAdapter', {
4
+ bedGraphLocation: {
5
+ type: 'fileLocation',
6
+ defaultValue: {
7
+ uri: '/path/to/my.bedgraph',
8
+ locationType: 'UriLocation',
9
+ },
10
+ },
11
+ columnNames: {
12
+ type: 'stringArray',
13
+ description: 'List of column names',
14
+ defaultValue: [],
15
+ },
16
+ }, { explicitlyTyped: true });
17
+ export default BedGraphAdapter;
@@ -0,0 +1,2 @@
1
+ import type PluginManager from '@jbrowse/core/PluginManager';
2
+ export default function BedGraphAdapterF(pluginManager: PluginManager): void;
@@ -0,0 +1,10 @@
1
+ import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType';
2
+ import configSchema from './configSchema';
3
+ export default function BedGraphAdapterF(pluginManager) {
4
+ pluginManager.addAdapterType(() => new AdapterType({
5
+ name: 'BedGraphAdapter',
6
+ displayName: 'BedGraph adapter',
7
+ configSchema,
8
+ getAdapterClass: () => import('./BedGraphAdapter').then(r => r.default),
9
+ }));
10
+ }
@@ -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
+ }