@jbrowse/plugin-alignments 2.18.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +1 -2
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +20 -13
  3. package/dist/AlignmentsFeatureDetail/Flags.d.ts +1 -2
  4. package/dist/AlignmentsFeatureDetail/Flags.js +6 -8
  5. package/dist/AlignmentsFeatureDetail/Formatter.d.ts +1 -2
  6. package/dist/AlignmentsFeatureDetail/Formatter.js +11 -36
  7. package/dist/AlignmentsFeatureDetail/LaunchPairedEndBreakpointSplitViewPanel.d.ts +1 -2
  8. package/dist/AlignmentsFeatureDetail/LaunchPairedEndBreakpointSplitViewPanel.js +44 -47
  9. package/dist/AlignmentsFeatureDetail/LaunchSupplementaryAlignmentBreakpointSplitViewPanel.d.ts +1 -2
  10. package/dist/AlignmentsFeatureDetail/LaunchSupplementaryAlignmentBreakpointSplitViewPanel.js +27 -31
  11. package/dist/AlignmentsFeatureDetail/LinkedPairedAlignments.d.ts +1 -2
  12. package/dist/AlignmentsFeatureDetail/LinkedPairedAlignments.js +2 -2
  13. package/dist/AlignmentsFeatureDetail/PairLink.d.ts +1 -2
  14. package/dist/AlignmentsFeatureDetail/PairLink.js +3 -6
  15. package/dist/AlignmentsFeatureDetail/SupplementaryAlignments.d.ts +1 -2
  16. package/dist/AlignmentsFeatureDetail/SupplementaryAlignments.js +2 -4
  17. package/dist/AlignmentsFeatureDetail/SupplementaryAlignmentsLocStrings.d.ts +1 -2
  18. package/dist/AlignmentsFeatureDetail/SupplementaryAlignmentsLocStrings.js +21 -27
  19. package/dist/AlignmentsFeatureDetail/index.js +17 -7
  20. package/dist/BamAdapter/index.js +17 -7
  21. package/dist/CramAdapter/CramAdapter.js +7 -2
  22. package/dist/CramAdapter/CramTestAdapters.d.ts +1 -1
  23. package/dist/CramAdapter/CramTestAdapters.js +2 -1
  24. package/dist/CramAdapter/index.js +17 -7
  25. package/dist/GuessAlignmentsTypes/index.js +19 -34
  26. package/dist/HtsgetBamAdapter/index.js +17 -7
  27. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +1 -2
  28. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +8 -16
  29. package/dist/LinearAlignmentsDisplay/model.d.ts +1 -2
  30. package/dist/LinearAlignmentsDisplay/model.js +5 -7
  31. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +21 -7
  32. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +40 -15
  33. package/dist/LinearPileupDisplay/components/ColorByTagDialog.d.ts +1 -2
  34. package/dist/LinearPileupDisplay/components/ColorByTagDialog.js +10 -39
  35. package/dist/LinearPileupDisplay/components/GroupByDialog.d.ts +1 -2
  36. package/dist/LinearPileupDisplay/components/GroupByDialog.js +82 -121
  37. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +1 -2
  38. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +2 -6
  39. package/dist/LinearPileupDisplay/components/SetFeatureHeightDialog.d.ts +1 -2
  40. package/dist/LinearPileupDisplay/components/SetFeatureHeightDialog.js +13 -42
  41. package/dist/LinearPileupDisplay/components/SetMaxHeightDialog.d.ts +1 -2
  42. package/dist/LinearPileupDisplay/components/SetMaxHeightDialog.js +10 -38
  43. package/dist/LinearPileupDisplay/components/SortByTagDialog.d.ts +1 -2
  44. package/dist/LinearPileupDisplay/components/SortByTagDialog.js +15 -44
  45. package/dist/LinearPileupDisplay/model.d.ts +21 -7
  46. package/dist/LinearPileupDisplay/model.js +19 -8
  47. package/dist/LinearReadArcsDisplay/components/ReactComponent.d.ts +1 -2
  48. package/dist/LinearReadArcsDisplay/components/ReactComponent.js +4 -27
  49. package/dist/LinearReadArcsDisplay/index.js +17 -7
  50. package/dist/LinearReadArcsDisplay/model.d.ts +1 -1
  51. package/dist/LinearReadArcsDisplay/model.js +17 -7
  52. package/dist/LinearReadCloudDisplay/components/ReactComponent.d.ts +1 -2
  53. package/dist/LinearReadCloudDisplay/components/ReactComponent.js +4 -27
  54. package/dist/LinearReadCloudDisplay/index.js +17 -7
  55. package/dist/LinearReadCloudDisplay/model.d.ts +1 -1
  56. package/dist/LinearReadCloudDisplay/model.js +17 -7
  57. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -2
  58. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +15 -54
  59. package/dist/LinearSNPCoverageDisplay/model.d.ts +4 -4
  60. package/dist/LinearSNPCoverageDisplay/model.js +49 -35
  61. package/dist/MismatchParser/cigarToMismatches.d.ts +1 -2
  62. package/dist/MismatchParser/index.d.ts +1 -2
  63. package/dist/MismatchParser/mdToMismatches.d.ts +1 -2
  64. package/dist/PileupRenderer/PileupRenderer.d.ts +4 -4
  65. package/dist/PileupRenderer/PileupRenderer.js +17 -7
  66. package/dist/PileupRenderer/components/PileupRendering.d.ts +1 -2
  67. package/dist/PileupRenderer/components/PileupRendering.js +15 -40
  68. package/dist/PileupRenderer/configSchema.d.ts +5 -0
  69. package/dist/PileupRenderer/configSchema.js +5 -0
  70. package/dist/PileupRenderer/makeImageData.js +2 -0
  71. package/dist/PileupRenderer/renderMismatches.d.ts +2 -1
  72. package/dist/PileupRenderer/renderMismatches.js +18 -13
  73. package/dist/SNPCoverageAdapter/index.js +17 -7
  74. package/dist/SNPCoverageAdapter/processModifications.js +1 -1
  75. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +1 -18
  76. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +35 -264
  77. package/dist/SNPCoverageRenderer/configSchema.d.ts +3 -3
  78. package/dist/SNPCoverageRenderer/configSchema.js +3 -3
  79. package/dist/SNPCoverageRenderer/makeImage.d.ts +2 -0
  80. package/dist/SNPCoverageRenderer/makeImage.js +270 -0
  81. package/dist/SNPCoverageRenderer/types.d.ts +19 -0
  82. package/dist/SNPCoverageRenderer/types.js +2 -0
  83. package/dist/index.js +17 -7
  84. package/dist/shared/components/BaseDisplayComponent.d.ts +1 -2
  85. package/dist/shared/components/BaseDisplayComponent.js +6 -13
  86. package/dist/shared/components/FilterByTagDialog.d.ts +1 -2
  87. package/dist/shared/components/FilterByTagDialog.js +42 -92
  88. package/dist/shared/renderSvgUtil.d.ts +1 -2
  89. package/dist/shared/renderSvgUtil.js +20 -17
  90. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +1 -2
  91. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +3 -6
  92. package/esm/AlignmentsFeatureDetail/Flags.d.ts +1 -2
  93. package/esm/AlignmentsFeatureDetail/Flags.js +6 -8
  94. package/esm/AlignmentsFeatureDetail/Formatter.d.ts +1 -2
  95. package/esm/AlignmentsFeatureDetail/Formatter.js +11 -13
  96. package/esm/AlignmentsFeatureDetail/LaunchPairedEndBreakpointSplitViewPanel.d.ts +1 -2
  97. package/esm/AlignmentsFeatureDetail/LaunchPairedEndBreakpointSplitViewPanel.js +27 -40
  98. package/esm/AlignmentsFeatureDetail/LaunchSupplementaryAlignmentBreakpointSplitViewPanel.d.ts +1 -2
  99. package/esm/AlignmentsFeatureDetail/LaunchSupplementaryAlignmentBreakpointSplitViewPanel.js +10 -24
  100. package/esm/AlignmentsFeatureDetail/LinkedPairedAlignments.d.ts +1 -2
  101. package/esm/AlignmentsFeatureDetail/LinkedPairedAlignments.js +2 -2
  102. package/esm/AlignmentsFeatureDetail/PairLink.d.ts +1 -2
  103. package/esm/AlignmentsFeatureDetail/PairLink.js +3 -3
  104. package/esm/AlignmentsFeatureDetail/SupplementaryAlignments.d.ts +1 -2
  105. package/esm/AlignmentsFeatureDetail/SupplementaryAlignments.js +2 -4
  106. package/esm/AlignmentsFeatureDetail/SupplementaryAlignmentsLocStrings.d.ts +1 -2
  107. package/esm/AlignmentsFeatureDetail/SupplementaryAlignmentsLocStrings.js +21 -24
  108. package/esm/CramAdapter/CramAdapter.js +7 -2
  109. package/esm/CramAdapter/CramTestAdapters.d.ts +1 -1
  110. package/esm/CramAdapter/CramTestAdapters.js +2 -1
  111. package/esm/GuessAlignmentsTypes/index.js +19 -34
  112. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +1 -2
  113. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +8 -13
  114. package/esm/LinearAlignmentsDisplay/model.d.ts +1 -2
  115. package/esm/LinearAlignmentsDisplay/model.js +5 -7
  116. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +21 -7
  117. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +23 -8
  118. package/esm/LinearPileupDisplay/components/ColorByTagDialog.d.ts +1 -2
  119. package/esm/LinearPileupDisplay/components/ColorByTagDialog.js +10 -16
  120. package/esm/LinearPileupDisplay/components/GroupByDialog.d.ts +1 -2
  121. package/esm/LinearPileupDisplay/components/GroupByDialog.js +82 -98
  122. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +1 -2
  123. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +2 -3
  124. package/esm/LinearPileupDisplay/components/SetFeatureHeightDialog.d.ts +1 -2
  125. package/esm/LinearPileupDisplay/components/SetFeatureHeightDialog.js +13 -19
  126. package/esm/LinearPileupDisplay/components/SetMaxHeightDialog.d.ts +1 -2
  127. package/esm/LinearPileupDisplay/components/SetMaxHeightDialog.js +10 -15
  128. package/esm/LinearPileupDisplay/components/SortByTagDialog.d.ts +1 -2
  129. package/esm/LinearPileupDisplay/components/SortByTagDialog.js +15 -21
  130. package/esm/LinearPileupDisplay/model.d.ts +21 -7
  131. package/esm/LinearPileupDisplay/model.js +2 -1
  132. package/esm/LinearReadArcsDisplay/components/ReactComponent.d.ts +1 -2
  133. package/esm/LinearReadArcsDisplay/components/ReactComponent.js +4 -4
  134. package/esm/LinearReadArcsDisplay/model.d.ts +1 -1
  135. package/esm/LinearReadCloudDisplay/components/ReactComponent.d.ts +1 -2
  136. package/esm/LinearReadCloudDisplay/components/ReactComponent.js +4 -4
  137. package/esm/LinearReadCloudDisplay/model.d.ts +1 -1
  138. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -2
  139. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +15 -51
  140. package/esm/LinearSNPCoverageDisplay/model.d.ts +4 -4
  141. package/esm/LinearSNPCoverageDisplay/model.js +32 -28
  142. package/esm/MismatchParser/cigarToMismatches.d.ts +1 -2
  143. package/esm/MismatchParser/index.d.ts +1 -2
  144. package/esm/MismatchParser/mdToMismatches.d.ts +1 -2
  145. package/esm/PileupRenderer/PileupRenderer.d.ts +4 -4
  146. package/esm/PileupRenderer/components/PileupRendering.d.ts +1 -2
  147. package/esm/PileupRenderer/components/PileupRendering.js +15 -17
  148. package/esm/PileupRenderer/configSchema.d.ts +5 -0
  149. package/esm/PileupRenderer/configSchema.js +5 -0
  150. package/esm/PileupRenderer/makeImageData.js +2 -0
  151. package/esm/PileupRenderer/renderMismatches.d.ts +2 -1
  152. package/esm/PileupRenderer/renderMismatches.js +18 -13
  153. package/esm/SNPCoverageAdapter/processModifications.js +1 -1
  154. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +1 -18
  155. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +3 -265
  156. package/esm/SNPCoverageRenderer/configSchema.d.ts +3 -3
  157. package/esm/SNPCoverageRenderer/configSchema.js +3 -3
  158. package/esm/SNPCoverageRenderer/makeImage.d.ts +2 -0
  159. package/esm/SNPCoverageRenderer/makeImage.js +267 -0
  160. package/esm/SNPCoverageRenderer/types.d.ts +19 -0
  161. package/esm/SNPCoverageRenderer/types.js +1 -0
  162. package/esm/shared/components/BaseDisplayComponent.d.ts +1 -2
  163. package/esm/shared/components/BaseDisplayComponent.js +6 -10
  164. package/esm/shared/components/FilterByTagDialog.d.ts +1 -2
  165. package/esm/shared/components/FilterByTagDialog.js +42 -69
  166. package/esm/shared/renderSvgUtil.d.ts +1 -2
  167. package/esm/shared/renderSvgUtil.js +3 -7
  168. package/package.json +13 -13
