@jbrowse/plugin-alignments 2.6.3 → 2.7.0

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 (121) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +2 -2
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -1
  3. package/dist/AlignmentsFeatureDetail/util.d.ts +1 -3
  4. package/dist/BamAdapter/BamAdapter.d.ts +2 -9
  5. package/dist/CramAdapter/CramAdapter.d.ts +3 -11
  6. package/dist/CramAdapter/CramAdapter.js +2 -1
  7. package/dist/CramAdapter/util.js +3 -6
  8. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +3 -4
  9. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +3 -3
  10. package/dist/LinearAlignmentsDisplay/models/model.d.ts +5 -9
  11. package/dist/LinearAlignmentsDisplay/models/model.js +1 -0
  12. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +49 -27
  13. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +20 -2
  14. package/dist/LinearPileupDisplay/components/ColorByModifications.d.ts +4 -5
  15. package/dist/LinearPileupDisplay/components/ColorByModifications.js +3 -4
  16. package/dist/LinearPileupDisplay/components/ColorByTag.d.ts +7 -5
  17. package/dist/LinearPileupDisplay/components/ColorByTag.js +4 -7
  18. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +3 -4
  19. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +2 -2
  20. package/dist/LinearPileupDisplay/components/SetFeatureHeight.d.ts +4 -5
  21. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +3 -3
  22. package/dist/LinearPileupDisplay/components/SetMaxHeight.d.ts +3 -4
  23. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +3 -3
  24. package/dist/LinearPileupDisplay/components/SortByTag.d.ts +3 -4
  25. package/dist/LinearPileupDisplay/components/SortByTag.js +3 -3
  26. package/dist/LinearPileupDisplay/model.d.ts +56 -35
  27. package/dist/LinearPileupDisplay/model.js +3 -2
  28. package/dist/LinearReadArcsDisplay/components/ReactComponent.d.ts +2 -2
  29. package/dist/LinearReadArcsDisplay/components/ReactComponent.js +2 -1
  30. package/dist/LinearReadArcsDisplay/model.d.ts +9 -14
  31. package/dist/LinearReadCloudDisplay/components/ReactComponent.d.ts +2 -2
  32. package/dist/LinearReadCloudDisplay/components/ReactComponent.js +2 -1
  33. package/dist/LinearReadCloudDisplay/drawPairChains.js +1 -2
  34. package/dist/LinearReadCloudDisplay/model.d.ts +13 -15
  35. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
  36. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +18 -423
  37. package/dist/LinearSNPCoverageDisplay/models/model.js +18 -0
  38. package/dist/MismatchParser/index.js +6 -8
  39. package/dist/PileupRenderer/PileupRenderer.js +0 -25
  40. package/dist/PileupRenderer/colorBy.js +1 -1
  41. package/dist/PileupRenderer/components/PileupRendering.d.ts +9 -10
  42. package/dist/PileupRenderer/components/PileupRendering.js +3 -5
  43. package/dist/PileupRenderer/getAlignmentShapeColor.js +1 -1
  44. package/dist/PileupRenderer/layoutFeature.js +1 -2
  45. package/dist/PileupRenderer/makeImageData.d.ts +1 -3
  46. package/dist/PileupRenderer/renderMethylation.js +5 -10
  47. package/dist/PileupRenderer/renderMismatches.d.ts +2 -6
  48. package/dist/PileupRenderer/renderMismatches.js +8 -11
  49. package/dist/PileupRenderer/renderModifications.js +4 -8
  50. package/dist/PileupRenderer/renderSoftClipping.js +26 -25
  51. package/dist/PileupRenderer/sortUtil.js +2 -2
  52. package/dist/SNPCoverageAdapter/util.d.ts +9 -13
  53. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +6 -12
  54. package/dist/shared/BaseDisplayComponent.d.ts +2 -2
  55. package/dist/shared/BaseDisplayComponent.js +2 -1
  56. package/dist/shared/FilterByTag.d.ts +6 -15
  57. package/dist/shared/FilterByTag.js +4 -6
  58. package/dist/shared/fetchChains.js +1 -0
  59. package/dist/shared/index.d.ts +9 -0
  60. package/dist/util.d.ts +3 -9
  61. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +2 -2
  62. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -1
  63. package/esm/AlignmentsFeatureDetail/util.d.ts +1 -3
  64. package/esm/BamAdapter/BamAdapter.d.ts +2 -9
  65. package/esm/CramAdapter/CramAdapter.d.ts +3 -11
  66. package/esm/CramAdapter/CramAdapter.js +2 -1
  67. package/esm/CramAdapter/util.js +3 -6
  68. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +3 -4
  69. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +3 -3
  70. package/esm/LinearAlignmentsDisplay/models/model.d.ts +5 -9
  71. package/esm/LinearAlignmentsDisplay/models/model.js +1 -0
  72. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +49 -27
  73. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +20 -2
  74. package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +4 -5
  75. package/esm/LinearPileupDisplay/components/ColorByModifications.js +3 -4
  76. package/esm/LinearPileupDisplay/components/ColorByTag.d.ts +7 -5
  77. package/esm/LinearPileupDisplay/components/ColorByTag.js +4 -7
  78. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +3 -4
  79. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +2 -2
  80. package/esm/LinearPileupDisplay/components/SetFeatureHeight.d.ts +4 -5
  81. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +3 -3
  82. package/esm/LinearPileupDisplay/components/SetMaxHeight.d.ts +3 -4
  83. package/esm/LinearPileupDisplay/components/SetMaxHeight.js +3 -3
  84. package/esm/LinearPileupDisplay/components/SortByTag.d.ts +3 -4
  85. package/esm/LinearPileupDisplay/components/SortByTag.js +3 -3
  86. package/esm/LinearPileupDisplay/model.d.ts +56 -35
  87. package/esm/LinearPileupDisplay/model.js +3 -2
  88. package/esm/LinearReadArcsDisplay/components/ReactComponent.d.ts +2 -2
  89. package/esm/LinearReadArcsDisplay/components/ReactComponent.js +2 -1
  90. package/esm/LinearReadArcsDisplay/model.d.ts +9 -14
  91. package/esm/LinearReadCloudDisplay/components/ReactComponent.d.ts +2 -2
  92. package/esm/LinearReadCloudDisplay/components/ReactComponent.js +2 -1
  93. package/esm/LinearReadCloudDisplay/drawPairChains.js +1 -2
  94. package/esm/LinearReadCloudDisplay/model.d.ts +13 -15
  95. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
  96. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +18 -423
  97. package/esm/LinearSNPCoverageDisplay/models/model.js +18 -0
  98. package/esm/MismatchParser/index.js +6 -8
  99. package/esm/PileupRenderer/PileupRenderer.js +0 -2
  100. package/esm/PileupRenderer/colorBy.js +1 -1
  101. package/esm/PileupRenderer/components/PileupRendering.d.ts +9 -10
  102. package/esm/PileupRenderer/components/PileupRendering.js +3 -5
  103. package/esm/PileupRenderer/getAlignmentShapeColor.js +1 -1
  104. package/esm/PileupRenderer/layoutFeature.js +1 -2
  105. package/esm/PileupRenderer/makeImageData.d.ts +1 -3
  106. package/esm/PileupRenderer/renderMethylation.js +5 -10
  107. package/esm/PileupRenderer/renderMismatches.d.ts +2 -6
  108. package/esm/PileupRenderer/renderMismatches.js +8 -11
  109. package/esm/PileupRenderer/renderModifications.js +4 -8
  110. package/esm/PileupRenderer/renderSoftClipping.js +26 -25
  111. package/esm/PileupRenderer/sortUtil.js +2 -2
  112. package/esm/SNPCoverageAdapter/util.d.ts +9 -13
  113. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +6 -12
  114. package/esm/shared/BaseDisplayComponent.d.ts +2 -2
  115. package/esm/shared/BaseDisplayComponent.js +3 -2
  116. package/esm/shared/FilterByTag.d.ts +6 -15
  117. package/esm/shared/FilterByTag.js +4 -6
  118. package/esm/shared/fetchChains.js +1 -0
  119. package/esm/shared/index.d.ts +9 -0
  120. package/esm/util.d.ts +3 -9
  121. package/package.json +3 -4
