@jbrowse/plugin-alignments 2.2.0 → 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/BamAdapter/BamAdapter.d.ts +1 -1
- package/dist/BamAdapter/BamAdapter.js +1 -0
- 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.js +1 -1
- 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/CramSlightlyLazyFeature.d.ts +1 -10
- package/dist/CramAdapter/CramSlightlyLazyFeature.js +5 -218
- 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.js +2 -2
- 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/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
- package/dist/LinearAlignmentsDisplay/models/configSchema.d.ts +1 -1
- package/dist/LinearAlignmentsDisplay/models/model.d.ts +5 -5
- package/dist/LinearAlignmentsDisplay/models/model.js +7 -7
- package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
- package/dist/LinearPileupDisplay/configSchema.d.ts +4 -4
- package/dist/LinearPileupDisplay/configSchema.js +2 -2
- 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 +19 -9
- package/dist/LinearPileupDisplay/model.js +25 -30
- package/dist/LinearPileupDisplay/model.js.map +1 -1
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +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.js +32 -28
- package/dist/PileupRenderer/PileupRenderer.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 +6 -3
- 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/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/BamAdapter/BamAdapter.d.ts +1 -1
- package/esm/BamAdapter/BamAdapter.js +1 -0
- 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.js +1 -1
- 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/CramSlightlyLazyFeature.d.ts +1 -10
- package/esm/CramAdapter/CramSlightlyLazyFeature.js +5 -218
- 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.js +2 -2
- package/esm/CramAdapter/configSchema.js.map +1 -1
- package/esm/CramAdapter/index.js +7 -5
- 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/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
- package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +1 -1
- package/esm/LinearAlignmentsDisplay/models/model.d.ts +5 -5
- package/esm/LinearAlignmentsDisplay/models/model.js +7 -7
- package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
- package/esm/LinearPileupDisplay/configSchema.d.ts +4 -4
- package/esm/LinearPileupDisplay/configSchema.js +2 -2
- 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 +19 -9
- package/esm/LinearPileupDisplay/model.js +25 -30
- package/esm/LinearPileupDisplay/model.js.map +1 -1
- package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
- package/esm/LinearSNPCoverageDisplay/models/model.d.ts +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.js +32 -28
- package/esm/PileupRenderer/PileupRenderer.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 +6 -3
- 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/index.d.ts +3 -2
- package/esm/index.js +2 -2
- package/esm/index.js.map +1 -1
- package/package.json +3 -2
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +17 -16
- package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +1 -473
- package/src/AlignmentsFeatureDetail/index.test.js +6 -4
- package/src/BamAdapter/BamAdapter.ts +3 -2
- 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 +1 -1
- package/src/BamAdapter/index.ts +7 -8
- package/src/CombinationTest.test.ts +107 -0
- package/src/CramAdapter/CramSlightlyLazyFeature.ts +10 -219
- 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 +2 -3
- package/src/CramAdapter/index.ts +7 -8
- package/src/CramAdapter/util.test.ts +26 -0
- package/src/CramAdapter/util.ts +251 -0
- package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -1
- package/src/LinearAlignmentsDisplay/models/model.tsx +8 -7
- package/src/LinearPileupDisplay/configSchema.ts +3 -5
- package/src/LinearPileupDisplay/index.ts +5 -0
- package/src/LinearPileupDisplay/model.ts +31 -30
- package/src/PileupRPC/rpcMethods.ts +15 -20
- package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +48 -54
- package/src/PileupRenderer/index.ts +8 -9
- package/src/SNPCoverageAdapter/configSchema.ts +14 -13
- package/src/SNPCoverageAdapter/index.ts +17 -18
- package/src/__snapshots__/index.test.ts.snap +1 -1
- package/src/index.ts +11 -4
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFeaturesToCIGAR, readFeaturesToMismatches } from './util'
|
|
2
|
+
|
|
3
|
+
test('cram read features mismatches', () => {
|
|
4
|
+
expect(
|
|
5
|
+
// from ctgA_15140_15565_0:0:1_1:0:0_2e8 in volvox-sorted.cram
|
|
6
|
+
readFeaturesToMismatches(
|
|
7
|
+
[{ code: 'i', data: 'C', pos: 25, refPos: 15164 }],
|
|
8
|
+
15139,
|
|
9
|
+
),
|
|
10
|
+
).toMatchSnapshot()
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('cram read features to CIGAR', () => {
|
|
14
|
+
expect(
|
|
15
|
+
// from ctgA_15140_15565_0:0:1_1:0:0_2e8 in volvox-sorted.cram
|
|
16
|
+
readFeaturesToCIGAR(
|
|
17
|
+
[{ code: 'i', data: 'C', pos: 25, refPos: 15164 }],
|
|
18
|
+
15140,
|
|
19
|
+
100,
|
|
20
|
+
{
|
|
21
|
+
start: 14998,
|
|
22
|
+
seq: 'agaccacattcagctctcggtaacatgggaggcttgtggttgcaccgtaaaagggggatagcccatccatcctgtaaacctacaatcgcgcgtagcttaatacgctcacattagacattcgatcgagagacctggtttcaagagccttcccttttgctttagtgggccaaatcgcaaccctgctcccctcccttacgccttatacacttcagtgcaaattcatgcgttcagcgaacaactggacttctgttgtacgtagtccacgggggcttattcattatagaaagccccctactgtcaccgttatatggttcacacatgagctgatcacctagagagtcgtcatgcacattcgcctaacaaggacatatgagtaaccg',
|
|
23
|
+
},
|
|
24
|
+
),
|
|
25
|
+
).toMatchSnapshot()
|
|
26
|
+
})
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { CramRecord } from '@gmod/cram'
|
|
2
|
+
|
|
3
|
+
type ReadFeatures = CramRecord['readFeatures']
|
|
4
|
+
|
|
5
|
+
export interface Mismatch {
|
|
6
|
+
qual?: number
|
|
7
|
+
start: number
|
|
8
|
+
length: number
|
|
9
|
+
type: string
|
|
10
|
+
base: string | undefined
|
|
11
|
+
altbase?: string
|
|
12
|
+
seq?: string
|
|
13
|
+
cliplen?: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function readFeaturesToMismatches(
|
|
17
|
+
readFeatures: ReadFeatures,
|
|
18
|
+
start: number,
|
|
19
|
+
qual?: number[] | null,
|
|
20
|
+
) {
|
|
21
|
+
if (!readFeatures) {
|
|
22
|
+
return []
|
|
23
|
+
}
|
|
24
|
+
const mismatches: Mismatch[] = new Array(readFeatures.length)
|
|
25
|
+
let j = 0
|
|
26
|
+
let insLen = 0
|
|
27
|
+
let refPos = 0
|
|
28
|
+
let sublen = 0
|
|
29
|
+
let lastPos = start
|
|
30
|
+
|
|
31
|
+
for (let i = 0; i < readFeatures.length; i++) {
|
|
32
|
+
const f = readFeatures[i]
|
|
33
|
+
const { code, pos, data, sub, ref } = f
|
|
34
|
+
sublen = refPos - lastPos
|
|
35
|
+
lastPos = refPos
|
|
36
|
+
|
|
37
|
+
if (sublen && insLen > 0) {
|
|
38
|
+
mismatches[j++] = {
|
|
39
|
+
start: refPos,
|
|
40
|
+
type: 'insertion',
|
|
41
|
+
base: `${insLen}`,
|
|
42
|
+
length: 0,
|
|
43
|
+
}
|
|
44
|
+
insLen = 0
|
|
45
|
+
}
|
|
46
|
+
refPos = f.refPos - 1 - start
|
|
47
|
+
|
|
48
|
+
if (code === 'X') {
|
|
49
|
+
// substitution
|
|
50
|
+
mismatches[j++] = {
|
|
51
|
+
start: refPos,
|
|
52
|
+
length: 1,
|
|
53
|
+
base: sub,
|
|
54
|
+
qual: qual?.[pos - 1],
|
|
55
|
+
altbase: ref?.toUpperCase(),
|
|
56
|
+
type: 'mismatch',
|
|
57
|
+
}
|
|
58
|
+
} else if (code === 'I') {
|
|
59
|
+
// insertion
|
|
60
|
+
mismatches[j++] = {
|
|
61
|
+
start: refPos,
|
|
62
|
+
type: 'insertion',
|
|
63
|
+
base: `${data.length}`,
|
|
64
|
+
length: 0,
|
|
65
|
+
}
|
|
66
|
+
} else if (code === 'N') {
|
|
67
|
+
// reference skip
|
|
68
|
+
mismatches[j++] = {
|
|
69
|
+
type: 'skip',
|
|
70
|
+
length: data,
|
|
71
|
+
start: refPos,
|
|
72
|
+
base: 'N',
|
|
73
|
+
}
|
|
74
|
+
} else if (code === 'S') {
|
|
75
|
+
// soft clip
|
|
76
|
+
const len = data.length
|
|
77
|
+
mismatches[j++] = {
|
|
78
|
+
start: refPos,
|
|
79
|
+
type: 'softclip',
|
|
80
|
+
base: `S${len}`,
|
|
81
|
+
cliplen: len,
|
|
82
|
+
length: 1,
|
|
83
|
+
}
|
|
84
|
+
} else if (code === 'P') {
|
|
85
|
+
// padding
|
|
86
|
+
} else if (code === 'H') {
|
|
87
|
+
// hard clip
|
|
88
|
+
const len = data
|
|
89
|
+
mismatches[j++] = {
|
|
90
|
+
start: refPos,
|
|
91
|
+
type: 'hardclip',
|
|
92
|
+
base: `H${len}`,
|
|
93
|
+
cliplen: len,
|
|
94
|
+
length: 1,
|
|
95
|
+
}
|
|
96
|
+
} else if (code === 'D') {
|
|
97
|
+
// deletion
|
|
98
|
+
mismatches[j++] = {
|
|
99
|
+
type: 'deletion',
|
|
100
|
+
length: data,
|
|
101
|
+
start: refPos,
|
|
102
|
+
base: '*',
|
|
103
|
+
}
|
|
104
|
+
} else if (code === 'b') {
|
|
105
|
+
// stretch of bases
|
|
106
|
+
} else if (code === 'q') {
|
|
107
|
+
// stretch of qual scores
|
|
108
|
+
} else if (code === 'B') {
|
|
109
|
+
// a pair of [base, qual]
|
|
110
|
+
} else if (code === 'i') {
|
|
111
|
+
// single-base insertion, we collect these if there are multiple in a row
|
|
112
|
+
// into a single insertion entry
|
|
113
|
+
insLen++
|
|
114
|
+
} else if (code === 'Q') {
|
|
115
|
+
// single quality value
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (sublen && insLen > 0) {
|
|
120
|
+
mismatches[j++] = {
|
|
121
|
+
start: refPos,
|
|
122
|
+
type: 'insertion',
|
|
123
|
+
base: `${insLen}`,
|
|
124
|
+
length: 0,
|
|
125
|
+
}
|
|
126
|
+
insLen = 0
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return mismatches.slice(0, j)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function readFeaturesToCIGAR(
|
|
133
|
+
readFeatures: ReadFeatures,
|
|
134
|
+
alignmentStart: number,
|
|
135
|
+
readLen: number,
|
|
136
|
+
refRegion?: { seq: string; start: number },
|
|
137
|
+
) {
|
|
138
|
+
let seq = ''
|
|
139
|
+
let cigar = ''
|
|
140
|
+
let op = 'M'
|
|
141
|
+
let oplen = 0
|
|
142
|
+
if (!refRegion) {
|
|
143
|
+
return ''
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// not sure I should access these, but...
|
|
147
|
+
const ref = refRegion.seq
|
|
148
|
+
const refStart = refRegion.start
|
|
149
|
+
let lastPos = alignmentStart
|
|
150
|
+
let sublen = 0
|
|
151
|
+
let insLen = 0
|
|
152
|
+
if (readFeatures !== undefined) {
|
|
153
|
+
for (let i = 0; i < readFeatures.length; i++) {
|
|
154
|
+
const { code, refPos, sub, data } = readFeatures[i]
|
|
155
|
+
sublen = refPos - lastPos
|
|
156
|
+
seq += ref.substring(lastPos - refStart, refPos - refStart)
|
|
157
|
+
lastPos = refPos
|
|
158
|
+
|
|
159
|
+
if (insLen > 0 && sublen) {
|
|
160
|
+
cigar += `${insLen}I`
|
|
161
|
+
insLen = 0
|
|
162
|
+
}
|
|
163
|
+
if (oplen && op !== 'M') {
|
|
164
|
+
cigar += oplen + op
|
|
165
|
+
oplen = 0
|
|
166
|
+
}
|
|
167
|
+
if (sublen) {
|
|
168
|
+
op = 'M'
|
|
169
|
+
oplen += sublen
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (code === 'b') {
|
|
173
|
+
// An array of bases stored verbatim
|
|
174
|
+
const ret = data.split(',')
|
|
175
|
+
const added = String.fromCharCode(...ret)
|
|
176
|
+
seq += added
|
|
177
|
+
lastPos += added.length
|
|
178
|
+
oplen += added.length
|
|
179
|
+
} else if (code === 'B') {
|
|
180
|
+
// Single base (+ qual score)
|
|
181
|
+
seq += sub
|
|
182
|
+
lastPos++
|
|
183
|
+
oplen++
|
|
184
|
+
} else if (code === 'X') {
|
|
185
|
+
// Substitution
|
|
186
|
+
seq += sub
|
|
187
|
+
lastPos++
|
|
188
|
+
oplen++
|
|
189
|
+
} else if (code === 'D' || code === 'N') {
|
|
190
|
+
// Deletion or Ref Skip
|
|
191
|
+
lastPos += data
|
|
192
|
+
if (oplen) {
|
|
193
|
+
cigar += oplen + op
|
|
194
|
+
}
|
|
195
|
+
cigar += data + code
|
|
196
|
+
oplen = 0
|
|
197
|
+
} else if (code === 'I' || code === 'S') {
|
|
198
|
+
// Insertion or soft-clip
|
|
199
|
+
seq += data
|
|
200
|
+
if (oplen) {
|
|
201
|
+
cigar += oplen + op
|
|
202
|
+
}
|
|
203
|
+
cigar += data.length + code
|
|
204
|
+
oplen = 0
|
|
205
|
+
} else if (code === 'i') {
|
|
206
|
+
// Single base insertion
|
|
207
|
+
// seq += data
|
|
208
|
+
if (oplen) {
|
|
209
|
+
cigar += oplen + op
|
|
210
|
+
}
|
|
211
|
+
insLen++
|
|
212
|
+
seq += data
|
|
213
|
+
oplen = 0
|
|
214
|
+
} else if (code === 'P') {
|
|
215
|
+
// Padding
|
|
216
|
+
if (oplen) {
|
|
217
|
+
cigar += oplen + op
|
|
218
|
+
}
|
|
219
|
+
cigar += `${data}P`
|
|
220
|
+
} else if (code === 'H') {
|
|
221
|
+
// Hard clip
|
|
222
|
+
if (oplen) {
|
|
223
|
+
cigar += oplen + op
|
|
224
|
+
}
|
|
225
|
+
cigar += `${data}H`
|
|
226
|
+
oplen = 0
|
|
227
|
+
} // else q or Q
|
|
228
|
+
}
|
|
229
|
+
} else {
|
|
230
|
+
sublen = readLen - seq.length
|
|
231
|
+
}
|
|
232
|
+
if (seq.length !== readLen) {
|
|
233
|
+
sublen = readLen - seq.length
|
|
234
|
+
seq += ref.substring(lastPos - refStart, lastPos - refStart + sublen)
|
|
235
|
+
|
|
236
|
+
if (oplen && op !== 'M') {
|
|
237
|
+
cigar += oplen + op
|
|
238
|
+
oplen = 0
|
|
239
|
+
}
|
|
240
|
+
op = 'M'
|
|
241
|
+
oplen += sublen
|
|
242
|
+
}
|
|
243
|
+
if (sublen && insLen > 0) {
|
|
244
|
+
cigar += `${insLen}I`
|
|
245
|
+
}
|
|
246
|
+
if (oplen) {
|
|
247
|
+
cigar += oplen + op
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return cigar
|
|
251
|
+
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { observer } from 'mobx-react'
|
|
3
|
+
import { makeStyles } from 'tss-react/mui'
|
|
3
4
|
import { getConf } from '@jbrowse/core/configuration'
|
|
4
5
|
import { ResizeHandle } from '@jbrowse/core/ui'
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
// locals
|
|
6
8
|
import { AlignmentsDisplayModel } from '../models/model'
|
|
7
9
|
|
|
8
10
|
const useStyles = makeStyles()(() => ({
|
|
@@ -203,27 +203,28 @@ function stateModelFactory(
|
|
|
203
203
|
/**
|
|
204
204
|
* #action
|
|
205
205
|
*/
|
|
206
|
-
setSNPCoverageDisplay(
|
|
206
|
+
setSNPCoverageDisplay(configuration: AnyConfigurationModel) {
|
|
207
207
|
self.SNPCoverageDisplay = {
|
|
208
208
|
type: 'LinearSNPCoverageDisplay',
|
|
209
|
-
configuration
|
|
209
|
+
configuration,
|
|
210
210
|
height: self.snpCovHeight,
|
|
211
211
|
}
|
|
212
212
|
},
|
|
213
213
|
/**
|
|
214
214
|
* #action
|
|
215
215
|
*/
|
|
216
|
-
|
|
217
|
-
self.PileupDisplay.
|
|
218
|
-
self.SNPCoverageDisplay.
|
|
216
|
+
updateStatsLimit(stats: unknown) {
|
|
217
|
+
self.PileupDisplay.updateStatsLimit(stats)
|
|
218
|
+
self.SNPCoverageDisplay.updateStatsLimit(stats)
|
|
219
219
|
},
|
|
220
|
+
|
|
220
221
|
/**
|
|
221
222
|
* #action
|
|
222
223
|
*/
|
|
223
|
-
setPileupDisplay(
|
|
224
|
+
setPileupDisplay(configuration: AnyConfigurationModel) {
|
|
224
225
|
self.PileupDisplay = {
|
|
225
226
|
type: 'LinearPileupDisplay',
|
|
226
|
-
configuration
|
|
227
|
+
configuration,
|
|
227
228
|
}
|
|
228
229
|
},
|
|
229
230
|
/**
|
|
@@ -8,7 +8,7 @@ import PluginManager from '@jbrowse/core/PluginManager'
|
|
|
8
8
|
*/
|
|
9
9
|
function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
10
10
|
|
|
11
|
-
function
|
|
11
|
+
function configSchemaF(pluginManager: PluginManager) {
|
|
12
12
|
// modify config schema to take in a sub coverage display
|
|
13
13
|
return ConfigurationSchema(
|
|
14
14
|
'LinearPileupDisplay',
|
|
@@ -64,8 +64,6 @@ function PileupConfigFactory(pluginManager: PluginManager) {
|
|
|
64
64
|
)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export type LinearPileupDisplayConfigModel = ReturnType<
|
|
68
|
-
typeof PileupConfigFactory
|
|
69
|
-
>
|
|
67
|
+
export type LinearPileupDisplayConfigModel = ReturnType<typeof configSchemaF>
|
|
70
68
|
export type LinearPileupDisplayConfig = Instance<LinearPileupDisplayConfigModel>
|
|
71
|
-
export default
|
|
69
|
+
export default configSchemaF
|
|
@@ -55,6 +55,7 @@ type LGV = LinearGenomeViewModel
|
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* #stateModel LinearPileupDisplay
|
|
58
|
+
* extends `BaseLinearDisplay`
|
|
58
59
|
*/
|
|
59
60
|
function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
60
61
|
return types
|
|
@@ -117,6 +118,10 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
117
118
|
extra: types.frozen(),
|
|
118
119
|
}),
|
|
119
120
|
),
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* #property
|
|
124
|
+
*/
|
|
120
125
|
filterBy: types.optional(
|
|
121
126
|
types.model({
|
|
122
127
|
flagInclude: types.optional(types.number, 0),
|
|
@@ -134,6 +139,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
134
139
|
colorTagMap: observable.map<string, string>({}),
|
|
135
140
|
modificationTagMap: observable.map<string, string>({}),
|
|
136
141
|
featureUnderMouseVolatile: undefined as undefined | Feature,
|
|
142
|
+
currSortBpPerPx: 0,
|
|
137
143
|
ready: false,
|
|
138
144
|
}))
|
|
139
145
|
.actions(self => ({
|
|
@@ -143,6 +149,12 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
143
149
|
setReady(flag: boolean) {
|
|
144
150
|
self.ready = flag
|
|
145
151
|
},
|
|
152
|
+
/**
|
|
153
|
+
* #action
|
|
154
|
+
*/
|
|
155
|
+
setCurrSortBpPerPx(n: number) {
|
|
156
|
+
self.currSortBpPerPx = n
|
|
157
|
+
},
|
|
146
158
|
/**
|
|
147
159
|
* #action
|
|
148
160
|
*/
|
|
@@ -288,7 +300,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
288
300
|
...self.renderProps(),
|
|
289
301
|
})
|
|
290
302
|
self.setReady(true)
|
|
291
|
-
self.
|
|
303
|
+
self.setCurrSortBpPerPx(bpPerPx)
|
|
292
304
|
} else {
|
|
293
305
|
self.setReady(true)
|
|
294
306
|
}
|
|
@@ -302,6 +314,8 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
302
314
|
)
|
|
303
315
|
|
|
304
316
|
// autorun synchronizes featureUnderMouse with featureIdUnderMouse
|
|
317
|
+
// asynchronously. this is needed due to how we do not serialize all
|
|
318
|
+
// features from the BAM/CRAM over the rpc
|
|
305
319
|
addDisposer(
|
|
306
320
|
self,
|
|
307
321
|
autorun(async () => {
|
|
@@ -567,7 +581,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
567
581
|
colorBy,
|
|
568
582
|
filterBy,
|
|
569
583
|
rpcDriverName,
|
|
570
|
-
|
|
584
|
+
currSortBpPerPx,
|
|
571
585
|
ready,
|
|
572
586
|
} = self
|
|
573
587
|
|
|
@@ -578,7 +592,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
578
592
|
notReady:
|
|
579
593
|
superProps.notReady ||
|
|
580
594
|
!ready ||
|
|
581
|
-
(sortedBy &&
|
|
595
|
+
(sortedBy && currSortBpPerPx !== view.bpPerPx),
|
|
582
596
|
rpcDriverName,
|
|
583
597
|
displayModel: self,
|
|
584
598
|
sortedBy,
|
|
@@ -707,39 +721,31 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
707
721
|
subMenu: [
|
|
708
722
|
{
|
|
709
723
|
label: 'Normal',
|
|
710
|
-
onClick: () => {
|
|
711
|
-
self.setColorScheme({ type: 'normal' })
|
|
712
|
-
},
|
|
724
|
+
onClick: () => self.setColorScheme({ type: 'normal' }),
|
|
713
725
|
},
|
|
714
726
|
{
|
|
715
727
|
label: 'Mapping quality',
|
|
716
|
-
onClick: () =>
|
|
717
|
-
self.setColorScheme({ type: 'mappingQuality' })
|
|
718
|
-
},
|
|
728
|
+
onClick: () =>
|
|
729
|
+
self.setColorScheme({ type: 'mappingQuality' }),
|
|
719
730
|
},
|
|
720
731
|
{
|
|
721
732
|
label: 'Strand',
|
|
722
|
-
onClick: () => {
|
|
723
|
-
self.setColorScheme({ type: 'strand' })
|
|
724
|
-
},
|
|
733
|
+
onClick: () => self.setColorScheme({ type: 'strand' }),
|
|
725
734
|
},
|
|
726
735
|
{
|
|
727
736
|
label: 'Pair orientation',
|
|
728
|
-
onClick: () =>
|
|
729
|
-
self.setColorScheme({ type: 'pairOrientation' })
|
|
730
|
-
},
|
|
737
|
+
onClick: () =>
|
|
738
|
+
self.setColorScheme({ type: 'pairOrientation' }),
|
|
731
739
|
},
|
|
732
740
|
{
|
|
733
741
|
label: 'Per-base quality',
|
|
734
|
-
onClick: () =>
|
|
735
|
-
self.setColorScheme({ type: 'perBaseQuality' })
|
|
736
|
-
},
|
|
742
|
+
onClick: () =>
|
|
743
|
+
self.setColorScheme({ type: 'perBaseQuality' }),
|
|
737
744
|
},
|
|
738
745
|
{
|
|
739
746
|
label: 'Per-base lettering',
|
|
740
|
-
onClick: () =>
|
|
741
|
-
self.setColorScheme({ type: 'perBaseLettering' })
|
|
742
|
-
},
|
|
747
|
+
onClick: () =>
|
|
748
|
+
self.setColorScheme({ type: 'perBaseLettering' }),
|
|
743
749
|
},
|
|
744
750
|
{
|
|
745
751
|
label: 'Modifications or methylation',
|
|
@@ -752,15 +758,12 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
752
758
|
},
|
|
753
759
|
{
|
|
754
760
|
label: 'Insert size',
|
|
755
|
-
onClick: () => {
|
|
756
|
-
self.setColorScheme({ type: 'insertSize' })
|
|
757
|
-
},
|
|
761
|
+
onClick: () => self.setColorScheme({ type: 'insertSize' }),
|
|
758
762
|
},
|
|
759
763
|
{
|
|
760
764
|
label: 'Stranded paired-end',
|
|
761
|
-
onClick: () =>
|
|
762
|
-
self.setColorScheme({ type: 'reverseTemplate' })
|
|
763
|
-
},
|
|
765
|
+
onClick: () =>
|
|
766
|
+
self.setColorScheme({ type: 'reverseTemplate' }),
|
|
764
767
|
},
|
|
765
768
|
{
|
|
766
769
|
label: 'Color by tag...',
|
|
@@ -805,9 +808,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
|
|
|
805
808
|
label: 'Fade mismatches by quality',
|
|
806
809
|
type: 'checkbox',
|
|
807
810
|
checked: self.mismatchAlphaSetting,
|
|
808
|
-
onClick: () =>
|
|
809
|
-
self.toggleMismatchAlpha()
|
|
810
|
-
},
|
|
811
|
+
onClick: () => self.toggleMismatchAlpha(),
|
|
811
812
|
},
|
|
812
813
|
]
|
|
813
814
|
},
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
2
1
|
import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'
|
|
2
|
+
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
3
|
+
import { renameRegionsIfNeeded, Region } from '@jbrowse/core/util'
|
|
3
4
|
import { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'
|
|
4
|
-
import { renameRegionsIfNeeded } from '@jbrowse/core/util'
|
|
5
|
-
import { Region } from '@jbrowse/core/util/types'
|
|
6
5
|
import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'
|
|
7
|
-
import { toArray } from 'rxjs/operators'
|
|
8
6
|
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'
|
|
7
|
+
import { toArray } from 'rxjs/operators'
|
|
8
|
+
|
|
9
|
+
// locals
|
|
9
10
|
import { getTagAlt } from '../util'
|
|
10
11
|
import { getModificationTypes } from '../BamAdapter/MismatchParser'
|
|
11
12
|
|
|
@@ -41,14 +42,11 @@ export class PileupGetGlobalValueForTag extends RpcMethodType {
|
|
|
41
42
|
},
|
|
42
43
|
rpcDriverClassName: string,
|
|
43
44
|
) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
const dataAdapter = (
|
|
50
|
-
await getAdapter(this.pluginManager, sessionId, adapterConfig)
|
|
51
|
-
).dataAdapter as BaseFeatureDataAdapter
|
|
45
|
+
const pm = this.pluginManager
|
|
46
|
+
const deArgs = await this.deserializeArguments(args, rpcDriverClassName)
|
|
47
|
+
const { adapterConfig, sessionId, regions, tag } = deArgs
|
|
48
|
+
const dataAdapter = (await getAdapter(pm, sessionId, adapterConfig))
|
|
49
|
+
.dataAdapter as BaseFeatureDataAdapter
|
|
52
50
|
|
|
53
51
|
const features = dataAdapter.getFeaturesInMultipleRegions(regions)
|
|
54
52
|
const featuresArray = await features.pipe(toArray()).toPromise()
|
|
@@ -96,14 +94,11 @@ export class PileupGetVisibleModifications extends RpcMethodType {
|
|
|
96
94
|
},
|
|
97
95
|
rpcDriverClassName: string,
|
|
98
96
|
) {
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
const dataAdapter = (
|
|
105
|
-
await getAdapter(this.pluginManager, sessionId, adapterConfig)
|
|
106
|
-
).dataAdapter as BaseFeatureDataAdapter
|
|
97
|
+
const pm = this.pluginManager
|
|
98
|
+
const deArgs = await this.deserializeArguments(args, rpcDriverClassName)
|
|
99
|
+
const { adapterConfig, sessionId, regions } = deArgs
|
|
100
|
+
const dataAdapter = (await getAdapter(pm, sessionId, adapterConfig))
|
|
101
|
+
.dataAdapter as BaseFeatureDataAdapter
|
|
107
102
|
|
|
108
103
|
const features = dataAdapter.getFeaturesInMultipleRegions(regions)
|
|
109
104
|
const featuresArray = await features.pipe(toArray()).toPromise()
|