@@ -0,0 +1,267 @@
1
+ import { readConfObject } from '@jbrowse/core/configuration';
2
+ import { createJBrowseTheme } from '@jbrowse/core/ui';
3
+ import { bpSpanPx, featureSpanPx } from '@jbrowse/core/util';
4
+ import { checkStopToken } from '@jbrowse/core/util/stopToken';
5
+ import { YSCALEBAR_LABEL_OFFSET, getOrigin, getScale, } from '@jbrowse/plugin-wiggle';
6
+ import { alphaColor } from '../shared/util';
7
+ const INTERBASE_INDICATOR_WIDTH = 7;
8
+ const INTERBASE_INDICATOR_HEIGHT = 4.5;
9
+ const MINIMUM_INTERBASE_INDICATOR_READ_DEPTH = 7;
10
+ const complementBase = {
11
+ C: 'G',
12
+ G: 'C',
13
+ A: 'T',
14
+ T: 'A',
15
+ };
16
+ const fudgeFactor = 0.6;
17
+ export async function makeImage(ctx, props) {
18
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
19
+ const { features, regions, bpPerPx, colorBy, displayCrossHatches, visibleModifications = {}, scaleOpts, height: unadjustedHeight, theme: configTheme, config: cfg, ticks, stopToken, } = props;
20
+ const theme = createJBrowseTheme(configTheme);
21
+ const region = regions[0];
22
+ const width = (region.end - region.start) / bpPerPx;
23
+ const offset = YSCALEBAR_LABEL_OFFSET;
24
+ const height = unadjustedHeight - offset * 2;
25
+ const opts = { ...scaleOpts, range: [0, height] };
26
+ const viewScale = getScale(opts);
27
+ const indicatorViewScale = getScale({
28
+ ...opts,
29
+ range: [0, height / 2],
30
+ scaleType: 'linear',
31
+ });
32
+ const originY = getOrigin(scaleOpts.scaleType);
33
+ const originLinear = getOrigin('linear');
34
+ const indicatorThreshold = readConfObject(cfg, 'indicatorThreshold');
35
+ const showInterbaseCounts = readConfObject(cfg, 'showInterbaseCounts');
36
+ const showArcs = readConfObject(cfg, 'showArcs');
37
+ const showInterbaseIndicators = readConfObject(cfg, 'showInterbaseIndicators');
38
+ const toY = (n) => height - (viewScale(n) || 0) + offset;
39
+ const toHeight = (n) => toY(originY) - toY(n);
40
+ const toY2 = (n) => height - (indicatorViewScale(n) || 0) + offset;
41
+ const toHeight2 = (n) => toY2(originLinear) - toY2(n);
42
+ const { bases } = theme.palette;
43
+ const colorForBase = {
44
+ A: bases.A.main,
45
+ C: bases.C.main,
46
+ G: bases.G.main,
47
+ T: bases.T.main,
48
+ insertion: 'purple',
49
+ softclip: 'blue',
50
+ hardclip: 'red',
51
+ total: readConfObject(cfg, 'color'),
52
+ mod_NONE: 'blue',
53
+ cpg_meth: 'red',
54
+ cpg_unmeth: 'blue',
55
+ };
56
+ const feats = [...features.values()];
57
+ ctx.fillStyle = colorForBase.total;
58
+ let start = performance.now();
59
+ for (const feature of feats) {
60
+ if (feature.get('type') === 'skip') {
61
+ continue;
62
+ }
63
+ const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
64
+ const w = rightPx - leftPx + fudgeFactor;
65
+ const score = feature.get('score');
66
+ ctx.fillRect(leftPx, toY(score), w, toHeight(score));
67
+ if (performance.now() - start > 400) {
68
+ checkStopToken(stopToken);
69
+ start = performance.now();
70
+ }
71
+ }
72
+ let prevTotal = 0;
73
+ const extraHorizontallyFlippedOffset = region.reversed ? 1 / bpPerPx : 0;
74
+ const drawingModifications = colorBy.type === 'modifications';
75
+ const drawingMethylation = colorBy.type === 'methylation';
76
+ const isolatedModification = (_a = colorBy.modifications) === null || _a === void 0 ? void 0 : _a.isolatedModification;
77
+ start = performance.now();
78
+ for (const feature of feats) {
79
+ const now = performance.now();
80
+ if (now - start > 400) {
81
+ checkStopToken(stopToken);
82
+ }
83
+ if (feature.get('type') === 'skip') {
84
+ continue;
85
+ }
86
+ const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
87
+ const snpinfo = feature.get('snpinfo');
88
+ const w = Math.max(rightPx - leftPx, 1);
89
+ const score0 = feature.get('score');
90
+ if (drawingModifications) {
91
+ let curr = 0;
92
+ const refbase = (_b = snpinfo.refbase) === null || _b === void 0 ? void 0 : _b.toUpperCase();
93
+ const { nonmods, mods, snps, ref } = snpinfo;
94
+ for (const m of Object.keys(nonmods).sort().reverse()) {
95
+ const mod = visibleModifications[m.replace('nonmod_', '')] ||
96
+ visibleModifications[m.replace('mod_', '')];
97
+ if (!mod) {
98
+ console.warn(`${m} not known yet`);
99
+ continue;
100
+ }
101
+ if (isolatedModification && mod.type !== isolatedModification) {
102
+ continue;
103
+ }
104
+ const cmp = complementBase[mod.base];
105
+ const detectable = mod.base === 'N'
106
+ ? score0
107
+ : (((_c = snps[mod.base]) === null || _c === void 0 ? void 0 : _c.entryDepth) || 0) +
108
+ (((_d = snps[cmp]) === null || _d === void 0 ? void 0 : _d.entryDepth) || 0) +
109
+ (refbase === mod.base ? ref['1'] : 0) +
110
+ (refbase === cmp ? ref['-1'] : 0);
111
+ const modifiable = mod.base === 'N'
112
+ ? score0
113
+ : (((_e = snps[mod.base]) === null || _e === void 0 ? void 0 : _e.entryDepth) || 0) +
114
+ (((_f = snps[cmp]) === null || _f === void 0 ? void 0 : _f.entryDepth) || 0) +
115
+ (refbase === mod.base ? ref.entryDepth : 0) +
116
+ (refbase === cmp ? ref.entryDepth : 0);
117
+ const { entryDepth, avgProbability = 0 } = snpinfo.nonmods[m];
118
+ const modFraction = (modifiable / score0) * (entryDepth / detectable);
119
+ const nonModColor = 'blue';
120
+ const c = alphaColor(nonModColor, avgProbability);
121
+ const height = toHeight(score0);
122
+ const bottom = toY(score0) + height;
123
+ ctx.fillStyle = c;
124
+ ctx.fillRect(Math.round(leftPx), bottom - (curr + modFraction * height), w, modFraction * height);
125
+ curr += modFraction * height;
126
+ }
127
+ for (const m of Object.keys(mods).sort().reverse()) {
128
+ const mod = visibleModifications[m.replace('mod_', '')];
129
+ if (!mod) {
130
+ console.warn(`${m} not known yet`);
131
+ continue;
132
+ }
133
+ if (isolatedModification && mod.type !== isolatedModification) {
134
+ continue;
135
+ }
136
+ const cmp = complementBase[mod.base];
137
+ const detectable = mod.base === 'N'
138
+ ? score0
139
+ : (((_g = snps[mod.base]) === null || _g === void 0 ? void 0 : _g.entryDepth) || 0) +
140
+ (((_h = snps[cmp]) === null || _h === void 0 ? void 0 : _h.entryDepth) || 0) +
141
+ (refbase === mod.base ? ref['1'] : 0) +
142
+ (refbase === cmp ? ref['-1'] : 0);
143
+ const modifiable = mod.base === 'N'
144
+ ? score0
145
+ : (((_j = snps[mod.base]) === null || _j === void 0 ? void 0 : _j.entryDepth) || 0) +
146
+ (((_k = snps[cmp]) === null || _k === void 0 ? void 0 : _k.entryDepth) || 0) +
147
+ (refbase === mod.base ? ref.entryDepth : 0) +
148
+ (refbase === cmp ? ref.entryDepth : 0);
149
+ const { entryDepth, avgProbability = 0 } = mods[m];
150
+ const modFraction = (modifiable / score0) * (entryDepth / detectable);
151
+ const baseColor = mod.color || 'black';
152
+ const c = alphaColor(baseColor, avgProbability);
153
+ const height = toHeight(score0);
154
+ const bottom = toY(score0) + height;
155
+ ctx.fillStyle = c;
156
+ ctx.fillRect(Math.round(leftPx), bottom - (curr + modFraction * height), w, modFraction * height);
157
+ curr += modFraction * height;
158
+ }
159
+ }
160
+ else if (drawingMethylation) {
161
+ const { depth, nonmods, mods } = snpinfo;
162
+ let curr = 0;
163
+ for (const base of Object.keys(mods).sort().reverse()) {
164
+ const { entryDepth } = mods[base];
165
+ const height = toHeight(score0);
166
+ const bottom = toY(score0) + height;
167
+ ctx.fillStyle = colorForBase[base] || 'black';
168
+ ctx.fillRect(Math.round(leftPx), bottom - ((entryDepth + curr) / depth) * height, w, (entryDepth / depth) * height);
169
+ curr += entryDepth;
170
+ }
171
+ for (const base of Object.keys(nonmods).sort().reverse()) {
172
+ const { entryDepth } = nonmods[base];
173
+ const height = toHeight(score0);
174
+ const bottom = toY(score0) + height;
175
+ ctx.fillStyle = colorForBase[base] || 'black';
176
+ ctx.fillRect(Math.round(leftPx), bottom - ((entryDepth + curr) / depth) * height, w, (entryDepth / depth) * height);
177
+ curr += entryDepth;
178
+ }
179
+ }
180
+ else {
181
+ const { depth, snps } = snpinfo;
182
+ let curr = 0;
183
+ for (const base of Object.keys(snps).sort().reverse()) {
184
+ const { entryDepth } = snps[base];
185
+ const height = toHeight(score0);
186
+ const bottom = toY(score0) + height;
187
+ ctx.fillStyle = colorForBase[base] || 'black';
188
+ ctx.fillRect(Math.round(leftPx), bottom - ((entryDepth + curr) / depth) * height, w, (entryDepth / depth) * height);
189
+ curr += entryDepth;
190
+ }
191
+ }
192
+ const interbaseEvents = Object.keys(snpinfo.noncov);
193
+ if (showInterbaseCounts) {
194
+ let curr = 0;
195
+ for (const base of interbaseEvents) {
196
+ const { entryDepth } = snpinfo.noncov[base];
197
+ const r = 0.6;
198
+ ctx.fillStyle = colorForBase[base];
199
+ ctx.fillRect(leftPx - r + extraHorizontallyFlippedOffset, INTERBASE_INDICATOR_HEIGHT + toHeight2(curr), r * 2, toHeight2(entryDepth));
200
+ curr += entryDepth;
201
+ }
202
+ }
203
+ if (showInterbaseIndicators) {
204
+ let accum = 0;
205
+ let max = 0;
206
+ let maxBase = '';
207
+ for (const base of interbaseEvents) {
208
+ const { entryDepth } = snpinfo.noncov[base];
209
+ accum += entryDepth;
210
+ if (entryDepth > max) {
211
+ max = entryDepth;
212
+ maxBase = base;
213
+ }
214
+ }
215
+ const indicatorComparatorScore = Math.max(score0, prevTotal);
216
+ if (accum > indicatorComparatorScore * indicatorThreshold &&
217
+ indicatorComparatorScore > MINIMUM_INTERBASE_INDICATOR_READ_DEPTH) {
218
+ ctx.fillStyle = colorForBase[maxBase];
219
+ ctx.beginPath();
220
+ const l = leftPx + extraHorizontallyFlippedOffset;
221
+ ctx.moveTo(l - INTERBASE_INDICATOR_WIDTH / 2, 0);
222
+ ctx.lineTo(l + INTERBASE_INDICATOR_WIDTH / 2, 0);
223
+ ctx.lineTo(l, INTERBASE_INDICATOR_HEIGHT);
224
+ ctx.fill();
225
+ }
226
+ }
227
+ prevTotal = score0;
228
+ }
229
+ if (showArcs) {
230
+ for (const f of feats) {
231
+ if (f.get('type') !== 'skip') {
232
+ continue;
233
+ }
234
+ const s = f.get('start');
235
+ const e = f.get('end');
236
+ const [left, right] = bpSpanPx(s, e, region, bpPerPx);
237
+ ctx.beginPath();
238
+ const effectiveStrand = f.get('effectiveStrand');
239
+ const pos = 'rgba(255,200,200,0.7)';
240
+ const neg = 'rgba(200,200,255,0.7)';
241
+ const neutral = 'rgba(200,200,200,0.7)';
242
+ if (effectiveStrand === 1) {
243
+ ctx.strokeStyle = pos;
244
+ }
245
+ else if (effectiveStrand === -1) {
246
+ ctx.strokeStyle = neg;
247
+ }
248
+ else {
249
+ ctx.strokeStyle = neutral;
250
+ }
251
+ ctx.lineWidth = Math.log(f.get('score') + 1);
252
+ ctx.moveTo(left, height - offset * 2);
253
+ ctx.bezierCurveTo(left, 0, right, 0, right, height - offset * 2);
254
+ ctx.stroke();
255
+ }
256
+ }
257
+ if (displayCrossHatches) {
258
+ ctx.lineWidth = 1;
259
+ ctx.strokeStyle = 'rgba(140,140,140,0.8)';
260
+ for (const tick of ticks.values) {
261
+ ctx.beginPath();
262
+ ctx.moveTo(0, Math.round(toY(tick)));
263
+ ctx.lineTo(width, Math.round(toY(tick)));
264
+ ctx.stroke();
265
+ }
266
+ }
267
+ }
@@ -0,0 +1,19 @@
1
+ import type { ColorBy, ModificationTypeWithColor } from '../shared/types';
2
+ import type { RenderArgsDeserialized as FeatureRenderArgsDeserialized } from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType';
3
+ import type { Feature } from '@jbrowse/core/util';
4
+ import type { ScaleOpts } from '@jbrowse/plugin-wiggle';
5
+ export interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {
6
+ bpPerPx: number;
7
+ height: number;
8
+ highResolutionScaling: number;
9
+ scaleOpts: ScaleOpts;
10
+ }
11
+ export interface RenderArgsDeserializedWithFeatures extends RenderArgsDeserialized {
12
+ features: Map<string, Feature>;
13
+ ticks: {
14
+ values: number[];
15
+ };
16
+ displayCrossHatches: boolean;
17
+ visibleModifications?: Record<string, ModificationTypeWithColor>;
18
+ colorBy: ColorBy;
19
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,8 +1,7 @@
1
- import React from 'react';
2
1
  import type { LinearReadArcsDisplayModel } from '../../LinearReadArcsDisplay/model';
3
2
  import type { LinearReadCloudDisplayModel } from '../../LinearReadCloudDisplay/model';
4
3
  declare const BaseDisplayComponent: ({ model, children, }: {
5
4
  model: LinearReadArcsDisplayModel | LinearReadCloudDisplayModel;
6
5
  children?: React.ReactNode;
7
- }) => React.JSX.Element | null;
6
+ }) => import("react/jsx-runtime").JSX.Element | null;
8
7
  export default BaseDisplayComponent;
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { LoadingEllipses } from '@jbrowse/core/ui';
3
3
  import { getContainingView } from '@jbrowse/core/util';
