@jbrowse/plugin-alignments 2.2.0 → 2.2.2
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 +3 -2
- 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/components/ColorByModifications.d.ts +3 -1
- package/dist/LinearPileupDisplay/components/ColorByModifications.js +7 -22
- package/dist/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
- package/dist/LinearPileupDisplay/components/ColorByTag.js +2 -22
- package/dist/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
- package/dist/LinearPileupDisplay/components/FilterByTag.js +2 -15
- package/dist/LinearPileupDisplay/components/FilterByTag.js.map +1 -1
- package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +2 -19
- package/dist/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -1
- package/dist/LinearPileupDisplay/components/SetMaxHeight.js +2 -18
- package/dist/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -1
- package/dist/LinearPileupDisplay/components/SortByTag.js +2 -23
- package/dist/LinearPileupDisplay/components/SortByTag.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 +14 -10
- package/dist/LinearSNPCoverageDisplay/models/model.js +8 -6
- 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.js +32 -28
- package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
- package/dist/PileupRenderer/configSchema.js +1 -1
- 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/SNPCoverageAdapter.d.ts +0 -51
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +3 -182
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.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/generateCoverageBins.d.ts +53 -0
- package/dist/SNPCoverageAdapter/generateCoverageBins.js +185 -0
- package/dist/SNPCoverageAdapter/generateCoverageBins.js.map +1 -0
- 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 +3 -2
- 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/components/ColorByModifications.d.ts +3 -1
- package/esm/LinearPileupDisplay/components/ColorByModifications.js +8 -23
- package/esm/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
- package/esm/LinearPileupDisplay/components/ColorByTag.js +3 -20
- package/esm/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
- package/esm/LinearPileupDisplay/components/FilterByTag.js +3 -13
- package/esm/LinearPileupDisplay/components/FilterByTag.js.map +1 -1
- package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +3 -17
- package/esm/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -1
- package/esm/LinearPileupDisplay/components/SetMaxHeight.js +3 -16
- package/esm/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -1
- package/esm/LinearPileupDisplay/components/SortByTag.js +3 -21
- package/esm/LinearPileupDisplay/components/SortByTag.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 +14 -10
- package/esm/LinearSNPCoverageDisplay/models/model.js +9 -7
- 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.js +32 -28
- package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
- package/esm/PileupRenderer/configSchema.js +1 -1
- 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/SNPCoverageAdapter.d.ts +0 -51
- package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +4 -183
- package/esm/SNPCoverageAdapter/SNPCoverageAdapter.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/generateCoverageBins.d.ts +53 -0
- package/esm/SNPCoverageAdapter/generateCoverageBins.js +182 -0
- package/esm/SNPCoverageAdapter/generateCoverageBins.js.map +1 -0
- 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 +4 -3
- 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 +2 -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/components/ColorByModifications.tsx +5 -34
- package/src/LinearPileupDisplay/components/ColorByTag.tsx +2 -29
- package/src/LinearPileupDisplay/components/FilterByTag.tsx +2 -22
- package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +2 -22
- package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +2 -24
- package/src/LinearPileupDisplay/components/SortByTag.tsx +2 -31
- package/src/LinearPileupDisplay/configSchema.ts +3 -5
- package/src/LinearPileupDisplay/index.ts +5 -0
- package/src/LinearPileupDisplay/model.ts +31 -30
- package/src/LinearSNPCoverageDisplay/models/model.ts +12 -8
- package/src/PileupRPC/rpcMethods.ts +15 -20
- package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +48 -54
- package/src/PileupRenderer/configSchema.ts +1 -1
- package/src/PileupRenderer/index.ts +8 -9
- package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +5 -249
- package/src/SNPCoverageAdapter/configSchema.ts +14 -13
- package/src/SNPCoverageAdapter/generateCoverageBins.ts +245 -0
- package/src/SNPCoverageAdapter/index.ts +17 -18
- package/src/__snapshots__/index.test.ts.snap +1 -1
- package/src/index.ts +11 -4
|
@@ -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,5 +1,9 @@
|
|
|
1
1
|
import { addDisposer, types, cast, getEnv, getSnapshot } from 'mobx-state-tree'
|
|
2
|
-
import
|
|
2
|
+
import clone from 'clone'
|
|
3
|
+
import { autorun } from 'mobx'
|
|
4
|
+
|
|
5
|
+
// jbrowse
|
|
6
|
+
import PluginManager from '@jbrowse/core/PluginManager'
|
|
3
7
|
import {
|
|
4
8
|
getConf,
|
|
5
9
|
readConfObject,
|
|
@@ -8,7 +12,6 @@ import {
|
|
|
8
12
|
} from '@jbrowse/core/configuration'
|
|
9
13
|
import { linearWiggleDisplayModelFactory } from '@jbrowse/plugin-wiggle'
|
|
10
14
|
import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
|
|
11
|
-
import PluginManager from '@jbrowse/core/PluginManager'
|
|
12
15
|
import { getContainingView } from '@jbrowse/core/util'
|
|
13
16
|
|
|
14
17
|
// locals
|
|
@@ -75,7 +78,7 @@ function stateModelFactory(
|
|
|
75
78
|
}),
|
|
76
79
|
)
|
|
77
80
|
.volatile(() => ({
|
|
78
|
-
modificationTagMap:
|
|
81
|
+
modificationTagMap: undefined as Record<string, string> | undefined,
|
|
79
82
|
}))
|
|
80
83
|
.actions(self => ({
|
|
81
84
|
/**
|
|
@@ -109,12 +112,14 @@ function stateModelFactory(
|
|
|
109
112
|
const colorPalette = ['red', 'blue', 'green', 'orange', 'purple']
|
|
110
113
|
let i = 0
|
|
111
114
|
|
|
115
|
+
const newMap = clone(self.modificationTagMap) || {}
|
|
112
116
|
uniqueModifications.forEach(value => {
|
|
113
|
-
if (!
|
|
117
|
+
if (!newMap[value]) {
|
|
114
118
|
const newColor = colorPalette[i++]
|
|
115
|
-
|
|
119
|
+
newMap[value] = newColor
|
|
116
120
|
}
|
|
117
121
|
})
|
|
122
|
+
self.modificationTagMap = newMap
|
|
118
123
|
},
|
|
119
124
|
}))
|
|
120
125
|
.views(self => {
|
|
@@ -170,8 +175,7 @@ function stateModelFactory(
|
|
|
170
175
|
*/
|
|
171
176
|
get modificationsReady() {
|
|
172
177
|
return self.colorBy?.type === 'modifications'
|
|
173
|
-
?
|
|
174
|
-
.length > 0
|
|
178
|
+
? self.modificationTagMap !== undefined
|
|
175
179
|
: true
|
|
176
180
|
},
|
|
177
181
|
|
|
@@ -184,7 +188,7 @@ function stateModelFactory(
|
|
|
184
188
|
return {
|
|
185
189
|
...superProps,
|
|
186
190
|
notReady: superProps.notReady || !this.modificationsReady,
|
|
187
|
-
modificationTagMap:
|
|
191
|
+
modificationTagMap: modificationTagMap,
|
|
188
192
|
|
|
189
193
|
// must use getSnapshot because otherwise changes to e.g. just the
|
|
190
194
|
// colorBy.type are not read
|
|
@@ -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()
|
|
@@ -178,9 +178,9 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
178
178
|
|
|
179
179
|
// Expand the start and end of feature when softclipping enabled
|
|
180
180
|
if (showSoftClip) {
|
|
181
|
-
const mismatches = feature.get('mismatches') as Mismatch[]
|
|
181
|
+
const mismatches = feature.get('mismatches') as Mismatch[] | undefined
|
|
182
182
|
const seq = feature.get('seq') as string
|
|
183
|
-
if (seq) {
|
|
183
|
+
if (seq && mismatches) {
|
|
184
184
|
for (let i = 0; i < mismatches.length; i += 1) {
|
|
185
185
|
const { type, start, cliplen = 0 } = mismatches[i]
|
|
186
186
|
if (type === 'softclip') {
|
|
@@ -849,7 +849,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
849
849
|
|
|
850
850
|
const pxPerBp = Math.min(1 / bpPerPx, 2)
|
|
851
851
|
const w = Math.max(minSubfeatureWidth, pxPerBp)
|
|
852
|
-
const mismatches
|
|
852
|
+
const mismatches = feature.get('mismatches') as Mismatch[] | undefined
|
|
853
853
|
const heightLim = charHeight - 2
|
|
854
854
|
|
|
855
855
|
// extraHorizontallyFlippedOffset is used to draw interbase items, which
|
|
@@ -858,6 +858,10 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
858
858
|
? 1 / bpPerPx + 1
|
|
859
859
|
: -1
|
|
860
860
|
|
|
861
|
+
if (!mismatches) {
|
|
862
|
+
return
|
|
863
|
+
}
|
|
864
|
+
|
|
861
865
|
// two pass rendering: first pass, draw all the mismatches except wide
|
|
862
866
|
// insertion markers
|
|
863
867
|
for (let i = 0; i < mismatches.length; i += 1) {
|
|
@@ -1052,7 +1056,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
1052
1056
|
const { regions, bpPerPx } = renderArgs
|
|
1053
1057
|
const [region] = regions
|
|
1054
1058
|
const minFeatWidth = readConfObject(config, 'minSubfeatureWidth')
|
|
1055
|
-
const mismatches
|
|
1059
|
+
const mismatches = feature.get('mismatches') as Mismatch[] | undefined
|
|
1056
1060
|
const seq = feature.get('seq')
|
|
1057
1061
|
const { charWidth, charHeight } = this.getCharWidthHeight()
|
|
1058
1062
|
const { bases } = theme.palette
|
|
@@ -1065,59 +1069,49 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
1065
1069
|
}
|
|
1066
1070
|
|
|
1067
1071
|
// Display all bases softclipped off in lightened colors
|
|
1068
|
-
if (seq) {
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
const [softClipLeftPx, softClipRightPx] = bpSpanPx(
|
|
1087
|
-
softClipStart + k,
|
|
1088
|
-
softClipStart + k + 1,
|
|
1089
|
-
region,
|
|
1090
|
-
bpPerPx,
|
|
1091
|
-
)
|
|
1092
|
-
const softClipWidthPx = Math.max(
|
|
1093
|
-
minFeatWidth,
|
|
1094
|
-
Math.abs(softClipLeftPx - softClipRightPx),
|
|
1095
|
-
)
|
|
1072
|
+
if (!(seq && mismatches)) {
|
|
1073
|
+
return
|
|
1074
|
+
}
|
|
1075
|
+
mismatches
|
|
1076
|
+
.filter(mismatch => mismatch.type === 'softclip')
|
|
1077
|
+
.forEach(mismatch => {
|
|
1078
|
+
const len = mismatch.cliplen || 0
|
|
1079
|
+
const s = feature.get('start')
|
|
1080
|
+
const start = mismatch.start === 0 ? s - len : s + mismatch.start
|
|
1081
|
+
|
|
1082
|
+
for (let k = 0; k < len; k += 1) {
|
|
1083
|
+
const base = seq.charAt(k + mismatch.start)
|
|
1084
|
+
|
|
1085
|
+
// If softclip length+start is longer than sequence, no need to
|
|
1086
|
+
// continue showing base
|
|
1087
|
+
if (!base) {
|
|
1088
|
+
return
|
|
1089
|
+
}
|
|
1096
1090
|
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
topPx,
|
|
1105
|
-
softClipWidthPx,
|
|
1106
|
-
heightPx,
|
|
1107
|
-
canvasWidth,
|
|
1108
|
-
)
|
|
1091
|
+
const [leftPx, rightPx] = bpSpanPx(
|
|
1092
|
+
start + k,
|
|
1093
|
+
start + k + 1,
|
|
1094
|
+
region,
|
|
1095
|
+
bpPerPx,
|
|
1096
|
+
)
|
|
1097
|
+
const widthPx = Math.max(minFeatWidth, rightPx - leftPx)
|
|
1109
1098
|
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1099
|
+
// Black accounts for IUPAC ambiguity code bases such as N that
|
|
1100
|
+
// show in soft clipping
|
|
1101
|
+
const baseColor = colorForBase[base] || '#000000'
|
|
1102
|
+
ctx.fillStyle = baseColor
|
|
1103
|
+
fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth)
|
|
1104
|
+
|
|
1105
|
+
if (widthPx >= charWidth && heightPx >= charHeight - 5) {
|
|
1106
|
+
ctx.fillStyle = theme.palette.getContrastText(baseColor)
|
|
1107
|
+
ctx.fillText(
|
|
1108
|
+
base,
|
|
1109
|
+
leftPx + (widthPx - charWidth) / 2 + 1,
|
|
1110
|
+
topPx + heightPx,
|
|
1111
|
+
)
|
|
1118
1112
|
}
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1113
|
+
}
|
|
1114
|
+
})
|
|
1121
1115
|
}
|
|
1122
1116
|
|
|
1123
1117
|
makeImageData({
|
|
@@ -28,7 +28,7 @@ const PileupRenderer = ConfigurationSchema(
|
|
|
28
28
|
model: types.enumeration('orientationType', ['fr', 'rf', 'ff']),
|
|
29
29
|
defaultValue: 'fr',
|
|
30
30
|
description:
|
|
31
|
-
'read sequencer
|
|
31
|
+
'read sequencer orientation. fr is normal "reads pointing at each other ---> <--- while some other sequencers can use other options',
|
|
32
32
|
},
|
|
33
33
|
/**
|
|
34
34
|
* #slot
|
|
@@ -4,13 +4,12 @@ import ReactComponent from './components/PileupRendering'
|
|
|
4
4
|
import configSchema from './configSchema'
|
|
5
5
|
|
|
6
6
|
export default function register(pluginManager: PluginManager) {
|
|
7
|
-
pluginManager.addRendererType(
|
|
8
|
-
(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
)
|
|
7
|
+
pluginManager.addRendererType(() => {
|
|
8
|
+
return new PileupRenderer({
|
|
9
|
+
name: 'PileupRenderer',
|
|
10
|
+
ReactComponent,
|
|
11
|
+
configSchema,
|
|
12
|
+
pluginManager,
|
|
13
|
+
})
|
|
14
|
+
})
|
|
16
15
|
}
|