@@ -30,7 +30,7 @@ const mobx_react_1 = require("mobx-react");
30
30
  // used so that user can click-away-from-feature below the laid out features
31
31
  // (issue #1248)
32
32
  const canvasPadding = 100;
33
- function PileupRendering(props) {
33
+ const PileupRendering = (0, mobx_react_1.observer)(function (props) {
34
34
  var _a;
35
35
  const { onMouseMove, blockKey, displayModel, width, height, regions, bpPerPx, sortedBy, colorBy, filterBy, } = props;
36
36
  const { selectedFeatureId, featureIdUnderMouse, contextMenuFeature } = displayModel;
@@ -133,10 +133,8 @@ function PileupRendering(props) {
133
133
  }
134
134
  function callMouseHandler(handlerName, event) {
135
135
  // @ts-expect-error
136
- // eslint-disable-next-line react/destructuring-assignment
137
136
  const featureHandler = props[`onFeature${handlerName}`];
138
137
  // @ts-expect-error
139
- // eslint-disable-next-line react/destructuring-assignment
140
138
  const canvasHandler = props[`on${handlerName}`];
141
139
  if (featureHandler && featureIdUnderMouse) {
142
140
  featureHandler(event, featureIdUnderMouse);
@@ -157,5 +155,5 @@ function PileupRendering(props) {
157
155
  .join('-')}`, style: { position: 'relative', width: canvasWidth, height } },
158
156
  react_1.default.createElement(ui_1.PrerenderedCanvas, { ...props, style: { position: 'absolute', left: 0, top: 0 } }),
159
157
  react_1.default.createElement("canvas", { "data-testid": "pileup_overlay_canvas", width: canvasWidth, height: height + canvasPadding, style: { position: 'absolute', left: 0, top: 0 }, className: "highlightOverlayCanvas", ref: highlightOverlayCanvas, onMouseDown: event => onMouseDown(event), onMouseEnter: event => onMouseEnter(event), onMouseOut: event => onMouseOut(event), onMouseOver: event => onMouseOver(event), onMouseUp: event => onMouseUp(event), onMouseLeave: event => onMouseLeave(event), onMouseMove: event => mouseMove(event), onClick: event => onClick(event), onContextMenu: event => onContextMenu(event), onFocus: () => { }, onBlur: () => { } })));
160
- }
161
- exports.default = (0, mobx_react_1.observer)(PileupRendering);
158
+ });
159
+ exports.default = PileupRendering;
@@ -39,7 +39,7 @@ function getAlignmentShapeColor({ colorType, tag, feature, config, defaultColor,
39
39
  }[val] || 'color_nostrand'];
40
40
  }
41
41
  else {
42
- return colorTagMap[val] || color_1.fillColor['color_nostrand'];
42
+ return colorTagMap[val] || color_1.fillColor.color_nostrand;
43
43
  }
44
44
  }
45
45
  case 'insertSizeAndPairOrientation':
@@ -10,8 +10,7 @@ function layoutFeature({ feature, layout, bpPerPx, region, showSoftClip, heightP
10
10
  const mismatches = feature.get('mismatches');
11
11
  const seq = feature.get('seq');
12
12
  if (seq) {
13
- for (let i = 0; i < mismatches.length; i += 1) {
14
- const { type, start, cliplen = 0 } = mismatches[i];
13
+ for (const { type, start, cliplen = 0 } of mismatches) {
15
14
  if (type === 'softclip') {
16
15
  start === 0 ? (expansionBefore = cliplen) : (expansionAfter = cliplen);
17
16
  }
@@ -1,8 +1,6 @@
1
1
  import { Feature } from '@jbrowse/core/util';
2
2
  import { RenderArgsDeserializedWithFeaturesAndLayout } from './PileupRenderer';
3
- export interface RenderArgsWithColor extends RenderArgsDeserializedWithFeaturesAndLayout {
4
- Color: Awaited<typeof import('color')>;
5
- }
3
+ export type RenderArgsWithColor = RenderArgsDeserializedWithFeaturesAndLayout;
6
4
  interface LayoutFeature {
7
5
  heightPx: number;
8
6
  topPx: number;
@@ -4,11 +4,12 @@ exports.renderMethylation = void 0;
4
4
  const util_1 = require("@jbrowse/core/util");
5
5
  const MismatchParser_1 = require("../MismatchParser");
6
6
  const util_2 = require("./util");
7
+ const colord_1 = require("@jbrowse/core/util/colord");
7
8
  // Color by methylation is slightly modified version of color by
8
9
  // modifications that focuses on CpG sites, with non-methylated CpG colored
9
10
  function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
10
11
  var _a, _b;
11
- const { regionSequence, Color } = renderArgs;
12
+ const { regionSequence } = renderArgs;
12
13
  const { feature, topPx, heightPx } = feat;
13
14
  if (!regionSequence) {
14
15
  throw new Error('region sequence required for methylation');
@@ -23,15 +24,9 @@ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth
23
24
  function getCol(k) {
24
25
  if (methBins[k]) {
25
26
  const p = methProbs[k] || 0;
26
- return p > 0.5
27
- ? Color('red')
28
- .alpha((p - 0.5) * 2)
29
- .hsl()
30
- .string()
31
- : Color('blue')
32
- .alpha(1 - p * 2)
33
- .hsl()
34
- .string();
27
+ return (p > 0.5
28
+ ? (0, colord_1.colord)('red').alpha((p - 0.5) * 2)
29
+ : (0, colord_1.colord)('blue').alpha(1 - p * 2)).toHslString();
35
30
  }
36
31
  return undefined;
37
32
  }
@@ -4,12 +4,8 @@ export declare function renderMismatches({ ctx, feat, renderArgs, minSubfeatureW
4
4
  ctx: CanvasRenderingContext2D;
5
5
  feat: LayoutFeature;
6
6
  renderArgs: RenderArgsWithColor;
7
- colorForBase: {
8
- [key: string]: string;
9
- };
10
- contrastForBase: {
11
- [key: string]: string;
12
- };
7
+ colorForBase: Record<string, string>;
8
+ contrastForBase: Record<string, string>;
13
9
  mismatchAlpha?: boolean;
14
10
  drawIndels?: boolean;
15
11
  drawSNPsMuted?: boolean;
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderMismatches = void 0;
4
4
  const util_1 = require("@jbrowse/core/util");
5
5
  const util_2 = require("./util");
6
+ const colord_1 = require("@jbrowse/core/util/colord");
6
7
  function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInsertionIndicatorScale, mismatchAlpha, charWidth, charHeight, colorForBase, contrastForBase, canvasWidth, drawSNPsMuted, drawIndels = true, }) {
7
- const { Color, bpPerPx, regions } = renderArgs;
8
+ const { bpPerPx, regions } = renderArgs;
8
9
  const { heightPx, topPx, feature } = feat;
9
10
  const [region] = regions;
10
11
  const start = feature.get('start');
@@ -19,8 +20,7 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
19
20
  }
20
21
  // two pass rendering: first pass, draw all the mismatches except wide
21
22
  // insertion markers
22
- for (let i = 0; i < mismatches.length; i += 1) {
23
- const mismatch = mismatches[i];
23
+ for (const mismatch of mismatches) {
24
24
  const mstart = start + mismatch.start;
25
25
  const mlen = mismatch.length;
26
26
  const mbase = mismatch.base;
@@ -32,10 +32,9 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
32
32
  const c = mismatchAlpha
33
33
  ? mismatch.qual === undefined
34
34
  ? baseColor
35
- : Color(baseColor)
35
+ : (0, colord_1.colord)(baseColor)
36
36
  .alpha(Math.min(1, mismatch.qual / 50))
37
- .hsl()
38
- .string()
37
+ .toHslString()
39
38
  : baseColor;
40
39
  (0, util_2.fillRect)(ctx, Math.round(leftPx), topPx, widthPx, heightPx, canvasWidth, c);
41
40
  }
@@ -47,10 +46,9 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
47
46
  ctx.fillStyle = mismatchAlpha
48
47
  ? mismatch.qual === undefined
49
48
  ? contrastColor
50
- : Color(contrastColor)
49
+ : (0, colord_1.colord)(contrastColor)
51
50
  .alpha(Math.min(1, mismatch.qual / 50))
52
- .hsl()
53
- .string()
51
+ .toHslString()
54
52
  : contrastColor;
55
53
  ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
56
54
  }
@@ -105,8 +103,7 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
105
103
  }
106
104
  // second pass, draw wide insertion markers on top
107
105
  if (drawIndels) {
108
- for (let i = 0; i < mismatches.length; i += 1) {
109
- const mismatch = mismatches[i];
106
+ for (const mismatch of mismatches) {
110
107
  const mstart = start + mismatch.start;
111
108
  const mlen = mismatch.length;
112
109
  const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
@@ -5,6 +5,7 @@ const util_1 = require("@jbrowse/core/util");
5
5
  const MismatchParser_1 = require("../MismatchParser");
6
6
  const util_2 = require("../util");
7
7
  const util_3 = require("./util");
8
+ const colord_1 = require("@jbrowse/core/util/colord");
8
9
  // render modifications stored in MM tag in BAM
9
10
  //
10
11
  // ML stores probabilities as array of numerics and MP is scaled phred scores
@@ -17,7 +18,7 @@ const util_3 = require("./util");
17
18
  // about low qual calls <20 approx
18
19
  function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
19
20
  const { feature, topPx, heightPx } = feat;
20
- const { Color, modificationTagMap = {} } = renderArgs;
21
+ const { modificationTagMap = {} } = renderArgs;
21
22
  const seq = feature.get('seq');
22
23
  if (!seq) {
23
24
  return;
@@ -33,17 +34,12 @@ function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWid
33
34
  let probIndex = 0;
34
35
  for (const { type, positions } of modifications) {
35
36
  const col = modificationTagMap[type] || 'black';
36
- const base = Color(col);
37
+ const base = (0, colord_1.colord)(col);
37
38
  for (const readPos of (0, MismatchParser_1.getNextRefPos)(cigarOps, positions)) {
38
39
  const r = start + readPos;
39
40
  const [leftPx, rightPx] = (0, util_1.bpSpanPx)(r, r + 1, region, bpPerPx);
40
41
  const prob = (probabilities === null || probabilities === void 0 ? void 0 : probabilities[probIndex]) || 0;
41
- const c = prob !== 1
42
- ? base
43
- .alpha(prob + 0.1)
44
- .hsl()
45
- .string()
46
- : col;
42
+ const c = prob !== 1 ? base.alpha(prob + 0.1).toHslString() : col;
47
43
  const w = rightPx - leftPx + 0.5;
48
44
  (0, util_3.fillRect)(ctx, leftPx, topPx, w, heightPx, canvasWidth, c);
49
45
  probIndex++;
@@ -16,32 +16,33 @@ function renderSoftClipping({ ctx, feat, renderArgs, config, theme, colorForBase
16
16
  if (!(seq && mismatches)) {
17
17
  return;
18
18
  }
19
- mismatches
20
- .filter(mismatch => mismatch.type === 'softclip')
21
- .forEach(mismatch => {
22
- const len = mismatch.cliplen || 0;
23
- const s = feature.get('start');
24
- const start = mismatch.start === 0 ? s - len : s + mismatch.start;
25
- for (let k = 0; k < len; k += 1) {
26
- const base = seq.charAt(k + mismatch.start);
27
- // If softclip length+start is longer than sequence, no need to
28
- // continue showing base
29
- if (!base) {
30
- return;
31
- }
32
- const s0 = start + k;
33
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s0, s0 + 1, region, bpPerPx);
34
- const widthPx = Math.max(minFeatWidth, rightPx - leftPx);
35
- // Black accounts for IUPAC ambiguity code bases such as N that
36
- // show in soft clipping
37
- const baseColor = colorForBase[base] || '#000000';
38
- ctx.fillStyle = baseColor;
39
- (0, util_2.fillRect)(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth);
40
- if (widthPx >= charWidth && heightPx >= charHeight - 5) {
41
- ctx.fillStyle = theme.palette.getContrastText(baseColor);
42
- ctx.fillText(base, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
19
+ const heightLim = charHeight - 2;
20
+ for (const mismatch of mismatches) {
21
+ if (mismatch.type === 'softclip') {
22
+ const len = mismatch.cliplen || 0;
23
+ const s = feature.get('start');
24
+ const start = mismatch.start === 0 ? s - len : s + mismatch.start;
25
+ for (let k = 0; k < len; k += 1) {
26
+ const base = seq.charAt(k + mismatch.start);
27
+ // If softclip length+start is longer than sequence, no need to
28
+ // continue showing base
29
+ if (!base) {
30
+ return;
31
+ }
32
+ const s0 = start + k;
33
+ const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s0, s0 + 1, region, bpPerPx);
34
+ const widthPx = Math.max(minFeatWidth, rightPx - leftPx);
35
+ // Black accounts for IUPAC ambiguity code bases such as N that
36
+ // show in soft clipping
37
+ const baseColor = colorForBase[base] || '#000000';
38
+ ctx.fillStyle = baseColor;
39
+ (0, util_2.fillRect)(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth);
40
+ if (widthPx >= charWidth && heightPx >= heightLim) {
41
+ ctx.fillStyle = theme.palette.getContrastText(baseColor);
42
+ ctx.fillText(base, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
43
+ }
43
44
  }
44
45
  }
45
- });
46
+ }
46
47
  }
47
48
  exports.renderSoftClipping = renderSoftClipping;
@@ -59,8 +59,8 @@ const sortFeature = (features, sortedBy) => {
59
59
  featuresInCenterLine.sort((a, b) => {
60
60
  const aMismatch = baseMap.get(a.id());
61
61
  const bMismatch = baseMap.get(b.id());
62
- const acode = bMismatch && bMismatch.base.toUpperCase();
63
- const bcode = aMismatch && aMismatch.base.toUpperCase();
62
+ const acode = bMismatch === null || bMismatch === void 0 ? void 0 : bMismatch.base.toUpperCase();
63
+ const bcode = aMismatch === null || aMismatch === void 0 ? void 0 : aMismatch.base.toUpperCase();
64
64
  if (acode === bcode && acode === '*') {
65
65
  // @ts-expect-error
66
66
  return aMismatch.length - bMismatch.length;
@@ -1,18 +1,14 @@
1
- export interface SkipMap {
2
- [key: string]: {
3
- score: number;
4
- feature: unknown;
5
- start: number;
6
- end: number;
7
- strand: number;
8
- xs: string;
9
- };
10
- }
1
+ export type SkipMap = Record<string, {
2
+ score: number;
3
+ feature: unknown;
4
+ start: number;
5
+ end: number;
6
+ strand: number;
7
+ xs: string;
8
+ }>;
11
9
  export interface BinType {
12
10
  total?: number;
13
- strands?: {
14
- [key: string]: number;
15
- };
11
+ strands?: Record<string, number>;
16
12
  }
17
13
  export interface Bin {
18
14
  refbase?: string;
@@ -61,8 +61,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
61
61
  // Use two pass rendering, which helps in visualizing the SNPs at higher
62
62
  // bpPerPx First pass: draw the gray background
63
63
  ctx.fillStyle = colorForBase.total;
64
- for (let i = 0; i < coverage.length; i++) {
65
- const feature = coverage[i];
64
+ for (const feature of coverage) {
66
65
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
67
66
  const w = rightPx - leftPx + fudgeFactor;
68
67
  const score = feature.get('score');
@@ -80,8 +79,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
80
79
  // Second pass: draw the SNP data, and add a minimum feature width of 1px
81
80
  // which can be wider than the actual bpPerPx This reduces overdrawing of
82
81
  // the grey background over the SNPs
83
- for (let i = 0; i < coverage.length; i++) {
84
- const feature = coverage[i];
82
+ for (const feature of coverage) {
85
83
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
86
84
  const score = feature.get('score');
87
85
  const snpinfo = feature.get('snpinfo');
@@ -89,8 +87,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
89
87
  const totalScore = snpinfo.total;
90
88
  const keys = Object.keys(snpinfo.cov).sort();
91
89
  let curr = 0;
92
- for (let i = 0; i < keys.length; i++) {
93
- const base = keys[i];
90
+ for (const base of keys) {
94
91
  const { total } = snpinfo.cov[base];
95
92
  ctx.fillStyle =
96
93
  colorForBase[base] ||
@@ -105,8 +102,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
105
102
  const indicatorHeight = 4.5;
106
103
  if (drawInterbaseCounts) {
107
104
  let curr = 0;
108
- for (let i = 0; i < interbaseEvents.length; i++) {
109
- const base = interbaseEvents[i];
105
+ for (const base of interbaseEvents) {
110
106
  const { total } = snpinfo.noncov[base];
111
107
  const r = 0.6;
112
108
  ctx.fillStyle = colorForBase[base];
@@ -118,8 +114,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
118
114
  let accum = 0;
119
115
  let max = 0;
120
116
  let maxBase = '';
121
- for (let i = 0; i < interbaseEvents.length; i++) {
122
- const base = interbaseEvents[i];
117
+ for (const base of interbaseEvents) {
123
118
  const { total } = snpinfo.noncov[base];
124
119
  accum += total;
125
120
  if (total > max) {
@@ -144,8 +139,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
144
139
  prevTotal = totalScore;
145
140
  }
146
141
  if (drawArcs) {
147
- for (let i = 0; i < skips.length; i++) {
148
- const f = skips[i];
142
+ for (const f of skips) {
149
143
  const [left, right] = (0, util_1.bpSpanPx)(f.get('start'), f.get('end'), region, bpPerPx);
150
144
  ctx.beginPath();
151
145
  const str = f.get('strand');
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { LinearReadCloudDisplayModel } from '../LinearReadCloudDisplay/model';
3
3
  import { LinearReadArcsDisplayModel } from '../LinearReadArcsDisplay/model';
4
- declare const _default: ({ model, children, }: {
4
+ declare const BaseDisplayComponent: ({ model, children, }: {
5
5
  model: LinearReadArcsDisplayModel | LinearReadCloudDisplayModel;
6
6
  children?: React.ReactNode;
7
7
  }) => React.JSX.Element | null;
8
- export default _default;
8
+ export default BaseDisplayComponent;
@@ -25,7 +25,7 @@ const useStyles = (0, mui_1.makeStyles)()(theme => {
25
25
  },
26
26
  };
27
27
  });
28
- exports.default = (0, mobx_react_1.observer)(function ({ model, children, }) {
28
+ const BaseDisplayComponent = (0, mobx_react_1.observer)(function ({ model, children, }) {
29
29
  const { error, regionTooLarge } = model;
30
30
  return error ? (react_1.default.createElement(plugin_linear_genome_view_1.BlockMsg, { message: `${error}`, severity: "error", buttonText: "Reload", action: model.reload })) : regionTooLarge ? (model.regionCannotBeRendered()) : (react_1.default.createElement(DataDisplay, { model: model }, children));
31
31
  });
@@ -46,3 +46,4 @@ const LoadingBar = (0, mobx_react_1.observer)(function ({ model, }) {
46
46
  return (react_1.default.createElement("div", { className: classes.loading },
47
47
  react_1.default.createElement(ui_1.LoadingEllipses, { message: message })));
48
48
  });
49
+ exports.default = BaseDisplayComponent;
@@ -1,19 +1,10 @@
1
1
  import React from 'react';
2
- interface FilterBy {
3
- flagExclude: number;
4
- flagInclude: number;
5
- readName?: string;
6
- tagFilter?: {
7
- tag: string;
8
- value: string;
9
- };
10
- }
11
- declare function FilterByTagDlg(props: {
2
+ import { IFilter } from '.';
3
+ declare const FilterByTagDialog: (props: {
12
4
  model: {
13
- filterBy: FilterBy;
14
- setFilterBy: (arg: FilterBy) => void;
5
+ filterBy: IFilter;
6
+ setFilterBy: (arg: IFilter) => void;
15
7
  };
16
8
  handleClose: () => void;
17
- }): React.JSX.Element;
18
- declare const _default: typeof FilterByTagDlg;
19
- export default _default;
9
+ }) => React.JSX.Element;
10
+ export default FilterByTagDialog;
@@ -70,7 +70,7 @@ function Bitmask(props) {
70
70
  react_1.default.createElement("label", { htmlFor: key }, name)));
71
71
  })));
72
72
  }
73
- function FilterByTagDlg(props) {
73
+ const FilterByTagDialog = (0, mobx_react_1.observer)(function (props) {
74
74
  var _a, _b;
75
75
  const { model, handleClose } = props;
76
76
  const { classes } = useStyles();
@@ -99,9 +99,7 @@ function FilterByTagDlg(props) {
99
99
  react_1.default.createElement(Bitmask, { flag: flagExclude, setFlag: setFlagExclude })))),
100
100
  react_1.default.createElement(material_1.Paper, { className: classes.paper, variant: "outlined" },
101
101
  react_1.default.createElement(material_1.Typography, null, "Filter by tag name and value. Use * in the value field to get all reads containing any value for that tag. Example: filter tag name SA with value * to get all split/supplementary reads. Other examples include HP for haplotype, or RG for read group"),
102
- react_1.default.createElement(material_1.TextField, { className: classes.field, value: tag, onChange: event => setTag(event.target.value), placeholder: "Enter tag name", inputProps: {
103
- maxLength: 2,
104
- }, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '' }),
102
+ react_1.default.createElement(material_1.TextField, { className: classes.field, value: tag, onChange: event => setTag(event.target.value), placeholder: "Enter tag name", inputProps: { maxLength: 2 }, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '' }),
105
103
  react_1.default.createElement(material_1.TextField, { className: classes.field, value: tagValue, onChange: event => setTagValue(event.target.value), placeholder: "Enter tag value" })),
106
104
  react_1.default.createElement(material_1.Paper, { className: classes.paper, variant: "outlined" },
107
105
  react_1.default.createElement(material_1.Typography, null, "Filter by read name"),
@@ -122,5 +120,5 @@ function FilterByTagDlg(props) {
122
120
  handleClose();
123
121
  } }, "Submit"),
124
122
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => handleClose() }, "Cancel")))));
125
- }
126
- exports.default = (0, mobx_react_1.observer)(FilterByTagDlg);
123
+ });
124
+ exports.default = FilterByTagDialog;
@@ -4,6 +4,7 @@ exports.fetchChains = void 0;
4
4
  const util_1 = require("@jbrowse/core/util");
5
5
  const mobx_state_tree_1 = require("mobx-state-tree");
6
6
  async function fetchChains(self) {
7
+ // @ts-expect-error
7
8
  const { rpcSessionId: sessionId } = (0, util_1.getContainingTrack)(self);
8
9
  const { rpcManager } = (0, util_1.getSession)(self);
9
10
  const view = (0, util_1.getContainingView)(self);
@@ -33,4 +33,13 @@ export declare const FilterModel: import("mobx-state-tree").IModelType<{
33
33
  value: import("mobx-state-tree").ISimpleType<string>;
34
34
  }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
35
35
  }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
36
+ export interface IFilter {
37
+ flagExclude: number;
38
+ flagInclude: number;
39
+ readName?: string;
40
+ tagFilter?: {
41
+ tag: string;
42
+ value: string;
43
+ };
44
+ }
36
45
  export {};
package/dist/util.d.ts CHANGED
@@ -5,15 +5,9 @@ import { IAutorunOptions } from 'mobx';
5
5
  export declare function getTag(feature: Feature, tag: string): any;
6
6
  export declare function getTagAlt(feature: Feature, tag: string, alt: string): any;
7
7
  export declare const orientationTypes: {
8
- fr: {
9
- [key: string]: string;
10
- };
11
- rf: {
12
- [key: string]: string;
13
- };
14
- ff: {
15
- [key: string]: string;
16
- };
8
+ fr: Record<string, string>;
9
+ rf: Record<string, string>;
10
+ ff: Record<string, string>;
17
11
  };
18
12
  export declare const pairMap: {
19
13
  readonly LR: "color_pair_lr";
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { IAnyStateTreeNode } from 'mobx-state-tree';
3
- declare const _default: (props: {
3
+ declare const AlignmentsFeatureDetails: (props: {
4
4
  model: IAnyStateTreeNode;
5
5
  }) => React.JSX.Element;
6
- export default _default;
6
+ export default AlignmentsFeatureDetails;
@@ -92,7 +92,7 @@ function PairLink({ locString, model, }) {
92
92
  navToLoc(locString, model);
93
93
  }, href: "#" }, locString));
94
94
  }
95
- export default observer(function AlignmentFeatureDetails(props) {
95
+ const AlignmentsFeatureDetails = observer(function (props) {
96
96
  const { model } = props;
97
97
  const feat = clone(model.featureData);
98
98
  const SA = getTag('SA', feat);
@@ -103,3 +103,4 @@ export default observer(function AlignmentFeatureDetails(props) {
103
103
  SA ? React.createElement(SupplementaryAlignments, { model: model, tag: SA }) : null,
104
104
  feat.flags !== undefined ? (React.createElement(AlignmentFlags, { feature: feat, ...props })) : null));
105
105
  });
106
+ export default AlignmentsFeatureDetails;
@@ -1,8 +1,6 @@
1
1
  import { IAnyStateTreeNode } from 'mobx-state-tree';
2
2
  export declare function getTag(tag: string, feat: {
3
- tags?: {
4
- [key: string]: unknown;
5
- };
3
+ tags?: Record<string, unknown>;
6
4
  [key: string]: unknown;
7
5
  }): unknown;
8
6
  export declare function navToLoc(locString: string, model: IAnyStateTreeNode): Promise<void>;
@@ -2,6 +2,7 @@ import { BamFile } from '@gmod/bam';
2
2
  import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
3
3
  import { Region } from '@jbrowse/core/util/types';
4
4
  import { Feature } from '@jbrowse/core/util';
5
+ import { IFilter } from '../shared';
5
6
  interface Header {
6
7
  idToName: string[];
7
8
  nameToId: Record<string, number>;
@@ -29,15 +30,7 @@ export default class BamAdapter extends BaseFeatureDataAdapter {
29
30
  getFeatures(region: Region & {
30
31
  originalRefName?: string;
31
32
  }, opts?: BaseOptions & {
32
- filterBy: {
33
- flagInclude: number;
34
- flagExclude: number;
35
- tagFilter: {
36
- tag: string;
37
- value: unknown;
38
- };
39
- readName: string;
40
- };
33
+ filterBy: IFilter;
41
34
  }): import("rxjs").Observable<Feature>;
42
35
  getMultiRegionFeatureDensityStats(regions: Region[], opts?: BaseOptions): Promise<import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats | {
43
36
  bytes: number;
@@ -2,20 +2,12 @@ import { IndexedCramFile, CramRecord } from '@gmod/cram';
2
2
  import { BaseFeatureDataAdapter, BaseOptions, BaseSequenceAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
3
3
  import { Region, Feature } from '@jbrowse/core/util';
4
4
  import CramSlightlyLazyFeature from './CramSlightlyLazyFeature';
5
+ import { IFilter } from '../shared';
5
6
  interface Header {
6
7
  idToName?: string[];
7
8
  nameToId?: Record<string, number>;
8
9
  readGroups?: (string | undefined)[];
9
10
  }
10
- interface FilterBy {
11
- flagInclude: number;
12
- flagExclude: number;
13
- tagFilter: {
14
- tag: string;
15
- value: unknown;
16
- };
17
- readName: string;
18
- }
19
11
  export default class CramAdapter extends BaseFeatureDataAdapter {
20
12
  samHeader: Header;
21
13
  private setupP?;
@@ -30,7 +22,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
30
22
  cram: IndexedCramFile;
31
23
  sequenceAdapter: BaseSequenceAdapter;
32
24
  }>;
33
- getHeader(opts?: BaseOptions): Promise<string | undefined>;
25
+ getHeader(_opts?: BaseOptions): Promise<string | undefined>;
34
26
  private seqFetch;
35
27
  private setupPre;
36
28
  private setup;
@@ -41,7 +33,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
41
33
  getFeatures(region: Region & {
42
34
  originalRefName?: string;
43
35
  }, opts?: BaseOptions & {
44
- filterBy: FilterBy;
36
+ filterBy: IFilter;
45
37
  }): import("rxjs").Observable<Feature>;
46
38
  freeResources(): void;
47
39
  cramRecordToFeature(record: CramRecord): CramSlightlyLazyFeature;
@@ -5,6 +5,7 @@ import { openLocation } from '@jbrowse/core/util/io';
5
5
  import { ObservableCreate } from '@jbrowse/core/util/rxjs';
6
6
  import { toArray } from 'rxjs/operators';
7
7
  import { firstValueFrom } from 'rxjs';
8
+ // locals
8
9
  import CramSlightlyLazyFeature from './CramSlightlyLazyFeature';
9
10
  export default class CramAdapter extends BaseFeatureDataAdapter {
10
11
  constructor() {
@@ -49,7 +50,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
49
50
  }
50
51
  return this.configureP;
51
52
  }
52
- async getHeader(opts) {
53
+ async getHeader(_opts) {
53
54
  const { cram } = await this.configure();
54
55
  return cram.cram.getHeaderText();
55
56
  }
@@ -8,9 +8,7 @@ export function readFeaturesToMismatches(readFeatures, start, qual) {
8
8
  let refPos = 0;
9
9
  let sublen = 0;
10
10
  let lastPos = start;
11
- for (let i = 0; i < readFeatures.length; i++) {
12
- const f = readFeatures[i];
13
- const { code, pos, data, sub, ref } = f;
11
+ for (const { refPos: p, code, pos, data, sub, ref } of readFeatures) {
14
12
  sublen = refPos - lastPos;
15
13
  lastPos = refPos;
16
14
  if (sublen && insLen > 0) {
@@ -22,7 +20,7 @@ export function readFeaturesToMismatches(readFeatures, start, qual) {
22
20
  };
23
21
  insLen = 0;
24
22
  }
25
- refPos = f.refPos - 1 - start;
23
+ refPos = p - 1 - start;
26
24
  if (code === 'X') {
27
25
  // substitution
28
26
  mismatches[j++] = {
@@ -130,8 +128,7 @@ export function readFeaturesToCIGAR(readFeatures, alignmentStart, readLen, refRe
130
128
  let sublen = 0;
131
129
  let insLen = 0;
132
130
  if (readFeatures !== undefined) {
133
- for (let i = 0; i < readFeatures.length; i++) {
134
- const { code, refPos, sub, data } = readFeatures[i];
131
+ for (const { code, refPos, sub, data } of readFeatures) {
135
132
  sublen = refPos - lastPos;
136
133
  seq += ref.slice(lastPos - refStart, refPos - refStart);
137
134
  lastPos = refPos;