4
4
  import { BlockMsg } from '@jbrowse/plugin-linear-genome-view';
@@ -20,27 +20,23 @@ const useStyles = makeStyles()(theme => ({
20
20
  }));
21
21
  const BlockError = observer(function ({ model, }) {
22
22
  const { error } = model;
23
- return (React.createElement(BlockMsg, { message: `${error}`, severity: "error", action: React.createElement(Tooltip, { title: "Reload" },
24
- React.createElement(Button, { "data-testid": "reload_button", onClick: () => {
23
+ return (_jsx(BlockMsg, { message: `${error}`, severity: "error", action: _jsx(Tooltip, { title: "Reload", children: _jsx(Button, { "data-testid": "reload_button", onClick: () => {
25
24
  model.reload();
26
- } }, "Reload")) }));
25
+ }, children: "Reload" }) }) }));
27
26
  });
28
27
  const BaseDisplayComponent = observer(function ({ model, children, }) {
29
28
  const { error, regionTooLarge } = model;
30
- return error ? (React.createElement(BlockError, { model: model })) : regionTooLarge ? (model.regionCannotBeRendered()) : (React.createElement(DataDisplay, { model: model }, children));
29
+ return error ? (_jsx(BlockError, { model: model })) : regionTooLarge ? (model.regionCannotBeRendered()) : (_jsx(DataDisplay, { model: model, children: children }));
31
30
  });
