@jbrowse/plugin-alignments 2.4.0 → 2.4.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.d.ts +4 -4
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +88 -126
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.d.ts +6 -0
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js +44 -0
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js.map +1 -0
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.d.ts +6 -0
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js +37 -0
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js.map +1 -0
- package/dist/AlignmentsFeatureDetail/index.d.ts +1 -1
- package/dist/AlignmentsFeatureDetail/util.d.ts +8 -0
- package/dist/AlignmentsFeatureDetail/util.js +27 -0
- package/dist/AlignmentsFeatureDetail/util.js.map +1 -0
- package/dist/BamAdapter/BamAdapter.js +2 -2
- package/dist/BamAdapter/BamAdapter.js.map +1 -1
- package/dist/BamAdapter/BamSlightlyLazyFeature.js +2 -2
- package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
- package/dist/CramAdapter/CramAdapter.js +2 -2
- package/dist/CramAdapter/CramAdapter.js.map +1 -1
- package/dist/CramAdapter/CramSlightlyLazyFeature.js +2 -2
- package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
- package/dist/CramAdapter/util.js +10 -10
- package/dist/CramAdapter/util.js.map +1 -1
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +4 -4
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
- package/dist/LinearAlignmentsDisplay/models/model.d.ts +2 -4
- package/dist/LinearAlignmentsDisplay/models/model.js +3 -4
- package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
- package/dist/LinearPileupDisplay/index.d.ts +2 -3
- package/dist/LinearPileupDisplay/index.js +4 -2
- package/dist/LinearPileupDisplay/index.js.map +1 -1
- package/dist/LinearPileupDisplay/model.d.ts +30 -31
- package/dist/LinearPileupDisplay/model.js +4 -4
- package/dist/LinearPileupDisplay/model.js.map +1 -1
- package/dist/LinearReadArcsDisplay/model.d.ts +13 -21
- package/dist/LinearReadCloudDisplay/model.d.ts +13 -21
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +22 -24
- package/dist/MismatchParser/index.js +6 -8
- package/dist/MismatchParser/index.js.map +1 -1
- package/dist/PileupRPC/rpcMethods.d.ts +3 -4
- package/dist/PileupRPC/rpcMethods.js +6 -6
- package/dist/PileupRPC/rpcMethods.js.map +1 -1
- package/dist/PileupRenderer/PileupRenderer.d.ts +5 -3
- package/dist/PileupRenderer/PileupRenderer.js +29 -33
- package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
- package/dist/PileupRenderer/components/PileupRendering.js +2 -2
- package/dist/PileupRenderer/components/PileupRendering.js.map +1 -1
- package/dist/PileupRenderer/configSchema.js +1 -1
- package/dist/PileupRenderer/configSchema.js.map +1 -1
- package/dist/PileupRenderer/sortUtil.js +5 -4
- package/dist/PileupRenderer/sortUtil.js.map +1 -1
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +10 -7
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +4 -4
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +88 -126
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.d.ts +6 -0
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js +38 -0
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js.map +1 -0
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.d.ts +6 -0
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js +31 -0
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js.map +1 -0
- package/esm/AlignmentsFeatureDetail/index.d.ts +1 -1
- package/esm/AlignmentsFeatureDetail/util.d.ts +8 -0
- package/esm/AlignmentsFeatureDetail/util.js +22 -0
- package/esm/AlignmentsFeatureDetail/util.js.map +1 -0
- package/esm/BamAdapter/BamAdapter.js +2 -2
- package/esm/BamAdapter/BamAdapter.js.map +1 -1
- package/esm/BamAdapter/BamSlightlyLazyFeature.js +2 -2
- package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
- package/esm/CramAdapter/CramAdapter.js +2 -2
- package/esm/CramAdapter/CramAdapter.js.map +1 -1
- package/esm/CramAdapter/CramSlightlyLazyFeature.js +2 -2
- package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
- package/esm/CramAdapter/util.js +10 -10
- package/esm/CramAdapter/util.js.map +1 -1
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +4 -4
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
- package/esm/LinearAlignmentsDisplay/models/model.d.ts +2 -4
- package/esm/LinearAlignmentsDisplay/models/model.js +3 -4
- package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
- package/esm/LinearPileupDisplay/index.d.ts +2 -3
- package/esm/LinearPileupDisplay/index.js +2 -1
- package/esm/LinearPileupDisplay/index.js.map +1 -1
- package/esm/LinearPileupDisplay/model.d.ts +30 -31
- package/esm/LinearPileupDisplay/model.js +4 -4
- package/esm/LinearPileupDisplay/model.js.map +1 -1
- package/esm/LinearReadArcsDisplay/model.d.ts +13 -21
- package/esm/LinearReadCloudDisplay/model.d.ts +13 -21
- package/esm/LinearSNPCoverageDisplay/models/model.d.ts +22 -24
- package/esm/MismatchParser/index.js +6 -8
- package/esm/MismatchParser/index.js.map +1 -1
- package/esm/PileupRPC/rpcMethods.d.ts +3 -4
- package/esm/PileupRPC/rpcMethods.js +3 -4
- package/esm/PileupRPC/rpcMethods.js.map +1 -1
- package/esm/PileupRenderer/PileupRenderer.d.ts +5 -3
- package/esm/PileupRenderer/PileupRenderer.js +29 -33
- package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
- package/esm/PileupRenderer/components/PileupRendering.js +2 -2
- package/esm/PileupRenderer/components/PileupRendering.js.map +1 -1
- package/esm/PileupRenderer/configSchema.js +1 -1
- package/esm/PileupRenderer/configSchema.js.map +1 -1
- package/esm/PileupRenderer/sortUtil.js +5 -4
- package/esm/PileupRenderer/sortUtil.js.map +1 -1
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +10 -7
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -1
- package/esm/index.d.ts +3 -5
- package/esm/index.js +3 -3
- package/esm/index.js.map +1 -1
- package/package.json +2 -2
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +109 -183
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureFlags.tsx +62 -0
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.tsx +51 -0
- package/src/AlignmentsFeatureDetail/__snapshots__/index.test.tsx.snap +3 -2
- package/src/AlignmentsFeatureDetail/index.test.tsx +1 -1
- package/src/AlignmentsFeatureDetail/util.ts +27 -0
- package/src/BamAdapter/BamAdapter.ts +2 -2
- package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -2
- package/src/CramAdapter/CramAdapter.ts +2 -2
- package/src/CramAdapter/CramSlightlyLazyFeature.ts +2 -2
- package/src/CramAdapter/util.ts +10 -10
- package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +4 -4
- package/src/LinearAlignmentsDisplay/models/configSchema.test.ts +1 -1
- package/src/LinearAlignmentsDisplay/models/model.tsx +4 -5
- package/src/LinearPileupDisplay/index.ts +2 -4
- package/src/LinearPileupDisplay/model.ts +4 -4
- package/src/LinearSNPCoverageDisplay/models/configSchema.test.ts +1 -1
- package/src/MismatchParser/index.ts +5 -7
- package/src/PileupRPC/rpcMethods.ts +3 -9
- package/src/PileupRenderer/PileupRenderer.ts +46 -61
- package/src/PileupRenderer/components/PileupRendering.tsx +2 -2
- package/src/PileupRenderer/configSchema.ts +1 -1
- package/src/PileupRenderer/sortUtil.ts +5 -4
- package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +14 -13
- package/src/index.ts +5 -10
- package/dist/NestedFrequencyTable.d.ts +0 -14
- package/dist/NestedFrequencyTable.js +0 -104
- package/dist/NestedFrequencyTable.js.map +0 -1
- package/esm/NestedFrequencyTable.d.ts +0 -14
- package/esm/NestedFrequencyTable.js +0 -101
- package/esm/NestedFrequencyTable.js.map +0 -1
- package/src/NestedFrequencyTable.ts +0 -121
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { Theme } from '@mui/material/styles'
|
|
2
2
|
import BoxRendererType, {
|
|
3
|
-
RenderArgs,
|
|
4
|
-
RenderArgsSerialized,
|
|
5
3
|
RenderArgsDeserialized as BoxRenderArgsDeserialized,
|
|
6
|
-
RenderResults,
|
|
7
|
-
ResultsSerialized,
|
|
8
|
-
ResultsDeserialized,
|
|
9
4
|
} from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'
|
|
10
5
|
import { createJBrowseTheme } from '@jbrowse/core/ui'
|
|
11
6
|
import {
|
|
@@ -189,13 +184,10 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
189
184
|
}
|
|
190
185
|
}
|
|
191
186
|
}
|
|
187
|
+
const s = feature.get('start') - expansionBefore
|
|
188
|
+
const e = feature.get('end') + expansionAfter
|
|
192
189
|
|
|
193
|
-
const [leftPx, rightPx] = bpSpanPx(
|
|
194
|
-
feature.get('start') - expansionBefore,
|
|
195
|
-
feature.get('end') + expansionAfter,
|
|
196
|
-
region,
|
|
197
|
-
bpPerPx,
|
|
198
|
-
)
|
|
190
|
+
const [leftPx, rightPx] = bpSpanPx(s, e, region, bpPerPx)
|
|
199
191
|
|
|
200
192
|
if (displayMode === 'compact') {
|
|
201
193
|
heightPx /= 3
|
|
@@ -207,13 +199,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
207
199
|
}`,
|
|
208
200
|
)
|
|
209
201
|
}
|
|
210
|
-
const topPx = layout.addRect(
|
|
211
|
-
feature.id(),
|
|
212
|
-
feature.get('start') - expansionBefore,
|
|
213
|
-
feature.get('end') + expansionAfter,
|
|
214
|
-
heightPx,
|
|
215
|
-
feature,
|
|
216
|
-
)
|
|
202
|
+
const topPx = layout.addRect(feature.id(), s, e, heightPx, feature)
|
|
217
203
|
if (topPx === null) {
|
|
218
204
|
return null
|
|
219
205
|
}
|
|
@@ -473,11 +459,10 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
473
459
|
|
|
474
460
|
// probIndex applies across multiple modifications e.g.
|
|
475
461
|
let probIndex = 0
|
|
476
|
-
for (
|
|
477
|
-
const { type, positions } = modifications[i]
|
|
462
|
+
for (const { type, positions } of modifications) {
|
|
478
463
|
const col = modificationTagMap[type] || 'black'
|
|
479
464
|
|
|
480
|
-
// @ts-
|
|
465
|
+
// @ts-expect-error
|
|
481
466
|
const base = Color(col)
|
|
482
467
|
for (const readPos of getNextRefPos(cigarOps, positions)) {
|
|
483
468
|
const r = start + readPos
|
|
@@ -658,6 +643,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
658
643
|
charWidth,
|
|
659
644
|
charHeight,
|
|
660
645
|
defaultColor,
|
|
646
|
+
theme,
|
|
661
647
|
canvasWidth,
|
|
662
648
|
}: {
|
|
663
649
|
ctx: CanvasRenderingContext2D
|
|
@@ -669,9 +655,9 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
669
655
|
charHeight: number
|
|
670
656
|
defaultColor: boolean
|
|
671
657
|
canvasWidth: number
|
|
658
|
+
theme: Theme
|
|
672
659
|
}) {
|
|
673
660
|
const { config, bpPerPx, regions, colorBy, colorTagMap = {} } = renderArgs
|
|
674
|
-
|
|
675
661
|
const { tag = '', type: colorType = '' } = colorBy || {}
|
|
676
662
|
const { feature } = feat
|
|
677
663
|
const region = regions[0]
|
|
@@ -732,30 +718,25 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
732
718
|
}
|
|
733
719
|
break
|
|
734
720
|
}
|
|
735
|
-
case 'insertSizeAndPairOrientation':
|
|
721
|
+
case 'insertSizeAndPairOrientation': {
|
|
736
722
|
break
|
|
723
|
+
}
|
|
737
724
|
|
|
738
725
|
case 'modifications':
|
|
739
|
-
case 'methylation':
|
|
726
|
+
case 'methylation': {
|
|
740
727
|
// this coloring is similar to igv.js, and is helpful to color negative
|
|
741
728
|
// strand reads differently because their c-g will be flipped (e.g. g-c
|
|
742
729
|
// read right to left)
|
|
743
|
-
|
|
744
|
-
ctx.fillStyle = '#c8dcc8'
|
|
745
|
-
} else {
|
|
746
|
-
ctx.fillStyle = '#c8c8c8'
|
|
747
|
-
}
|
|
730
|
+
ctx.fillStyle = feature.get('flags') & 16 ? '#c8dcc8' : '#c8c8c8'
|
|
748
731
|
break
|
|
732
|
+
}
|
|
749
733
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
ctx.fillStyle = '#c8c8c8'
|
|
755
|
-
} else {
|
|
756
|
-
ctx.fillStyle = readConfObject(config, 'color', { feature })
|
|
757
|
-
}
|
|
734
|
+
default: {
|
|
735
|
+
ctx.fillStyle = defaultColor
|
|
736
|
+
? 'lightgrey'
|
|
737
|
+
: readConfObject(config, 'color', { feature })
|
|
758
738
|
break
|
|
739
|
+
}
|
|
759
740
|
}
|
|
760
741
|
|
|
761
742
|
this.drawRect(ctx, feat, renderArgs)
|
|
@@ -839,6 +820,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
839
820
|
charWidth: number
|
|
840
821
|
charHeight: number
|
|
841
822
|
canvasWidth: number
|
|
823
|
+
theme: Theme
|
|
842
824
|
}) {
|
|
843
825
|
const { Color, bpPerPx, regions } = renderArgs
|
|
844
826
|
const { heightPx, topPx, feature } = feat
|
|
@@ -875,19 +857,20 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
875
857
|
|
|
876
858
|
fillRect(
|
|
877
859
|
ctx,
|
|
878
|
-
leftPx,
|
|
860
|
+
Math.round(leftPx),
|
|
879
861
|
topPx,
|
|
880
862
|
widthPx,
|
|
881
863
|
heightPx,
|
|
882
864
|
canvasWidth,
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
865
|
+
|
|
866
|
+
mismatchAlpha
|
|
867
|
+
? mismatch.qual === undefined
|
|
868
|
+
? baseColor
|
|
869
|
+
: // @ts-expect-error
|
|
870
|
+
Color(baseColor)
|
|
871
|
+
.alpha(Math.min(1, mismatch.qual / 50))
|
|
872
|
+
.hsl()
|
|
873
|
+
.string()
|
|
891
874
|
: baseColor,
|
|
892
875
|
)
|
|
893
876
|
}
|
|
@@ -897,14 +880,14 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
897
880
|
const contrastColor = drawSNPsMuted
|
|
898
881
|
? 'black'
|
|
899
882
|
: contrastForBase[mismatch.base] || 'black'
|
|
900
|
-
ctx.fillStyle =
|
|
901
|
-
?
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
883
|
+
ctx.fillStyle = mismatchAlpha
|
|
884
|
+
? mismatch.qual === undefined
|
|
885
|
+
? contrastColor
|
|
886
|
+
: // @ts-expect-error
|
|
887
|
+
Color(contrastColor)
|
|
888
|
+
.alpha(Math.min(1, mismatch.qual / 50))
|
|
889
|
+
.hsl()
|
|
890
|
+
.string()
|
|
908
891
|
: contrastColor
|
|
909
892
|
ctx.fillText(
|
|
910
893
|
mbase,
|
|
@@ -1165,6 +1148,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
1165
1148
|
charWidth,
|
|
1166
1149
|
charHeight,
|
|
1167
1150
|
canvasWidth,
|
|
1151
|
+
theme,
|
|
1168
1152
|
})
|
|
1169
1153
|
this.drawMismatches({
|
|
1170
1154
|
ctx,
|
|
@@ -1180,6 +1164,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
1180
1164
|
colorForBase,
|
|
1181
1165
|
contrastForBase,
|
|
1182
1166
|
canvasWidth,
|
|
1167
|
+
theme,
|
|
1183
1168
|
})
|
|
1184
1169
|
if (showSoftClip) {
|
|
1185
1170
|
this.drawSoftClipping({
|
|
@@ -1315,10 +1300,10 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
1315
1300
|
}
|
|
1316
1301
|
}
|
|
1317
1302
|
|
|
1318
|
-
export
|
|
1319
|
-
RenderArgs,
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
ResultsSerialized,
|
|
1323
|
-
ResultsDeserialized,
|
|
1324
|
-
}
|
|
1303
|
+
export {
|
|
1304
|
+
type RenderArgs,
|
|
1305
|
+
type RenderResults,
|
|
1306
|
+
type RenderArgsSerialized,
|
|
1307
|
+
type ResultsSerialized,
|
|
1308
|
+
type ResultsDeserialized,
|
|
1309
|
+
} from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'
|
|
@@ -159,10 +159,10 @@ function PileupRendering(props: {
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
function callMouseHandler(handlerName: string, event: React.MouseEvent) {
|
|
162
|
-
// @ts-
|
|
162
|
+
// @ts-expect-error
|
|
163
163
|
// eslint-disable-next-line react/destructuring-assignment
|
|
164
164
|
const featureHandler = props[`onFeature${handlerName}`]
|
|
165
|
-
// @ts-
|
|
165
|
+
// @ts-expect-error
|
|
166
166
|
// eslint-disable-next-line react/destructuring-assignment
|
|
167
167
|
const canvasHandler = props[`on${handlerName}`]
|
|
168
168
|
if (featureHandler && featureIdUnderMouse) {
|
|
@@ -50,7 +50,7 @@ const PileupRenderer = ConfigurationSchema(
|
|
|
50
50
|
type: 'number',
|
|
51
51
|
description:
|
|
52
52
|
'the minimum width in px for a pileup mismatch feature. use for increasing/decreasing mismatch marker widths when zoomed out, e.g. 0 or 1',
|
|
53
|
-
defaultValue:
|
|
53
|
+
defaultValue: 1,
|
|
54
54
|
},
|
|
55
55
|
/**
|
|
56
56
|
* #slot
|
|
@@ -78,7 +78,7 @@ export const sortFeature = (
|
|
|
78
78
|
const acode = bMismatch && bMismatch.base.toUpperCase()
|
|
79
79
|
const bcode = aMismatch && aMismatch.base.toUpperCase()
|
|
80
80
|
if (acode === bcode && acode === '*') {
|
|
81
|
-
// @ts-
|
|
81
|
+
// @ts-expect-error
|
|
82
82
|
return aMismatch.length - bMismatch.length
|
|
83
83
|
}
|
|
84
84
|
return (
|
|
@@ -99,9 +99,10 @@ export const sortFeature = (
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
const sortedMap = new Map(
|
|
102
|
-
featuresInCenterLine
|
|
103
|
-
.
|
|
104
|
-
|
|
102
|
+
[...featuresInCenterLine, ...featuresOutsideCenter].map(feature => [
|
|
103
|
+
feature.id(),
|
|
104
|
+
feature,
|
|
105
|
+
]),
|
|
105
106
|
)
|
|
106
107
|
|
|
107
108
|
return sortedMap
|
|
@@ -35,6 +35,8 @@ interface SNPInfo {
|
|
|
35
35
|
total: number
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
const fudgeFactor = 0.6
|
|
39
|
+
|
|
38
40
|
export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
39
41
|
// note: the snps are drawn on linear scale even if the data is drawn in log
|
|
40
42
|
// scape hence the two different scales being used
|
|
@@ -78,6 +80,7 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
78
80
|
scaleType: 'linear',
|
|
79
81
|
})
|
|
80
82
|
const originY = getOrigin(scaleOpts.scaleType)
|
|
83
|
+
const originLinear = getOrigin('linear')
|
|
81
84
|
|
|
82
85
|
const indicatorThreshold = readConfObject(cfg, 'indicatorThreshold')
|
|
83
86
|
const drawInterbaseCounts = readConfObject(cfg, 'drawInterbaseCounts')
|
|
@@ -87,11 +90,9 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
87
90
|
// get the y coordinate that we are plotting at, this can be log scale
|
|
88
91
|
const toY = (n: number) => height - (viewScale(n) || 0) + offset
|
|
89
92
|
const toHeight = (n: number) => toY(originY) - toY(n)
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
const indicatorToHeight = (n: number) =>
|
|
94
|
-
indicatorToY(getOrigin('linear')) - indicatorToY(n)
|
|
93
|
+
// used specifically for indicator
|
|
94
|
+
const toY2 = (n: number) => height - (indicatorViewScale(n) || 0) + offset
|
|
95
|
+
const toHeight2 = (n: number) => toY2(originLinear) - toY2(n)
|
|
95
96
|
|
|
96
97
|
const { bases } = theme.palette
|
|
97
98
|
const colorForBase: { [key: string]: string } = {
|
|
@@ -105,7 +106,6 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
105
106
|
hardclip: 'red',
|
|
106
107
|
meth: 'red',
|
|
107
108
|
unmeth: 'blue',
|
|
108
|
-
ref: 'lightgrey',
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
const feats = [...features.values()]
|
|
@@ -118,7 +118,7 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
118
118
|
for (let i = 0; i < coverage.length; i++) {
|
|
119
119
|
const feature = coverage[i]
|
|
120
120
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)
|
|
121
|
-
const w = rightPx - leftPx +
|
|
121
|
+
const w = rightPx - leftPx + fudgeFactor
|
|
122
122
|
const score = feature.get('score') as number
|
|
123
123
|
ctx.fillRect(leftPx, toY(score), w, toHeight(score))
|
|
124
124
|
}
|
|
@@ -144,7 +144,7 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
144
144
|
|
|
145
145
|
const score = feature.get('score') as number
|
|
146
146
|
const snpinfo = feature.get('snpinfo') as SNPInfo
|
|
147
|
-
const w = Math.max(rightPx - leftPx
|
|
147
|
+
const w = Math.max(rightPx - leftPx, 1)
|
|
148
148
|
const totalScore = snpinfo.total
|
|
149
149
|
const keys = Object.keys(snpinfo.cov).sort()
|
|
150
150
|
|
|
@@ -160,7 +160,7 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
160
160
|
const height = toHeight(score)
|
|
161
161
|
const bottom = toY(score) + height
|
|
162
162
|
ctx.fillRect(
|
|
163
|
-
leftPx,
|
|
163
|
+
Math.round(leftPx),
|
|
164
164
|
bottom - ((total + curr) / score) * height,
|
|
165
165
|
w,
|
|
166
166
|
(total / score) * height,
|
|
@@ -175,12 +175,13 @@ export default class SNPCoverageRenderer extends WiggleBaseRenderer {
|
|
|
175
175
|
for (let i = 0; i < interbaseEvents.length; i++) {
|
|
176
176
|
const base = interbaseEvents[i]
|
|
177
177
|
const { total } = snpinfo.noncov[base]
|
|
178
|
+
const r = 0.6
|
|
178
179
|
ctx.fillStyle = colorForBase[base]
|
|
179
180
|
ctx.fillRect(
|
|
180
|
-
leftPx -
|
|
181
|
-
indicatorHeight +
|
|
182
|
-
|
|
183
|
-
|
|
181
|
+
leftPx - r + extraHorizontallyFlippedOffset,
|
|
182
|
+
indicatorHeight + toHeight2(curr),
|
|
183
|
+
r * 2,
|
|
184
|
+
toHeight2(total),
|
|
184
185
|
)
|
|
185
186
|
curr += total
|
|
186
187
|
}
|
package/src/index.ts
CHANGED
|
@@ -14,12 +14,7 @@ import AlignmentsTrackF from './AlignmentsTrack'
|
|
|
14
14
|
import AlignmentsFeatureWidgetF from './AlignmentsFeatureDetail'
|
|
15
15
|
import PileupRPCMethodsF from './PileupRPC'
|
|
16
16
|
import GuessAlignmentsTypesF from './GuessAlignmentsTypes'
|
|
17
|
-
import LinearPileupDisplayF
|
|
18
|
-
linearPileupDisplayStateModelFactory,
|
|
19
|
-
linearPileupDisplayConfigSchemaFactory,
|
|
20
|
-
} from './LinearPileupDisplay'
|
|
21
|
-
import { LinearPileupDisplayModel } from './LinearPileupDisplay/model'
|
|
22
|
-
import * as MismatchParser from './MismatchParser'
|
|
17
|
+
import LinearPileupDisplayF from './LinearPileupDisplay'
|
|
23
18
|
|
|
24
19
|
export default class AlignmentsPlugin extends Plugin {
|
|
25
20
|
name = 'AlignmentsPlugin'
|
|
@@ -46,8 +41,8 @@ export default class AlignmentsPlugin extends Plugin {
|
|
|
46
41
|
}
|
|
47
42
|
|
|
48
43
|
export {
|
|
49
|
-
linearPileupDisplayConfigSchemaFactory,
|
|
50
44
|
linearPileupDisplayStateModelFactory,
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
export type
|
|
45
|
+
linearPileupDisplayConfigSchemaFactory,
|
|
46
|
+
} from './LinearPileupDisplay'
|
|
47
|
+
export { type LinearPileupDisplayModel } from './LinearPileupDisplay/model'
|
|
48
|
+
export * as MismatchParser from './MismatchParser'
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default class NestedFrequencyTable {
|
|
2
|
-
categories: {
|
|
3
|
-
[key: string]: any;
|
|
4
|
-
};
|
|
5
|
-
constructor(initialData?: {});
|
|
6
|
-
total(): number;
|
|
7
|
-
decrement(slotName: string, amount: number): any;
|
|
8
|
-
increment(slotName: string, amount: number): any;
|
|
9
|
-
get(slotName: string): any;
|
|
10
|
-
getNested(path: string | string[]): any;
|
|
11
|
-
toString(): string;
|
|
12
|
-
valueOf(): number;
|
|
13
|
-
forEach(func: Function, ctx: any): void;
|
|
14
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
-
// see perf results on object.keys vs for-in loop
|
|
5
|
-
// https://jsperf.com/object-keys-vs-hasownproperty/55
|
|
6
|
-
class NestedFrequencyTable {
|
|
7
|
-
constructor(initialData = {}) {
|
|
8
|
-
this.categories = { ...initialData };
|
|
9
|
-
}
|
|
10
|
-
// get the sum of all the category counts
|
|
11
|
-
total() {
|
|
12
|
-
// calculate total if necessary
|
|
13
|
-
let t = 0;
|
|
14
|
-
for (const k in this.categories) {
|
|
15
|
-
const v = this.categories[k];
|
|
16
|
-
t += v.total ? v.total() : v;
|
|
17
|
-
}
|
|
18
|
-
return t;
|
|
19
|
-
}
|
|
20
|
-
// decrement the count for the given category
|
|
21
|
-
decrement(slotName, amount) {
|
|
22
|
-
if (!amount) {
|
|
23
|
-
amount = 1;
|
|
24
|
-
}
|
|
25
|
-
if (!slotName) {
|
|
26
|
-
slotName = 'default';
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
slotName = slotName.toString();
|
|
30
|
-
}
|
|
31
|
-
if (this.categories[slotName]) {
|
|
32
|
-
this.categories[slotName] = Math.max(0, this.categories[slotName] - amount);
|
|
33
|
-
return this.categories[slotName];
|
|
34
|
-
}
|
|
35
|
-
return 0;
|
|
36
|
-
}
|
|
37
|
-
// increment the count for the given category
|
|
38
|
-
increment(slotName, amount) {
|
|
39
|
-
if (!amount) {
|
|
40
|
-
amount = 1;
|
|
41
|
-
}
|
|
42
|
-
if (!slotName) {
|
|
43
|
-
slotName = 'default';
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
slotName = slotName.toString();
|
|
47
|
-
}
|
|
48
|
-
this.categories[slotName] = (this.categories[slotName] || 0) + amount;
|
|
49
|
-
return this.categories[slotName];
|
|
50
|
-
}
|
|
51
|
-
// get the value of the given category. may be a number or a
|
|
52
|
-
// frequency table.
|
|
53
|
-
get(slotName) {
|
|
54
|
-
return this.categories[slotName] || 0;
|
|
55
|
-
}
|
|
56
|
-
// get a given category as a frequency table
|
|
57
|
-
getNested(path) {
|
|
58
|
-
if (typeof path === 'string') {
|
|
59
|
-
path = path.split('/');
|
|
60
|
-
}
|
|
61
|
-
if (!path.length) {
|
|
62
|
-
return this;
|
|
63
|
-
}
|
|
64
|
-
const slotName = path[0].toString();
|
|
65
|
-
let slot = this.categories[slotName];
|
|
66
|
-
if (!slot || !slot.categories) {
|
|
67
|
-
this.categories[slotName] = new NestedFrequencyTable(slot ? { default: slot + 0 } : {});
|
|
68
|
-
}
|
|
69
|
-
slot = this.categories[slotName];
|
|
70
|
-
if (path.length > 1) {
|
|
71
|
-
return slot.getNested(path.slice(1));
|
|
72
|
-
}
|
|
73
|
-
return slot;
|
|
74
|
-
}
|
|
75
|
-
toString() {
|
|
76
|
-
return this.total()
|
|
77
|
-
.toPrecision(6)
|
|
78
|
-
.toString()
|
|
79
|
-
.replace(/\.?0+$/, '');
|
|
80
|
-
}
|
|
81
|
-
valueOf() {
|
|
82
|
-
return this.total();
|
|
83
|
-
}
|
|
84
|
-
// iterate through the categories and counts, call like:
|
|
85
|
-
//
|
|
86
|
-
// tbl.forEach( function( count, categoryName ) {
|
|
87
|
-
// // do something
|
|
88
|
-
// }, this );
|
|
89
|
-
//
|
|
90
|
-
forEach(func, ctx) {
|
|
91
|
-
if (ctx) {
|
|
92
|
-
for (const slotName in this.categories) {
|
|
93
|
-
func.call(ctx, this.categories[slotName], slotName);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
for (const slotName in this.categories) {
|
|
98
|
-
func(this.categories[slotName], slotName);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
exports.default = NestedFrequencyTable;
|
|
104
|
-
//# sourceMappingURL=NestedFrequencyTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NestedFrequencyTable.js","sourceRoot":"","sources":["../src/NestedFrequencyTable.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default class NestedFrequencyTable {
|
|
2
|
-
categories: {
|
|
3
|
-
[key: string]: any;
|
|
4
|
-
};
|
|
5
|
-
constructor(initialData?: {});
|
|
6
|
-
total(): number;
|
|
7
|
-
decrement(slotName: string, amount: number): any;
|
|
8
|
-
increment(slotName: string, amount: number): any;
|
|
9
|
-
get(slotName: string): any;
|
|
10
|
-
getNested(path: string | string[]): any;
|
|
11
|
-
toString(): string;
|
|
12
|
-
valueOf(): number;
|
|
13
|
-
forEach(func: Function, ctx: any): void;
|
|
14
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
// see perf results on object.keys vs for-in loop
|
|
3
|
-
// https://jsperf.com/object-keys-vs-hasownproperty/55
|
|
4
|
-
export default class NestedFrequencyTable {
|
|
5
|
-
constructor(initialData = {}) {
|
|
6
|
-
this.categories = { ...initialData };
|
|
7
|
-
}
|
|
8
|
-
// get the sum of all the category counts
|
|
9
|
-
total() {
|
|
10
|
-
// calculate total if necessary
|
|
11
|
-
let t = 0;
|
|
12
|
-
for (const k in this.categories) {
|
|
13
|
-
const v = this.categories[k];
|
|
14
|
-
t += v.total ? v.total() : v;
|
|
15
|
-
}
|
|
16
|
-
return t;
|
|
17
|
-
}
|
|
18
|
-
// decrement the count for the given category
|
|
19
|
-
decrement(slotName, amount) {
|
|
20
|
-
if (!amount) {
|
|
21
|
-
amount = 1;
|
|
22
|
-
}
|
|
23
|
-
if (!slotName) {
|
|
24
|
-
slotName = 'default';
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
slotName = slotName.toString();
|
|
28
|
-
}
|
|
29
|
-
if (this.categories[slotName]) {
|
|
30
|
-
this.categories[slotName] = Math.max(0, this.categories[slotName] - amount);
|
|
31
|
-
return this.categories[slotName];
|
|
32
|
-
}
|
|
33
|
-
return 0;
|
|
34
|
-
}
|
|
35
|
-
// increment the count for the given category
|
|
36
|
-
increment(slotName, amount) {
|
|
37
|
-
if (!amount) {
|
|
38
|
-
amount = 1;
|
|
39
|
-
}
|
|
40
|
-
if (!slotName) {
|
|
41
|
-
slotName = 'default';
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
slotName = slotName.toString();
|
|
45
|
-
}
|
|
46
|
-
this.categories[slotName] = (this.categories[slotName] || 0) + amount;
|
|
47
|
-
return this.categories[slotName];
|
|
48
|
-
}
|
|
49
|
-
// get the value of the given category. may be a number or a
|
|
50
|
-
// frequency table.
|
|
51
|
-
get(slotName) {
|
|
52
|
-
return this.categories[slotName] || 0;
|
|
53
|
-
}
|
|
54
|
-
// get a given category as a frequency table
|
|
55
|
-
getNested(path) {
|
|
56
|
-
if (typeof path === 'string') {
|
|
57
|
-
path = path.split('/');
|
|
58
|
-
}
|
|
59
|
-
if (!path.length) {
|
|
60
|
-
return this;
|
|
61
|
-
}
|
|
62
|
-
const slotName = path[0].toString();
|
|
63
|
-
let slot = this.categories[slotName];
|
|
64
|
-
if (!slot || !slot.categories) {
|
|
65
|
-
this.categories[slotName] = new NestedFrequencyTable(slot ? { default: slot + 0 } : {});
|
|
66
|
-
}
|
|
67
|
-
slot = this.categories[slotName];
|
|
68
|
-
if (path.length > 1) {
|
|
69
|
-
return slot.getNested(path.slice(1));
|
|
70
|
-
}
|
|
71
|
-
return slot;
|
|
72
|
-
}
|
|
73
|
-
toString() {
|
|
74
|
-
return this.total()
|
|
75
|
-
.toPrecision(6)
|
|
76
|
-
.toString()
|
|
77
|
-
.replace(/\.?0+$/, '');
|
|
78
|
-
}
|
|
79
|
-
valueOf() {
|
|
80
|
-
return this.total();
|
|
81
|
-
}
|
|
82
|
-
// iterate through the categories and counts, call like:
|
|
83
|
-
//
|
|
84
|
-
// tbl.forEach( function( count, categoryName ) {
|
|
85
|
-
// // do something
|
|
86
|
-
// }, this );
|
|
87
|
-
//
|
|
88
|
-
forEach(func, ctx) {
|
|
89
|
-
if (ctx) {
|
|
90
|
-
for (const slotName in this.categories) {
|
|
91
|
-
func.call(ctx, this.categories[slotName], slotName);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
for (const slotName in this.categories) {
|
|
96
|
-
func(this.categories[slotName], slotName);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=NestedFrequencyTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NestedFrequencyTable.js","sourceRoot":"","sources":["../src/NestedFrequencyTable.ts"],"names":[],"mappings":"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"}
|