@jbrowse/plugin-alignments 2.1.7 → 2.2.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/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
- package/dist/AlignmentsTrack/index.d.ts +1 -1
- package/dist/AlignmentsTrack/index.js +16 -6
- package/dist/AlignmentsTrack/index.js.map +1 -1
- package/dist/BamAdapter/BamAdapter.d.ts +7 -3
- package/dist/BamAdapter/BamAdapter.js +36 -31
- package/dist/BamAdapter/BamAdapter.js.map +1 -1
- package/dist/BamAdapter/BamSlightlyLazyFeature.js +1 -0
- package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
- package/dist/BamAdapter/MismatchParser.d.ts +2 -2
- package/dist/BamAdapter/MismatchParser.js +4 -7
- package/dist/BamAdapter/MismatchParser.js.map +1 -1
- package/dist/BamAdapter/configSchema.d.ts +2 -2
- package/dist/BamAdapter/configSchema.js +27 -2
- package/dist/BamAdapter/configSchema.js.map +1 -1
- package/dist/BamAdapter/index.js +7 -5
- package/dist/BamAdapter/index.js.map +1 -1
- package/dist/CramAdapter/CramAdapter.d.ts +13 -7
- package/dist/CramAdapter/CramAdapter.js +56 -61
- package/dist/CramAdapter/CramAdapter.js.map +1 -1
- package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +15 -23
- package/dist/CramAdapter/CramSlightlyLazyFeature.js +10 -217
- package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
- package/dist/CramAdapter/CramTestAdapters.d.ts +1 -1
- package/dist/CramAdapter/CramTestAdapters.js +1 -1
- package/dist/CramAdapter/CramTestAdapters.js.map +1 -1
- package/dist/CramAdapter/configSchema.d.ts +2 -3
- package/dist/CramAdapter/configSchema.js +44 -22
- package/dist/CramAdapter/configSchema.js.map +1 -1
- package/dist/CramAdapter/index.js +7 -5
- package/dist/CramAdapter/index.js.map +1 -1
- package/dist/CramAdapter/util.d.ts +18 -0
- package/dist/CramAdapter/util.js +241 -0
- package/dist/CramAdapter/util.js.map +1 -0
- package/dist/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +5 -2
- package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +15 -20
- package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -1
- package/dist/HtsgetBamAdapter/configSchema.d.ts +2 -2
- package/dist/HtsgetBamAdapter/configSchema.js +20 -3
- package/dist/HtsgetBamAdapter/configSchema.js.map +1 -1
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
- package/dist/LinearAlignmentsDisplay/models/configSchema.d.ts +2 -2
- package/dist/LinearAlignmentsDisplay/models/configSchema.js +23 -6
- package/dist/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
- package/dist/LinearAlignmentsDisplay/models/model.d.ts +77 -10
- package/dist/LinearAlignmentsDisplay/models/model.js +102 -9
- package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
- package/dist/LinearPileupDisplay/configSchema.d.ts +4 -4
- package/dist/LinearPileupDisplay/configSchema.js +22 -5
- package/dist/LinearPileupDisplay/configSchema.js.map +1 -1
- package/dist/LinearPileupDisplay/index.d.ts +3 -0
- package/dist/LinearPileupDisplay/index.js +3 -0
- package/dist/LinearPileupDisplay/index.js.map +1 -1
- package/dist/LinearPileupDisplay/model.d.ts +100 -6
- package/dist/LinearPileupDisplay/model.js +611 -503
- package/dist/LinearPileupDisplay/model.js.map +1 -1
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
- package/dist/LinearSNPCoverageDisplay/models/configSchema.js +33 -4
- package/dist/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -1
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +87 -4
- package/dist/LinearSNPCoverageDisplay/models/model.js +240 -159
- package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -1
- package/dist/PileupRPC/rpcMethods.d.ts +1 -1
- package/dist/PileupRPC/rpcMethods.js +12 -7
- package/dist/PileupRPC/rpcMethods.js.map +1 -1
- package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
- package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
- package/dist/PileupRenderer/PileupRenderer.js +37 -34
- package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
- package/dist/PileupRenderer/configSchema.d.ts +2 -2
- package/dist/PileupRenderer/configSchema.js +37 -2
- package/dist/PileupRenderer/configSchema.js.map +1 -1
- package/dist/PileupRenderer/index.js +8 -6
- package/dist/PileupRenderer/index.js.map +1 -1
- package/dist/SNPCoverageAdapter/configSchema.d.ts +2 -3
- package/dist/SNPCoverageAdapter/configSchema.js +15 -4
- package/dist/SNPCoverageAdapter/configSchema.js.map +1 -1
- package/dist/SNPCoverageAdapter/index.d.ts +1 -2
- package/dist/SNPCoverageAdapter/index.js +17 -14
- package/dist/SNPCoverageAdapter/index.js.map +1 -1
- package/dist/SNPCoverageRenderer/configSchema.d.ts +2 -2
- package/dist/SNPCoverageRenderer/configSchema.js +21 -1
- package/dist/SNPCoverageRenderer/configSchema.js.map +1 -1
- package/dist/SNPCoverageRenderer/index.d.ts +0 -1
- package/dist/SNPCoverageRenderer/index.js +1 -4
- package/dist/SNPCoverageRenderer/index.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
- package/esm/AlignmentsTrack/index.d.ts +1 -1
- package/esm/AlignmentsTrack/index.js +16 -6
- package/esm/AlignmentsTrack/index.js.map +1 -1
- package/esm/BamAdapter/BamAdapter.d.ts +7 -3
- package/esm/BamAdapter/BamAdapter.js +36 -31
- package/esm/BamAdapter/BamAdapter.js.map +1 -1
- package/esm/BamAdapter/BamSlightlyLazyFeature.js +1 -0
- package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
- package/esm/BamAdapter/MismatchParser.d.ts +2 -2
- package/esm/BamAdapter/MismatchParser.js +4 -7
- package/esm/BamAdapter/MismatchParser.js.map +1 -1
- package/esm/BamAdapter/configSchema.d.ts +2 -2
- package/esm/BamAdapter/configSchema.js +27 -2
- package/esm/BamAdapter/configSchema.js.map +1 -1
- package/esm/BamAdapter/index.js +7 -5
- package/esm/BamAdapter/index.js.map +1 -1
- package/esm/CramAdapter/CramAdapter.d.ts +13 -7
- package/esm/CramAdapter/CramAdapter.js +56 -61
- package/esm/CramAdapter/CramAdapter.js.map +1 -1
- package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +15 -23
- package/esm/CramAdapter/CramSlightlyLazyFeature.js +10 -217
- package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
- package/esm/CramAdapter/CramTestAdapters.d.ts +1 -1
- package/esm/CramAdapter/CramTestAdapters.js +1 -1
- package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
- package/esm/CramAdapter/configSchema.d.ts +2 -3
- package/esm/CramAdapter/configSchema.js +44 -22
- package/esm/CramAdapter/configSchema.js.map +1 -1
- package/esm/CramAdapter/index.js +8 -6
- package/esm/CramAdapter/index.js.map +1 -1
- package/esm/CramAdapter/util.d.ts +18 -0
- package/esm/CramAdapter/util.js +236 -0
- package/esm/CramAdapter/util.js.map +1 -0
- package/esm/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +5 -2
- package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js +15 -20
- package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -1
- package/esm/HtsgetBamAdapter/configSchema.d.ts +2 -2
- package/esm/HtsgetBamAdapter/configSchema.js +20 -3
- package/esm/HtsgetBamAdapter/configSchema.js.map +1 -1
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
- package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +2 -2
- package/esm/LinearAlignmentsDisplay/models/configSchema.js +23 -6
- package/esm/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
- package/esm/LinearAlignmentsDisplay/models/model.d.ts +77 -10
- package/esm/LinearAlignmentsDisplay/models/model.js +102 -9
- package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
- package/esm/LinearPileupDisplay/configSchema.d.ts +4 -4
- package/esm/LinearPileupDisplay/configSchema.js +22 -5
- package/esm/LinearPileupDisplay/configSchema.js.map +1 -1
- package/esm/LinearPileupDisplay/index.d.ts +3 -0
- package/esm/LinearPileupDisplay/index.js +1 -0
- package/esm/LinearPileupDisplay/index.js.map +1 -1
- package/esm/LinearPileupDisplay/model.d.ts +100 -6
- package/esm/LinearPileupDisplay/model.js +611 -503
- package/esm/LinearPileupDisplay/model.js.map +1 -1
- package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
- package/esm/LinearSNPCoverageDisplay/models/configSchema.js +33 -4
- package/esm/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -1
- package/esm/LinearSNPCoverageDisplay/models/model.d.ts +87 -4
- package/esm/LinearSNPCoverageDisplay/models/model.js +240 -159
- package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -1
- package/esm/PileupRPC/rpcMethods.d.ts +1 -1
- package/esm/PileupRPC/rpcMethods.js +12 -7
- package/esm/PileupRPC/rpcMethods.js.map +1 -1
- package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
- package/esm/PileupRenderer/PileupRenderer.d.ts +1 -1
- package/esm/PileupRenderer/PileupRenderer.js +37 -34
- package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
- package/esm/PileupRenderer/configSchema.d.ts +2 -2
- package/esm/PileupRenderer/configSchema.js +37 -2
- package/esm/PileupRenderer/configSchema.js.map +1 -1
- package/esm/PileupRenderer/index.js +8 -6
- package/esm/PileupRenderer/index.js.map +1 -1
- package/esm/SNPCoverageAdapter/configSchema.d.ts +2 -3
- package/esm/SNPCoverageAdapter/configSchema.js +15 -4
- package/esm/SNPCoverageAdapter/configSchema.js.map +1 -1
- package/esm/SNPCoverageAdapter/index.d.ts +1 -2
- package/esm/SNPCoverageAdapter/index.js +17 -15
- package/esm/SNPCoverageAdapter/index.js.map +1 -1
- package/esm/SNPCoverageRenderer/configSchema.d.ts +2 -2
- package/esm/SNPCoverageRenderer/configSchema.js +21 -1
- package/esm/SNPCoverageRenderer/configSchema.js.map +1 -1
- package/esm/SNPCoverageRenderer/index.d.ts +0 -1
- package/esm/SNPCoverageRenderer/index.js +1 -3
- package/esm/SNPCoverageRenderer/index.js.map +1 -1
- package/esm/index.d.ts +3 -2
- package/esm/index.js +2 -2
- package/esm/index.js.map +1 -1
- package/package.json +4 -3
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +17 -16
- package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +41 -513
- package/src/AlignmentsFeatureDetail/index.test.js +6 -4
- package/src/AlignmentsTrack/index.ts +18 -12
- package/src/BamAdapter/BamAdapter.ts +42 -41
- package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -1
- package/src/BamAdapter/MismatchParser.test.ts +21 -12
- package/src/BamAdapter/MismatchParser.ts +7 -10
- package/src/BamAdapter/__snapshots__/BamAdapter.test.ts.snap +135 -135
- package/src/BamAdapter/configSchema.ts +57 -29
- package/src/BamAdapter/index.ts +7 -8
- package/src/CombinationTest.test.ts +107 -0
- package/src/CramAdapter/CramAdapter.test.ts +1 -2
- package/src/CramAdapter/CramAdapter.ts +83 -84
- package/src/CramAdapter/CramSlightlyLazyFeature.ts +18 -218
- package/src/CramAdapter/CramTestAdapters.ts +1 -1
- package/src/CramAdapter/__snapshots__/CramAdapter.test.ts.snap +31 -31
- package/src/CramAdapter/__snapshots__/util.test.ts.snap +14 -0
- package/src/CramAdapter/configSchema.ts +54 -30
- package/src/CramAdapter/index.ts +8 -9
- package/src/CramAdapter/util.test.ts +26 -0
- package/src/CramAdapter/util.ts +251 -0
- package/src/HtsgetBamAdapter/HtsgetBamAdapter.ts +14 -21
- package/src/HtsgetBamAdapter/configSchema.ts +36 -19
- package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -1
- package/src/LinearAlignmentsDisplay/models/configSchema.ts +23 -10
- package/src/LinearAlignmentsDisplay/models/model.tsx +107 -11
- package/src/LinearPileupDisplay/configSchema.ts +25 -9
- package/src/LinearPileupDisplay/index.ts +5 -0
- package/src/LinearPileupDisplay/model.ts +151 -34
- package/src/LinearSNPCoverageDisplay/models/configSchema.ts +36 -9
- package/src/LinearSNPCoverageDisplay/models/model.ts +83 -4
- package/src/PileupRPC/rpcMethods.ts +15 -20
- package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +53 -63
- package/src/PileupRenderer/configSchema.ts +39 -2
- package/src/PileupRenderer/index.ts +8 -9
- package/src/SNPCoverageAdapter/configSchema.ts +21 -12
- package/src/SNPCoverageAdapter/index.ts +17 -18
- package/src/SNPCoverageRenderer/configSchema.ts +23 -1
- package/src/SNPCoverageRenderer/index.ts +1 -8
- package/src/__snapshots__/index.test.ts.snap +1 -1
- package/src/index.ts +11 -4
- package/src/declare.d.ts +0 -1
|
@@ -1,37 +1,65 @@
|
|
|
1
1
|
import { ConfigurationSchema } from '@jbrowse/core/configuration'
|
|
2
2
|
import { types } from 'mobx-state-tree'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
/**
|
|
5
|
+
* #config BamAdapter
|
|
6
|
+
* used to configure BAM adapter
|
|
7
|
+
*/
|
|
8
|
+
function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
9
|
+
|
|
10
|
+
const configSchema = ConfigurationSchema(
|
|
11
|
+
'BamAdapter',
|
|
12
|
+
{
|
|
13
|
+
/**
|
|
14
|
+
* #slot
|
|
15
|
+
*/
|
|
16
|
+
bamLocation: {
|
|
17
|
+
type: 'fileLocation',
|
|
18
|
+
defaultValue: { uri: '/path/to/my.bam', locationType: 'UriLocation' },
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
index: ConfigurationSchema('BamIndex', {
|
|
22
|
+
/**
|
|
23
|
+
* #slot index.indexType
|
|
24
|
+
*/
|
|
25
|
+
indexType: {
|
|
26
|
+
model: types.enumeration('IndexType', ['BAI', 'CSI']),
|
|
27
|
+
type: 'stringEnum',
|
|
28
|
+
defaultValue: 'BAI',
|
|
11
29
|
},
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
defaultValue: {
|
|
21
|
-
uri: '/path/to/my.bam.bai',
|
|
22
|
-
locationType: 'UriLocation',
|
|
23
|
-
},
|
|
30
|
+
/**
|
|
31
|
+
* #slot index.location
|
|
32
|
+
*/
|
|
33
|
+
location: {
|
|
34
|
+
type: 'fileLocation',
|
|
35
|
+
defaultValue: {
|
|
36
|
+
uri: '/path/to/my.bam.bai',
|
|
37
|
+
locationType: 'UriLocation',
|
|
24
38
|
},
|
|
25
|
-
}),
|
|
26
|
-
fetchSizeLimit: {
|
|
27
|
-
type: 'number',
|
|
28
|
-
defaultValue: 5_000_000,
|
|
29
|
-
},
|
|
30
|
-
sequenceAdapter: {
|
|
31
|
-
type: 'frozen',
|
|
32
|
-
defaultValue: null,
|
|
33
39
|
},
|
|
40
|
+
}),
|
|
41
|
+
/**
|
|
42
|
+
* #slot
|
|
43
|
+
*/
|
|
44
|
+
fetchSizeLimit: {
|
|
45
|
+
type: 'number',
|
|
46
|
+
description:
|
|
47
|
+
'size to fetch in bytes over which to display a warning to the user that too much data will be fetched',
|
|
48
|
+
defaultValue: 5_000_000,
|
|
34
49
|
},
|
|
35
|
-
|
|
36
|
-
|
|
50
|
+
/**
|
|
51
|
+
* #slot
|
|
52
|
+
* generally refers to the reference genome assembly's sequence adapter
|
|
53
|
+
* currently needs to be manually added
|
|
54
|
+
*/
|
|
55
|
+
sequenceAdapter: {
|
|
56
|
+
type: 'frozen',
|
|
57
|
+
description:
|
|
58
|
+
'sequence data adapter, used to calculate SNPs when BAM reads lacking MD tags',
|
|
59
|
+
defaultValue: null,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{ explicitlyTyped: true },
|
|
37
63
|
)
|
|
64
|
+
|
|
65
|
+
export default configSchema
|
package/src/BamAdapter/index.ts
CHANGED
|
@@ -3,12 +3,11 @@ import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
|
|
|
3
3
|
import configSchema from './configSchema'
|
|
4
4
|
|
|
5
5
|
export default (pluginManager: PluginManager) => {
|
|
6
|
-
pluginManager.addAdapterType(
|
|
7
|
-
(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
)
|
|
6
|
+
pluginManager.addAdapterType(() => {
|
|
7
|
+
return new AdapterType({
|
|
8
|
+
name: 'BamAdapter',
|
|
9
|
+
configSchema,
|
|
10
|
+
getAdapterClass: () => import('./BamAdapter').then(r => r.default),
|
|
11
|
+
})
|
|
12
|
+
})
|
|
14
13
|
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import PluginManager from '@jbrowse/core/PluginManager'
|
|
2
|
+
import { toArray } from 'rxjs/operators'
|
|
3
|
+
import { LocalFile } from 'generic-filehandle'
|
|
4
|
+
import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
5
|
+
|
|
6
|
+
import CramAdapter from './CramAdapter/CramAdapter'
|
|
7
|
+
import BamAdapter from './BamAdapter/BamAdapter'
|
|
8
|
+
import { SequenceAdapter } from './CramAdapter/CramTestAdapters'
|
|
9
|
+
|
|
10
|
+
import cramConfigSchema from './CramAdapter/configSchema'
|
|
11
|
+
import bamConfigSchema from './BamAdapter/configSchema'
|
|
12
|
+
|
|
13
|
+
const pluginManager = new PluginManager()
|
|
14
|
+
|
|
15
|
+
const getVolvoxSequenceSubAdapter: getSubAdapterType = async () => {
|
|
16
|
+
return {
|
|
17
|
+
dataAdapter: new SequenceAdapter(
|
|
18
|
+
new LocalFile(require.resolve('../test_data/volvox.fa')),
|
|
19
|
+
),
|
|
20
|
+
sessionIds: new Set(),
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function getFeats(f1: string, f2: string) {
|
|
25
|
+
const cramAdapter = new CramAdapter(
|
|
26
|
+
cramConfigSchema.create({
|
|
27
|
+
cramLocation: {
|
|
28
|
+
localPath: require.resolve(f1),
|
|
29
|
+
},
|
|
30
|
+
craiLocation: {
|
|
31
|
+
localPath: require.resolve(f1 + '.crai'),
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
getVolvoxSequenceSubAdapter,
|
|
35
|
+
pluginManager,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
const bamAdapter = new BamAdapter(
|
|
39
|
+
bamConfigSchema.create({
|
|
40
|
+
bamLocation: {
|
|
41
|
+
localPath: require.resolve(f2),
|
|
42
|
+
},
|
|
43
|
+
index: {
|
|
44
|
+
location: {
|
|
45
|
+
localPath: require.resolve(f2 + '.bai'),
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
)
|
|
50
|
+
const query = {
|
|
51
|
+
assemblyName: 'volvox',
|
|
52
|
+
refName: 'ctgA',
|
|
53
|
+
start: 1,
|
|
54
|
+
end: 10200,
|
|
55
|
+
}
|
|
56
|
+
const bamFeatures = bamAdapter.getFeatures(query)
|
|
57
|
+
const cramFeatures = cramAdapter.getFeatures(query)
|
|
58
|
+
const bamFeaturesArray = await bamFeatures.pipe(toArray()).toPromise()
|
|
59
|
+
const cramFeaturesArray = await cramFeatures.pipe(toArray()).toPromise()
|
|
60
|
+
return { bamFeaturesArray, cramFeaturesArray }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type M = { start: number }
|
|
64
|
+
|
|
65
|
+
async function cigarCheck(f: string) {
|
|
66
|
+
const { cramFeaturesArray, bamFeaturesArray } = await getFeats(
|
|
67
|
+
`../test_data/${f}.cram`,
|
|
68
|
+
`../test_data/${f}.bam`,
|
|
69
|
+
)
|
|
70
|
+
const cramMap = Object.fromEntries(
|
|
71
|
+
cramFeaturesArray.map(f => [f.get('name'), f.get('CIGAR')]),
|
|
72
|
+
)
|
|
73
|
+
const bamMap = Object.fromEntries(
|
|
74
|
+
bamFeaturesArray.map(f => [f.get('name'), f.get('CIGAR')]),
|
|
75
|
+
)
|
|
76
|
+
expect(bamMap).toEqual(cramMap)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function mismatchesCheck(f: string) {
|
|
80
|
+
const { cramFeaturesArray, bamFeaturesArray } = await getFeats(
|
|
81
|
+
`../test_data/${f}.cram`,
|
|
82
|
+
`../test_data/${f}.bam`,
|
|
83
|
+
)
|
|
84
|
+
const cramMap = Object.fromEntries(
|
|
85
|
+
cramFeaturesArray.map(f => [
|
|
86
|
+
f.get('name'),
|
|
87
|
+
f.get('mismatches').sort((a: M, b: M) => b.start - a.start),
|
|
88
|
+
]),
|
|
89
|
+
)
|
|
90
|
+
const bamMap = Object.fromEntries(
|
|
91
|
+
bamFeaturesArray.map(f => [
|
|
92
|
+
f.get('name'),
|
|
93
|
+
f.get('mismatches').sort((a: M, b: M) => b.start - a.start),
|
|
94
|
+
]),
|
|
95
|
+
)
|
|
96
|
+
expect(bamMap).toEqual(cramMap)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
test('match CIGAR across file types', async () => {
|
|
100
|
+
await cigarCheck('volvox-sorted')
|
|
101
|
+
await cigarCheck('volvox-long-reads.fastq.sorted')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
test('mismatches same across file types', async () => {
|
|
105
|
+
await mismatchesCheck('volvox-sorted')
|
|
106
|
+
await mismatchesCheck('volvox-long-reads.fastq.sorted')
|
|
107
|
+
})
|
|
@@ -4,10 +4,9 @@ import PluginManager from '@jbrowse/core/PluginManager'
|
|
|
4
4
|
import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
5
5
|
import Adapter from './CramAdapter'
|
|
6
6
|
import { SequenceAdapter } from './CramTestAdapters'
|
|
7
|
-
import
|
|
7
|
+
import configSchema from './configSchema'
|
|
8
8
|
|
|
9
9
|
const pluginManager = new PluginManager()
|
|
10
|
-
const configSchema = pluginManager.load(configSchemaF)
|
|
11
10
|
|
|
12
11
|
const getVolvoxSequenceSubAdapter: getSubAdapterType = async () => {
|
|
13
12
|
return {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { CraiIndex, IndexedCramFile } from '@gmod/cram'
|
|
1
|
+
import { CraiIndex, IndexedCramFile, CramRecord } from '@gmod/cram'
|
|
2
2
|
import {
|
|
3
3
|
BaseFeatureDataAdapter,
|
|
4
4
|
BaseOptions,
|
|
5
|
+
BaseSequenceAdapter,
|
|
5
6
|
} from '@jbrowse/core/data_adapters/BaseAdapter'
|
|
6
7
|
import { checkAbortSignal, Region, Feature } from '@jbrowse/core/util'
|
|
7
8
|
import { openLocation } from '@jbrowse/core/util/io'
|
|
@@ -9,15 +10,10 @@ import { ObservableCreate } from '@jbrowse/core/util/rxjs'
|
|
|
9
10
|
import { toArray } from 'rxjs/operators'
|
|
10
11
|
import CramSlightlyLazyFeature from './CramSlightlyLazyFeature'
|
|
11
12
|
|
|
12
|
-
interface HeaderLine {
|
|
13
|
-
tag: string
|
|
14
|
-
value: any // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
15
|
-
data: HeaderLine[]
|
|
16
|
-
}
|
|
17
13
|
interface Header {
|
|
18
14
|
idToName?: string[]
|
|
19
15
|
nameToId?: Record<string, number>
|
|
20
|
-
readGroups?:
|
|
16
|
+
readGroups?: (string | undefined)[]
|
|
21
17
|
}
|
|
22
18
|
|
|
23
19
|
interface FilterBy {
|
|
@@ -32,8 +28,13 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
32
28
|
|
|
33
29
|
private setupP?: Promise<{
|
|
34
30
|
samHeader: Header
|
|
35
|
-
cram:
|
|
36
|
-
sequenceAdapter:
|
|
31
|
+
cram: IndexedCramFile
|
|
32
|
+
sequenceAdapter: BaseSequenceAdapter
|
|
33
|
+
}>
|
|
34
|
+
|
|
35
|
+
private configureP?: Promise<{
|
|
36
|
+
cram: IndexedCramFile
|
|
37
|
+
sequenceAdapter: BaseSequenceAdapter
|
|
37
38
|
}>
|
|
38
39
|
|
|
39
40
|
// maps a refname to an id
|
|
@@ -42,7 +43,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
42
43
|
// maps a seqId to original refname, passed specially to render args, to a seqid
|
|
43
44
|
private seqIdToOriginalRefName: string[] = []
|
|
44
45
|
|
|
45
|
-
public async
|
|
46
|
+
public async configurePre() {
|
|
46
47
|
const cramLocation = this.getConf('cramLocation')
|
|
47
48
|
const craiLocation = this.getConf('craiLocation')
|
|
48
49
|
if (!cramLocation) {
|
|
@@ -51,48 +52,55 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
51
52
|
if (!craiLocation) {
|
|
52
53
|
throw new Error('missing craiLocation argument')
|
|
53
54
|
}
|
|
55
|
+
const pm = this.pluginManager
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
filehandle: openLocation(craiLocation, this.pluginManager),
|
|
60
|
-
}),
|
|
61
|
-
seqFetch: this.seqFetch.bind(this),
|
|
57
|
+
const cram = new IndexedCramFile({
|
|
58
|
+
cramFilehandle: openLocation(cramLocation, pm),
|
|
59
|
+
index: new CraiIndex({ filehandle: openLocation(craiLocation, pm) }),
|
|
60
|
+
seqFetch: (...args) => this.seqFetch(...args),
|
|
62
61
|
checkSequenceMD5: false,
|
|
63
62
|
fetchSizeLimit: 200_000_000, // just make this a large size to avoid hitting it
|
|
64
63
|
})
|
|
65
|
-
// instantiate the sequence adapter
|
|
66
|
-
const sequenceAdapterType = this.getConf(['sequenceAdapter', 'type'])
|
|
67
64
|
|
|
68
65
|
if (!this.getSubAdapter) {
|
|
69
66
|
throw new Error('Error getting subadapter')
|
|
70
67
|
}
|
|
71
68
|
|
|
72
69
|
const seqConf = this.getConf('sequenceAdapter')
|
|
73
|
-
const
|
|
70
|
+
const subadapter = await this.getSubAdapter(seqConf)
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
)
|
|
72
|
+
return {
|
|
73
|
+
cram,
|
|
74
|
+
sequenceAdapter: subadapter.dataAdapter as BaseSequenceAdapter,
|
|
79
75
|
}
|
|
76
|
+
}
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
public async configure() {
|
|
79
|
+
if (!this.configureP) {
|
|
80
|
+
this.configureP = this.configurePre().catch(e => {
|
|
81
|
+
this.configureP = undefined
|
|
82
|
+
throw e
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
return this.configureP
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
async getHeader(opts?: BaseOptions) {
|
|
85
89
|
const { cram } = await this.configure()
|
|
86
|
-
return cram.cram.getHeaderText(
|
|
90
|
+
return cram.cram.getHeaderText()
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
private async seqFetch(
|
|
93
|
+
private async seqFetch(
|
|
94
|
+
seqId: number,
|
|
95
|
+
start: number,
|
|
96
|
+
end: number,
|
|
97
|
+
): Promise<string> {
|
|
90
98
|
start -= 1 // convert from 1-based closed to interbase
|
|
91
99
|
|
|
92
100
|
const { sequenceAdapter } = await this.configure()
|
|
93
101
|
const refName = this.refIdToOriginalName(seqId) || this.refIdToName(seqId)
|
|
94
102
|
if (!refName) {
|
|
95
|
-
|
|
103
|
+
throw new Error('unknown')
|
|
96
104
|
}
|
|
97
105
|
|
|
98
106
|
const seqChunks = await sequenceAdapter
|
|
@@ -132,10 +140,10 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
132
140
|
|
|
133
141
|
private async setupPre(opts?: BaseOptions) {
|
|
134
142
|
const { statusCallback = () => {} } = opts || {}
|
|
135
|
-
const
|
|
143
|
+
const conf = await this.configure()
|
|
136
144
|
statusCallback('Downloading index')
|
|
137
|
-
const { cram } =
|
|
138
|
-
const samHeader
|
|
145
|
+
const { cram } = conf
|
|
146
|
+
const samHeader = await cram.cram.getSamHeader()
|
|
139
147
|
|
|
140
148
|
// use the @SQ lines in the header to figure out the
|
|
141
149
|
// mapping between ref ID numbers and names
|
|
@@ -161,7 +169,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
161
169
|
const data = { idToName, nameToId, readGroups }
|
|
162
170
|
statusCallback('')
|
|
163
171
|
this.samHeader = data
|
|
164
|
-
return { samHeader: data, ...
|
|
172
|
+
return { samHeader: data, ...conf }
|
|
165
173
|
}
|
|
166
174
|
|
|
167
175
|
private async setup(opts?: BaseOptions) {
|
|
@@ -197,13 +205,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
197
205
|
// use info from the SAM header if possible, but fall back to using
|
|
198
206
|
// the ref seq order from when the browser's refseqs were loaded
|
|
199
207
|
refIdToName(refId: number) {
|
|
200
|
-
|
|
201
|
-
return this.samHeader.idToName[refId]
|
|
202
|
-
}
|
|
203
|
-
if (this.seqIdToRefName) {
|
|
204
|
-
return this.seqIdToRefName[refId]
|
|
205
|
-
}
|
|
206
|
-
return undefined
|
|
208
|
+
return this.samHeader.idToName?.[refId] || this.seqIdToRefName?.[refId]
|
|
207
209
|
}
|
|
208
210
|
|
|
209
211
|
refIdToOriginalName(refId: number) {
|
|
@@ -220,53 +222,48 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
220
222
|
const { refName, start, end, originalRefName } = region
|
|
221
223
|
|
|
222
224
|
return ObservableCreate<Feature>(async observer => {
|
|
223
|
-
const { cram
|
|
224
|
-
|
|
225
|
-
if (!this.seqIdToRefName) {
|
|
226
|
-
this.seqIdToRefName = await sequenceAdapter.getRefNames(opts)
|
|
227
|
-
}
|
|
225
|
+
const { cram } = await this.setup(opts)
|
|
226
|
+
|
|
228
227
|
const refId = this.refNameToId(refName)
|
|
229
|
-
if (refId
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
228
|
+
if (refId === undefined) {
|
|
229
|
+
console.warn('Unknown refName', refName)
|
|
230
|
+
observer.complete()
|
|
231
|
+
return
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (originalRefName) {
|
|
235
|
+
this.seqIdToOriginalRefName[refId] = originalRefName
|
|
236
|
+
}
|
|
237
|
+
statusCallback('Downloading alignments')
|
|
238
|
+
const records = await cram.getRecordsForRange(refId, start, end)
|
|
239
|
+
checkAbortSignal(signal)
|
|
240
|
+
const {
|
|
241
|
+
flagInclude = 0,
|
|
242
|
+
flagExclude = 0,
|
|
243
|
+
tagFilter,
|
|
244
|
+
readName,
|
|
245
|
+
} = filterBy || {}
|
|
246
|
+
|
|
247
|
+
let filtered = records.filter(record => {
|
|
248
|
+
const flags = record.flags
|
|
249
|
+
return (flags & flagInclude) === flagInclude && !(flags & flagExclude)
|
|
250
|
+
})
|
|
247
251
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
})
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (readName) {
|
|
257
|
-
filtered = filtered.filter(
|
|
258
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
-
(record: any) => record.readName === readName,
|
|
260
|
-
)
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
264
|
-
filtered.forEach((record: any) => {
|
|
265
|
-
observer.next(this.cramRecordToFeature(record))
|
|
252
|
+
if (tagFilter) {
|
|
253
|
+
filtered = filtered.filter(record => {
|
|
254
|
+
// @ts-ignore
|
|
255
|
+
const val = record[tagFilter.tag]
|
|
256
|
+
return val === '*' ? val !== undefined : val === tagFilter.value
|
|
266
257
|
})
|
|
267
|
-
} else {
|
|
268
|
-
console.warn('Unknown refName', refName)
|
|
269
258
|
}
|
|
259
|
+
|
|
260
|
+
if (readName) {
|
|
261
|
+
filtered = filtered.filter(record => record.readName === readName)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
filtered.forEach(record => {
|
|
265
|
+
observer.next(this.cramRecordToFeature(record))
|
|
266
|
+
})
|
|
270
267
|
statusCallback('')
|
|
271
268
|
observer.complete()
|
|
272
269
|
}, signal)
|
|
@@ -274,7 +271,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
274
271
|
|
|
275
272
|
freeResources(/* { region } */): void {}
|
|
276
273
|
|
|
277
|
-
cramRecordToFeature(record:
|
|
274
|
+
cramRecordToFeature(record: CramRecord) {
|
|
278
275
|
return new CramSlightlyLazyFeature(record, this)
|
|
279
276
|
}
|
|
280
277
|
|
|
@@ -299,7 +296,9 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
299
296
|
regions.map(region => {
|
|
300
297
|
const { refName, start, end } = region
|
|
301
298
|
const chrId = this.refNameToId(refName)
|
|
302
|
-
return
|
|
299
|
+
return chrId !== undefined
|
|
300
|
+
? cram.index.getEntriesForRange(chrId, start, end)
|
|
301
|
+
: [{ sliceBytes: 0 }]
|
|
303
302
|
}),
|
|
304
303
|
)
|
|
305
304
|
|