32
31
  const DataDisplay = observer(function ({ model, children, }) {
33
32
  const { drawn, loading } = model;
34
33
  const view = getContainingView(model);
35
34
  const left = (model.lastDrawnOffsetPx || 0) - view.offsetPx;
36
- return (React.createElement("div", { "data-testid": `drawn-${drawn}` },
37
- React.createElement("div", { style: { position: 'absolute', left } }, children),
38
- left !== 0 || loading ? React.createElement(LoadingBar, { model: model }) : null));
35
+ return (_jsxs("div", { "data-testid": `drawn-${drawn}`, children: [_jsx("div", { style: { position: 'absolute', left }, children: children }), left !== 0 || loading ? _jsx(LoadingBar, { model: model }) : null] }));
39
36
  });
40
37
  const LoadingBar = observer(function ({ model, }) {
41
38
  const { classes } = useStyles();
42
39
  const { message } = model;
43
- return (React.createElement("div", { className: classes.loading },
44
- React.createElement(LoadingEllipses, { message: message })));
40
+ return (_jsx("div", { className: classes.loading, children: _jsx(LoadingEllipses, { message: message }) }));
45
41
  });
46
42
  export default BaseDisplayComponent;
@@ -1,4 +1,3 @@
1
- import React from 'react';
2
1
  import type { FilterBy } from '../types';
