@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.
Files changed (145) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +4 -4
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +88 -126
  3. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  4. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.d.ts +6 -0
  5. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js +44 -0
  6. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js.map +1 -0
  7. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.d.ts +6 -0
  8. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js +37 -0
  9. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js.map +1 -0
  10. package/dist/AlignmentsFeatureDetail/index.d.ts +1 -1
  11. package/dist/AlignmentsFeatureDetail/util.d.ts +8 -0
  12. package/dist/AlignmentsFeatureDetail/util.js +27 -0
  13. package/dist/AlignmentsFeatureDetail/util.js.map +1 -0
  14. package/dist/BamAdapter/BamAdapter.js +2 -2
  15. package/dist/BamAdapter/BamAdapter.js.map +1 -1
  16. package/dist/BamAdapter/BamSlightlyLazyFeature.js +2 -2
  17. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  18. package/dist/CramAdapter/CramAdapter.js +2 -2
  19. package/dist/CramAdapter/CramAdapter.js.map +1 -1
  20. package/dist/CramAdapter/CramSlightlyLazyFeature.js +2 -2
  21. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  22. package/dist/CramAdapter/util.js +10 -10
  23. package/dist/CramAdapter/util.js.map +1 -1
  24. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +4 -4
  25. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  26. package/dist/LinearAlignmentsDisplay/models/model.d.ts +2 -4
  27. package/dist/LinearAlignmentsDisplay/models/model.js +3 -4
  28. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
  29. package/dist/LinearPileupDisplay/index.d.ts +2 -3
  30. package/dist/LinearPileupDisplay/index.js +4 -2
  31. package/dist/LinearPileupDisplay/index.js.map +1 -1
  32. package/dist/LinearPileupDisplay/model.d.ts +30 -31
  33. package/dist/LinearPileupDisplay/model.js +4 -4
  34. package/dist/LinearPileupDisplay/model.js.map +1 -1
  35. package/dist/LinearReadArcsDisplay/model.d.ts +13 -21
  36. package/dist/LinearReadCloudDisplay/model.d.ts +13 -21
  37. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +22 -24
  38. package/dist/MismatchParser/index.js +6 -8
  39. package/dist/MismatchParser/index.js.map +1 -1
  40. package/dist/PileupRPC/rpcMethods.d.ts +3 -4
  41. package/dist/PileupRPC/rpcMethods.js +6 -6
  42. package/dist/PileupRPC/rpcMethods.js.map +1 -1
  43. package/dist/PileupRenderer/PileupRenderer.d.ts +5 -3
  44. package/dist/PileupRenderer/PileupRenderer.js +29 -33
  45. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  46. package/dist/PileupRenderer/components/PileupRendering.js +2 -2
  47. package/dist/PileupRenderer/components/PileupRendering.js.map +1 -1
  48. package/dist/PileupRenderer/configSchema.js +1 -1
  49. package/dist/PileupRenderer/configSchema.js.map +1 -1
  50. package/dist/PileupRenderer/sortUtil.js +5 -4
  51. package/dist/PileupRenderer/sortUtil.js.map +1 -1
  52. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +10 -7
  53. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -1
  54. package/dist/index.d.ts +3 -5
  55. package/dist/index.js +6 -6
  56. package/dist/index.js.map +1 -1
  57. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +4 -4
  58. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +88 -126
  59. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  60. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.d.ts +6 -0
  61. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js +38 -0
  62. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js.map +1 -0
  63. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.d.ts +6 -0
  64. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js +31 -0
  65. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.js.map +1 -0
  66. package/esm/AlignmentsFeatureDetail/index.d.ts +1 -1
  67. package/esm/AlignmentsFeatureDetail/util.d.ts +8 -0
  68. package/esm/AlignmentsFeatureDetail/util.js +22 -0
  69. package/esm/AlignmentsFeatureDetail/util.js.map +1 -0
  70. package/esm/BamAdapter/BamAdapter.js +2 -2
  71. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  72. package/esm/BamAdapter/BamSlightlyLazyFeature.js +2 -2
  73. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  74. package/esm/CramAdapter/CramAdapter.js +2 -2
  75. package/esm/CramAdapter/CramAdapter.js.map +1 -1
  76. package/esm/CramAdapter/CramSlightlyLazyFeature.js +2 -2
  77. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  78. package/esm/CramAdapter/util.js +10 -10
  79. package/esm/CramAdapter/util.js.map +1 -1
  80. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +4 -4
  81. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  82. package/esm/LinearAlignmentsDisplay/models/model.d.ts +2 -4
  83. package/esm/LinearAlignmentsDisplay/models/model.js +3 -4
  84. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  85. package/esm/LinearPileupDisplay/index.d.ts +2 -3
  86. package/esm/LinearPileupDisplay/index.js +2 -1
  87. package/esm/LinearPileupDisplay/index.js.map +1 -1
  88. package/esm/LinearPileupDisplay/model.d.ts +30 -31
  89. package/esm/LinearPileupDisplay/model.js +4 -4
  90. package/esm/LinearPileupDisplay/model.js.map +1 -1
  91. package/esm/LinearReadArcsDisplay/model.d.ts +13 -21
  92. package/esm/LinearReadCloudDisplay/model.d.ts +13 -21
  93. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +22 -24
  94. package/esm/MismatchParser/index.js +6 -8
  95. package/esm/MismatchParser/index.js.map +1 -1
  96. package/esm/PileupRPC/rpcMethods.d.ts +3 -4
  97. package/esm/PileupRPC/rpcMethods.js +3 -4
  98. package/esm/PileupRPC/rpcMethods.js.map +1 -1
  99. package/esm/PileupRenderer/PileupRenderer.d.ts +5 -3
  100. package/esm/PileupRenderer/PileupRenderer.js +29 -33
  101. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  102. package/esm/PileupRenderer/components/PileupRendering.js +2 -2
  103. package/esm/PileupRenderer/components/PileupRendering.js.map +1 -1
  104. package/esm/PileupRenderer/configSchema.js +1 -1
  105. package/esm/PileupRenderer/configSchema.js.map +1 -1
  106. package/esm/PileupRenderer/sortUtil.js +5 -4
  107. package/esm/PileupRenderer/sortUtil.js.map +1 -1
  108. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +10 -7
  109. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -1
  110. package/esm/index.d.ts +3 -5
  111. package/esm/index.js +3 -3
  112. package/esm/index.js.map +1 -1
  113. package/package.json +2 -2
  114. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +109 -183
  115. package/src/AlignmentsFeatureDetail/AlignmentsFeatureFlags.tsx +62 -0
  116. package/src/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.tsx +51 -0
  117. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.tsx.snap +3 -2
  118. package/src/AlignmentsFeatureDetail/index.test.tsx +1 -1
  119. package/src/AlignmentsFeatureDetail/util.ts +27 -0
  120. package/src/BamAdapter/BamAdapter.ts +2 -2
  121. package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -2
  122. package/src/CramAdapter/CramAdapter.ts +2 -2
  123. package/src/CramAdapter/CramSlightlyLazyFeature.ts +2 -2
  124. package/src/CramAdapter/util.ts +10 -10
  125. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +4 -4
  126. package/src/LinearAlignmentsDisplay/models/configSchema.test.ts +1 -1
  127. package/src/LinearAlignmentsDisplay/models/model.tsx +4 -5
  128. package/src/LinearPileupDisplay/index.ts +2 -4
  129. package/src/LinearPileupDisplay/model.ts +4 -4
  130. package/src/LinearSNPCoverageDisplay/models/configSchema.test.ts +1 -1
  131. package/src/MismatchParser/index.ts +5 -7
  132. package/src/PileupRPC/rpcMethods.ts +3 -9
  133. package/src/PileupRenderer/PileupRenderer.ts +46 -61
  134. package/src/PileupRenderer/components/PileupRendering.tsx +2 -2
  135. package/src/PileupRenderer/configSchema.ts +1 -1
  136. package/src/PileupRenderer/sortUtil.ts +5 -4
  137. package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +14 -13
  138. package/src/index.ts +5 -10
  139. package/dist/NestedFrequencyTable.d.ts +0 -14
  140. package/dist/NestedFrequencyTable.js +0 -104
  141. package/dist/NestedFrequencyTable.js.map +0 -1
  142. package/esm/NestedFrequencyTable.d.ts +0 -14
  143. package/esm/NestedFrequencyTable.js +0 -101
  144. package/esm/NestedFrequencyTable.js.map +0 -1
  145. 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 (let i = 0; i < modifications.length; i++) {
477
- const { type, positions } = modifications[i]
462
+ for (const { type, positions } of modifications) {
478
463
  const col = modificationTagMap[type] || 'black'
479
464
 
480
- // @ts-ignore
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
- if (feature.get('flags') & 16) {
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
- case 'normal':
751
- default:
752
- if (defaultColor) {
753
- // avoid a readConfObject call here
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
- !mismatchAlpha
884
- ? baseColor
885
- : mismatch.qual !== undefined
886
- ? // @ts-ignore
887
- Color(baseColor)
888
- .alpha(Math.min(1, mismatch.qual / 50))
889
- .hsl()
890
- .string()
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 = !mismatchAlpha
901
- ? contrastColor
902
- : mismatch.qual !== undefined
903
- ? // @ts-ignore
904
- Color(contrastColor)
905
- .alpha(Math.min(1, mismatch.qual / 50))
906
- .hsl()
907
- .string()
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 type {
1319
- RenderArgs,
1320
- RenderArgsSerialized,
1321
- RenderResults,
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-ignore
162
+ // @ts-expect-error
163
163
  // eslint-disable-next-line react/destructuring-assignment
164
164
  const featureHandler = props[`onFeature${handlerName}`]
165
- // @ts-ignore
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: 0.7,
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-ignore
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
- .concat(featuresOutsideCenter)
104
- .map(feature => [feature.id(), feature]),
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 indicatorToY = (n: number) =>
92
- height - (indicatorViewScale(n) || 0) + offset
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 + 0.3
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 + 0.3, 1)
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 - 0.6 + extraHorizontallyFlippedOffset,
181
- indicatorHeight + indicatorToHeight(curr),
182
- 1.2,
183
- indicatorToHeight(total),
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
- MismatchParser,
52
- }
53
- export type { LinearPileupDisplayModel }
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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"}