3
2
  declare const FilterByTagDialog: (props: {
4
3
  model: {
@@ -6,5 +5,5 @@ declare const FilterByTagDialog: (props: {
6
5
  setFilterBy: (arg: FilterBy) => void;
7
6
  };
8
7
  handleClose: () => void;
9
- }) => React.JSX.Element;
8
+ }) => import("react/jsx-runtime").JSX.Element;
10
9
  export default FilterByTagDialog;
@@ -1,4 +1,5 @@
1
- import React, { useState } from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
2
3
  import { Dialog } from '@jbrowse/core/ui';
3
4
  import { Button, DialogActions, DialogContent, Link, Paper, TextField, Typography, } from '@mui/material';
4
5
  import { observer } from 'mobx-react';
@@ -28,24 +29,20 @@ const flagNames = [
28
29
  ];
29
30
  function Bitmask(props) {
30
31
  const { flag = 0, setFlag } = props;
31
- return (React.createElement(React.Fragment, null,
32
- React.createElement(TextField, { type: "number", value: flag, onChange: event => {
33
- setFlag(+event.target.value);
34
- } }),
35
- flagNames.map((name, index) => {
36
- const val = flag & (1 << index);
37
- const key = `${name}_${val}`;
38
- return (React.createElement("div", { key: key },
39
- React.createElement("input", { type: "checkbox", checked: Boolean(val), onChange: event => {
40
- if (event.target.checked) {
41
- setFlag(flag | (1 << index));
42
- }
43
- else {
44
- setFlag(flag & ~(1 << index));
45
- }
46
- } }),
47
- React.createElement("label", { htmlFor: key }, name)));
48
- })));
32
+ return (_jsxs(_Fragment, { children: [_jsx(TextField, { type: "number", value: flag, onChange: event => {
33
+ setFlag(+event.target.value);
34
+ } }), flagNames.map((name, index) => {
35
+ const val = flag & (1 << index);
36
+ const key = `${name}_${val}`;
37
+ return (_jsxs("div", { children: [_jsx("input", { type: "checkbox", checked: Boolean(val), onChange: event => {
38
+ if (event.target.checked) {
39
+ setFlag(flag | (1 << index));
40
+ }
41
+ else {
42
+ setFlag(flag & ~(1 << index));
43
+ }
44
+ } }), _jsx("label", { htmlFor: key, children: name })] }, key));
45
+ })] }));
49
46
  }
50
47
  const FilterByTagDialog = observer(function (props) {
51
48
  var _a, _b;
@@ -59,55 +56,31 @@ const FilterByTagDialog = observer(function (props) {
59
56
  const [readName, setReadName] = useState(filterBy.readName || '');
60
57
  const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag);
61
58
  const site = 'https://broadinstitute.github.io/picard/explain-flags.html';
62
- return (React.createElement(Dialog, { open: true, onClose: handleClose, title: "Filter options" },
63
- React.createElement(DialogContent, null,
64
- React.createElement(Typography, null,
65
- "Set filter bitmask options. Refer to ",
66
- React.createElement(Link, { href: site }, site),
67
- ' ',
68
- "for details"),
69
- React.createElement(Paper, { className: classes.paper, variant: "outlined" },
70
- React.createElement("div", { style: { display: 'flex' } },
71
- React.createElement("div", null,
72
- React.createElement(Typography, null, "Read must have ALL these flags"),
73
- React.createElement(Bitmask, { flag: flagInclude, setFlag: setFlagInclude })),
74
- React.createElement("div", null,
75
- React.createElement(Typography, null, "Read must have NONE of these flags"),
76
- React.createElement(Bitmask, { flag: flagExclude, setFlag: setFlagExclude })))),
77
- React.createElement(Paper, { className: classes.paper, variant: "outlined" },
78
- React.createElement(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"),
79
- React.createElement(TextField, { className: classes.field, value: tag, onChange: event => {
80
- setTag(event.target.value);
81
- }, placeholder: "Enter tag name", error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '', slotProps: {
82
- htmlInput: {
83
- maxLength: 2,
84
- },
85
- } }),
86
- React.createElement(TextField, { className: classes.field, value: tagValue, onChange: event => {
87
- setTagValue(event.target.value);
88
- }, placeholder: "Enter tag value" })),
89
- React.createElement(Paper, { className: classes.paper, variant: "outlined" },
90
- React.createElement(Typography, null, "Filter by read name"),
91
- React.createElement(TextField, { className: classes.field, value: readName, onChange: event => {
92
- setReadName(event.target.value);
93
- }, placeholder: "Enter read name" })),
94
- React.createElement(DialogActions, null,
95
- React.createElement(Button, { variant: "contained", color: "primary", autoFocus: true, type: "submit", onClick: () => {
96
- model.setFilterBy({
97
- flagInclude,
98
- flagExclude,
99
- readName,
100
- tagFilter: tag !== ''
101
- ? {
102
- tag,
103
- value: tagValue,
104
- }
105
- : undefined,
106
- });
107
- handleClose();
108
- } }, "Submit"),
109
- React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
110
- handleClose();
111
- } }, "Cancel")))));
59
+ return (_jsx(Dialog, { open: true, onClose: handleClose, title: "Filter options", children: _jsxs(DialogContent, { children: [_jsxs(Typography, { children: ["Set filter bitmask options. Refer to ", _jsx(Link, { href: site, children: site }), ' ', "for details"] }), _jsx(Paper, { className: classes.paper, variant: "outlined", children: _jsxs("div", { style: { display: 'flex' }, children: [_jsxs("div", { children: [_jsx(Typography, { children: "Read must have ALL these flags" }), _jsx(Bitmask, { flag: flagInclude, setFlag: setFlagInclude })] }), _jsxs("div", { children: [_jsx(Typography, { children: "Read must have NONE of these flags" }), _jsx(Bitmask, { flag: flagExclude, setFlag: setFlagExclude })] })] }) }), _jsxs(Paper, { className: classes.paper, variant: "outlined", children: [_jsx(Typography, { children: "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" }), _jsx(TextField, { className: classes.field, value: tag, onChange: event => {
60
+ setTag(event.target.value);
61
+ }, placeholder: "Enter tag name", error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '', slotProps: {
62
+ htmlInput: {
63
+ maxLength: 2,
64
+ },
65
+ } }), _jsx(TextField, { className: classes.field, value: tagValue, onChange: event => {
66
+ setTagValue(event.target.value);
67
+ }, placeholder: "Enter tag value" })] }), _jsxs(Paper, { className: classes.paper, variant: "outlined", children: [_jsx(Typography, { children: "Filter by read name" }), _jsx(TextField, { className: classes.field, value: readName, onChange: event => {
68
+ setReadName(event.target.value);
69
+ }, placeholder: "Enter read name" })] }), _jsxs(DialogActions, { children: [_jsx(Button, { variant: "contained", color: "primary", autoFocus: true, type: "submit", onClick: () => {
70
+ model.setFilterBy({
71
+ flagInclude,
72
+ flagExclude,
73
+ readName,
74
+ tagFilter: tag !== ''
75
+ ? {
76
+ tag,
77
+ value: tagValue,
78
+ }
79
+ : undefined,
80
+ });
81
+ handleClose();
82
+ }, children: "Submit" }), _jsx(Button, { variant: "contained", color: "secondary", onClick: () => {
83
+ handleClose();
84
+ }, children: "Cancel" })] })] }) }));
112
85
  });
113
86
  export default FilterByTagDialog;
@@ -1,7 +1,6 @@
1
- import React from 'react';
2
1
  export declare function renderSvg<T extends {
3
2
  id: string;
4
3
  height: number;
5
4
  }>(self: T, opts: {
6
5
  rasterizeLayers?: boolean;
7
- }, cb: (model: T, ctx: CanvasRenderingContext2D, width: number, height: number) => void): Promise<React.JSX.Element | undefined>;
6
+ }, cb: (model: T, ctx: CanvasRenderingContext2D, width: number, height: number) => void): Promise<import("react/jsx-runtime").JSX.Element | undefined>;
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { getContainingView } from '@jbrowse/core/util';
3
3
  function getId(id) {
4
4
  const isJest = typeof jest === 'undefined';
@@ -18,17 +18,13 @@ export async function renderSvg(self, opts, cb) {
18
18
  }
19
19
  ctx.scale(2, 2);
20
20
  cb(self, ctx, width, height);
21
- return (React.createElement("image", { width: width, height: height, xlinkHref: canvas.toDataURL('image/png') }));
21
+ return (_jsx("image", { width: width, height: height, xlinkHref: canvas.toDataURL('image/png') }));
22
22
  }
23
23
  else {
24
24
  const C2S = await import('canvas2svg');
25
25
  const ctx = new C2S.default(width, height);
26
26
  cb(self, ctx, width, height);
27
27
  const clipid = getId(self.id);
28
- return (React.createElement(React.Fragment, null,
29
- React.createElement("defs", null,
30
- React.createElement("clipPath", { id: clipid },
31
- React.createElement("rect", { x: 0, y: 0, width: width, height: height }))),
32
- React.createElement("g", { dangerouslySetInnerHTML: { __html: ctx.getSvg().innerHTML }, clipPath: `url(#${clipid})` })));
28
+ return (_jsxs(_Fragment, { children: [_jsx("defs", { children: _jsx("clipPath", { id: clipid, children: _jsx("rect", { x: 0, y: 0, width: width, height: height }) }) }), _jsx("g", { dangerouslySetInnerHTML: { __html: ctx.getSvg().innerHTML }, clipPath: `url(#${clipid})` })] }));
33
29
  }
34
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-alignments",
3
- "version": "2.18.0",
3
+ "version": "3.0.1",
4
4
  "description": "JBrowse 2 alignments adapters, tracks, etc.",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -36,32 +36,32 @@
36
36
  "clean": "rimraf dist esm *.tsbuildinfo"
37
37
  },
38
38
  "dependencies": {
39
- "@gmod/bam": "^4.0.1",
40
- "@gmod/cram": "^3.0.3",
41
- "@jbrowse/sv-core": "^2.18.0",
39
+ "@gmod/bam": "^5.0.0",
40
+ "@gmod/cram": "^4.0.1",
41
+ "@jbrowse/core": "^3.0.1",
42
+ "@jbrowse/plugin-linear-genome-view": "^3.0.1",
43
+ "@jbrowse/plugin-wiggle": "^3.0.1",
44
+ "@jbrowse/sv-core": "^3.0.1",
42
45
  "@mui/icons-material": "^6.0.0",
46
+ "@mui/material": "^6.0.0",
43
47
  "canvas2svg": "^1.0.16",
44
48
  "copy-to-clipboard": "^3.3.1",
45
49
  "fast-deep-equal": "^3.1.3",
46
- "generic-filehandle": "^3.0.0"
47
- },
48
- "peerDependencies": {
49
- "@jbrowse/core": "^2.0.0",
50
- "@jbrowse/plugin-linear-genome-view": "^2.0.0",
51
- "@jbrowse/plugin-wiggle": "^2.0.0",
52
- "@mui/material": "^6.0.0",
50
+ "generic-filehandle2": "^1.0.0",
53
51
  "mobx": "^6.0.0",
54
52
  "mobx-react": "^9.0.0",
55
53
  "mobx-state-tree": "^5.0.0",
56
- "react": ">=16.8.0",
57
54
  "rxjs": "^7.0.0",
58
55
  "tss-react": "^4.0.0"
59
56
  },
57
+ "peerDependencies": {
58
+ "react": ">=18.0.0"
59
+ },
60
60
  "publishConfig": {
61
61
  "access": "public"
62
62
  },
63
63
  "distModule": "esm/index.js",
64
64
  "srcModule": "src/index.ts",
65
65
  "module": "esm/index.js",
66
- "gitHead": "c344ea60099cb7e460b77f15808946b24a7eee74"
66
+ "gitHead": "aa2f1d1a89d2361c7fd1a93fe29506fa4554f5cc"
67
67
  }