@jbrowse/plugin-alignments 2.16.1 → 2.17.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 (215) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +1 -2
  2. package/dist/AlignmentsFeatureDetail/getSAFeatures.js +2 -2
  3. package/dist/AlignmentsFeatureDetail/stateModelFactory.d.ts +1 -1
  4. package/dist/BamAdapter/BamAdapter.d.ts +3 -2
  5. package/dist/BamAdapter/BamAdapter.js +34 -11
  6. package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +3 -17
  7. package/dist/BamAdapter/BamSlightlyLazyFeature.js +42 -72
  8. package/dist/CramAdapter/CramAdapter.d.ts +4 -3
  9. package/dist/CramAdapter/CramAdapter.js +24 -7
  10. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +21 -27
  11. package/dist/CramAdapter/CramSlightlyLazyFeature.js +74 -73
  12. package/dist/CramAdapter/util.d.ts +1 -10
  13. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +1 -1
  14. package/dist/LinearAlignmentsDisplay/index.js +2 -2
  15. package/dist/LinearAlignmentsDisplay/{models/model.d.ts → model.d.ts} +6 -3
  16. package/dist/LinearAlignmentsDisplay/{models/model.js → model.js} +11 -7
  17. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +6 -27
  18. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +43 -21
  19. package/dist/LinearPileupDisplay/components/ColorByTagDialog.d.ts +5 -4
  20. package/dist/LinearPileupDisplay/components/ColorByTagDialog.js +3 -1
  21. package/dist/LinearPileupDisplay/components/GroupByDialog.js +8 -6
  22. package/dist/LinearPileupDisplay/components/SortByTagDialog.js +6 -4
  23. package/dist/LinearPileupDisplay/model.d.ts +40 -40
  24. package/dist/LinearPileupDisplay/model.js +118 -41
  25. package/dist/LinearReadArcsDisplay/components/ReactComponent.js +1 -1
  26. package/dist/LinearReadArcsDisplay/model.d.ts +22 -21
  27. package/dist/LinearReadArcsDisplay/model.js +13 -14
  28. package/dist/LinearReadCloudDisplay/components/ReactComponent.js +1 -1
  29. package/dist/LinearReadCloudDisplay/model.d.ts +14 -22
  30. package/dist/LinearReadCloudDisplay/model.js +12 -13
  31. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +49 -19
  32. package/dist/LinearSNPCoverageDisplay/index.js +3 -2
  33. package/dist/LinearSNPCoverageDisplay/{models/model.d.ts → model.d.ts} +3 -13
  34. package/dist/LinearSNPCoverageDisplay/{models/model.js → model.js} +71 -45
  35. package/dist/MismatchParser/cigarToMismatches.d.ts +3 -0
  36. package/dist/MismatchParser/cigarToMismatches.js +94 -0
  37. package/dist/MismatchParser/getNextRefPos.d.ts +4 -0
  38. package/dist/MismatchParser/getNextRefPos.js +40 -0
  39. package/dist/MismatchParser/index.d.ts +4 -29
  40. package/dist/MismatchParser/index.js +10 -327
  41. package/dist/MismatchParser/mdToMismatches.d.ts +3 -0
  42. package/dist/MismatchParser/mdToMismatches.js +80 -0
  43. package/dist/ModificationParser/index.d.ts +19 -0
  44. package/dist/ModificationParser/index.js +144 -0
  45. package/dist/PileupRPC/methods/GetGlobalValueForTag.js +1 -2
  46. package/dist/PileupRPC/methods/GetReducedFeatures.d.ts +1 -1
  47. package/dist/PileupRPC/methods/GetReducedFeatures.js +19 -16
  48. package/dist/PileupRPC/methods/GetVisibleModifications.d.ts +2 -1
  49. package/dist/PileupRPC/methods/GetVisibleModifications.js +9 -6
  50. package/dist/PileupRenderer/PileupLayoutSession.d.ts +8 -7
  51. package/dist/PileupRenderer/PileupRenderer.d.ts +6 -14
  52. package/dist/PileupRenderer/PileupRenderer.js +7 -5
  53. package/dist/PileupRenderer/renderAlignment.js +17 -4
  54. package/dist/PileupRenderer/renderAlignmentShape.js +102 -21
  55. package/dist/PileupRenderer/renderMethylation.d.ts +2 -1
  56. package/dist/PileupRenderer/renderMethylation.js +17 -9
  57. package/dist/PileupRenderer/renderMismatches.js +19 -19
  58. package/dist/PileupRenderer/renderModifications.d.ts +3 -2
  59. package/dist/PileupRenderer/renderModifications.js +31 -34
  60. package/dist/PileupRenderer/renderPerBaseLettering.d.ts +2 -1
  61. package/dist/PileupRenderer/renderPerBaseLettering.js +1 -3
  62. package/dist/PileupRenderer/renderPerBaseQuality.d.ts +2 -1
  63. package/dist/PileupRenderer/renderPerBaseQuality.js +1 -3
  64. package/dist/PileupRenderer/renderSoftClipping.js +6 -6
  65. package/dist/PileupRenderer/sortUtil.d.ts +2 -7
  66. package/dist/PileupRenderer/sortUtil.js +13 -13
  67. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +10 -5
  68. package/dist/SNPCoverageAdapter/generateCoverageBins.d.ts +13 -9
  69. package/dist/SNPCoverageAdapter/generateCoverageBins.js +269 -166
  70. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -1
  71. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +171 -54
  72. package/dist/shared/color.d.ts +0 -10
  73. package/dist/shared/color.js +1 -7
  74. package/{esm/shared → dist/shared/components}/BaseDisplayComponent.d.ts +2 -2
  75. package/{esm/shared → dist/shared/components}/FilterByTagDialog.d.ts +3 -3
  76. package/dist/shared/{FilterByTagDialog.js → components/FilterByTagDialog.js} +5 -1
  77. package/dist/shared/fetchChains.js +1 -2
  78. package/dist/shared/getMaximumModificationAtEachPosition.d.ts +8 -0
  79. package/dist/shared/getMaximumModificationAtEachPosition.js +42 -0
  80. package/dist/shared/getUniqueModifications.d.ts +14 -0
  81. package/dist/shared/getUniqueModifications.js +16 -0
  82. package/dist/shared/getUniqueTags.d.ts +15 -0
  83. package/dist/shared/getUniqueTags.js +18 -0
  84. package/dist/shared/types.d.ts +94 -0
  85. package/dist/shared/util.d.ts +8 -0
  86. package/dist/shared/util.js +26 -0
  87. package/dist/util.d.ts +6 -3
  88. package/dist/util.js +24 -29
  89. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +1 -2
  90. package/esm/AlignmentsFeatureDetail/getSAFeatures.js +2 -2
  91. package/esm/AlignmentsFeatureDetail/stateModelFactory.d.ts +1 -1
  92. package/esm/BamAdapter/BamAdapter.d.ts +3 -2
  93. package/esm/BamAdapter/BamAdapter.js +31 -8
  94. package/esm/BamAdapter/BamSlightlyLazyFeature.d.ts +3 -17
  95. package/esm/BamAdapter/BamSlightlyLazyFeature.js +43 -73
  96. package/esm/CramAdapter/CramAdapter.d.ts +4 -3
  97. package/esm/CramAdapter/CramAdapter.js +22 -5
  98. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +21 -27
  99. package/esm/CramAdapter/CramSlightlyLazyFeature.js +74 -73
  100. package/esm/CramAdapter/util.d.ts +1 -10
  101. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +1 -1
  102. package/esm/LinearAlignmentsDisplay/index.js +2 -2
  103. package/esm/LinearAlignmentsDisplay/{models/model.d.ts → model.d.ts} +6 -3
  104. package/esm/LinearAlignmentsDisplay/{models/model.js → model.js} +11 -7
  105. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +6 -27
  106. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +45 -23
  107. package/esm/LinearPileupDisplay/components/ColorByTagDialog.d.ts +5 -4
  108. package/esm/LinearPileupDisplay/components/ColorByTagDialog.js +3 -1
  109. package/esm/LinearPileupDisplay/components/GroupByDialog.js +8 -6
  110. package/esm/LinearPileupDisplay/components/SortByTagDialog.js +6 -4
  111. package/esm/LinearPileupDisplay/model.d.ts +40 -40
  112. package/esm/LinearPileupDisplay/model.js +119 -42
  113. package/esm/LinearReadArcsDisplay/components/ReactComponent.js +1 -1
  114. package/esm/LinearReadArcsDisplay/model.d.ts +22 -21
  115. package/esm/LinearReadArcsDisplay/model.js +14 -15
  116. package/esm/LinearReadCloudDisplay/components/ReactComponent.js +1 -1
  117. package/esm/LinearReadCloudDisplay/model.d.ts +14 -22
  118. package/esm/LinearReadCloudDisplay/model.js +13 -14
  119. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +49 -19
  120. package/esm/LinearSNPCoverageDisplay/index.js +3 -2
  121. package/esm/LinearSNPCoverageDisplay/{models/model.d.ts → model.d.ts} +3 -13
  122. package/esm/LinearSNPCoverageDisplay/{models/model.js → model.js} +72 -46
  123. package/esm/MismatchParser/cigarToMismatches.d.ts +3 -0
  124. package/esm/MismatchParser/cigarToMismatches.js +91 -0
  125. package/esm/MismatchParser/getNextRefPos.d.ts +4 -0
  126. package/esm/MismatchParser/getNextRefPos.js +37 -0
  127. package/esm/MismatchParser/index.d.ts +4 -29
  128. package/esm/MismatchParser/index.js +5 -317
  129. package/esm/MismatchParser/mdToMismatches.d.ts +3 -0
  130. package/esm/MismatchParser/mdToMismatches.js +77 -0
  131. package/esm/ModificationParser/index.d.ts +19 -0
  132. package/esm/ModificationParser/index.js +138 -0
  133. package/esm/PileupRPC/methods/GetGlobalValueForTag.js +1 -2
  134. package/esm/PileupRPC/methods/GetReducedFeatures.d.ts +1 -1
  135. package/esm/PileupRPC/methods/GetReducedFeatures.js +19 -16
  136. package/esm/PileupRPC/methods/GetVisibleModifications.d.ts +2 -1
  137. package/esm/PileupRPC/methods/GetVisibleModifications.js +9 -6
  138. package/esm/PileupRenderer/PileupLayoutSession.d.ts +8 -7
  139. package/esm/PileupRenderer/PileupRenderer.d.ts +6 -14
  140. package/esm/PileupRenderer/PileupRenderer.js +8 -6
  141. package/esm/PileupRenderer/renderAlignment.js +17 -4
  142. package/esm/PileupRenderer/renderAlignmentShape.js +102 -21
  143. package/esm/PileupRenderer/renderMethylation.d.ts +2 -1
  144. package/esm/PileupRenderer/renderMethylation.js +17 -9
  145. package/esm/PileupRenderer/renderMismatches.js +19 -19
  146. package/esm/PileupRenderer/renderModifications.d.ts +3 -2
  147. package/esm/PileupRenderer/renderModifications.js +30 -33
  148. package/esm/PileupRenderer/renderPerBaseLettering.d.ts +2 -1
  149. package/esm/PileupRenderer/renderPerBaseLettering.js +1 -3
  150. package/esm/PileupRenderer/renderPerBaseQuality.d.ts +2 -1
  151. package/esm/PileupRenderer/renderPerBaseQuality.js +1 -3
  152. package/esm/PileupRenderer/renderSoftClipping.js +6 -6
  153. package/esm/PileupRenderer/sortUtil.d.ts +2 -7
  154. package/esm/PileupRenderer/sortUtil.js +13 -13
  155. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +10 -5
  156. package/esm/SNPCoverageAdapter/generateCoverageBins.d.ts +13 -9
  157. package/esm/SNPCoverageAdapter/generateCoverageBins.js +269 -166
  158. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -1
  159. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +171 -54
  160. package/esm/shared/color.d.ts +0 -10
  161. package/esm/shared/color.js +0 -6
  162. package/{dist/shared → esm/shared/components}/BaseDisplayComponent.d.ts +2 -2
  163. package/{dist/shared → esm/shared/components}/FilterByTagDialog.d.ts +3 -3
  164. package/esm/shared/{FilterByTagDialog.js → components/FilterByTagDialog.js} +5 -1
  165. package/esm/shared/fetchChains.js +1 -2
  166. package/esm/shared/getMaximumModificationAtEachPosition.d.ts +8 -0
  167. package/esm/shared/getMaximumModificationAtEachPosition.js +39 -0
  168. package/esm/shared/getUniqueModifications.d.ts +14 -0
  169. package/esm/shared/getUniqueModifications.js +13 -0
  170. package/esm/shared/getUniqueTags.d.ts +15 -0
  171. package/esm/shared/getUniqueTags.js +15 -0
  172. package/esm/shared/types.d.ts +94 -0
  173. package/esm/shared/util.d.ts +8 -0
  174. package/esm/shared/util.js +23 -0
  175. package/esm/util.d.ts +6 -3
  176. package/esm/util.js +22 -26
  177. package/package.json +4 -4
  178. package/dist/LinearPileupDisplay/components/ColorByModificationsDialog.d.ts +0 -15
  179. package/dist/LinearPileupDisplay/components/ColorByModificationsDialog.js +0 -41
  180. package/dist/LinearPileupDisplay/components/ModificationsTable.d.ts +0 -4
  181. package/dist/LinearPileupDisplay/components/ModificationsTable.js +0 -28
  182. package/dist/SNPCoverageAdapter/util.d.ts +0 -25
  183. package/dist/shared/index.d.ts +0 -49
  184. package/dist/shared/index.js +0 -41
  185. package/esm/LinearPileupDisplay/components/ColorByModificationsDialog.d.ts +0 -15
  186. package/esm/LinearPileupDisplay/components/ColorByModificationsDialog.js +0 -36
  187. package/esm/LinearPileupDisplay/components/ModificationsTable.d.ts +0 -4
  188. package/esm/LinearPileupDisplay/components/ModificationsTable.js +0 -22
  189. package/esm/SNPCoverageAdapter/util.d.ts +0 -25
  190. package/esm/shared/index.d.ts +0 -49
  191. package/esm/shared/index.js +0 -36
  192. /package/dist/LinearAlignmentsDisplay/{models/alignmentsModel.d.ts → alignmentsModel.d.ts} +0 -0
  193. /package/dist/LinearAlignmentsDisplay/{models/alignmentsModel.js → alignmentsModel.js} +0 -0
  194. /package/dist/LinearAlignmentsDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
  195. /package/dist/LinearAlignmentsDisplay/{models/configSchema.js → configSchema.js} +0 -0
  196. /package/dist/LinearAlignmentsDisplay/{models/util.d.ts → util.d.ts} +0 -0
  197. /package/dist/LinearAlignmentsDisplay/{models/util.js → util.js} +0 -0
  198. /package/dist/LinearSNPCoverageDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
  199. /package/dist/LinearSNPCoverageDisplay/{models/configSchema.js → configSchema.js} +0 -0
  200. /package/dist/shared/{BaseDisplayComponent.js → components/BaseDisplayComponent.js} +0 -0
  201. /package/dist/shared/{renderSvg.d.ts → renderSvgUtil.d.ts} +0 -0
  202. /package/dist/shared/{renderSvg.js → renderSvgUtil.js} +0 -0
  203. /package/dist/{SNPCoverageAdapter/util.js → shared/types.js} +0 -0
  204. /package/esm/LinearAlignmentsDisplay/{models/alignmentsModel.d.ts → alignmentsModel.d.ts} +0 -0
  205. /package/esm/LinearAlignmentsDisplay/{models/alignmentsModel.js → alignmentsModel.js} +0 -0
  206. /package/esm/LinearAlignmentsDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
  207. /package/esm/LinearAlignmentsDisplay/{models/configSchema.js → configSchema.js} +0 -0
  208. /package/esm/LinearAlignmentsDisplay/{models/util.d.ts → util.d.ts} +0 -0
  209. /package/esm/LinearAlignmentsDisplay/{models/util.js → util.js} +0 -0
  210. /package/esm/LinearSNPCoverageDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
  211. /package/esm/LinearSNPCoverageDisplay/{models/configSchema.js → configSchema.js} +0 -0
  212. /package/esm/shared/{BaseDisplayComponent.js → components/BaseDisplayComponent.js} +0 -0
  213. /package/esm/shared/{renderSvg.d.ts → renderSvgUtil.d.ts} +0 -0
  214. /package/esm/shared/{renderSvg.js → renderSvgUtil.js} +0 -0
  215. /package/esm/{SNPCoverageAdapter/util.js → shared/types.js} +0 -0
@@ -8,7 +8,6 @@ const operators_1 = require("rxjs/operators");
8
8
  const rxjs_1 = require("rxjs");
9
9
  // locals
10
10
  const base_1 = __importDefault(require("../base"));
11
- const util_1 = require("../../util");
12
11
  class PileupGetGlobalValueForTag extends base_1.default {
13
12
  constructor() {
14
13
  super(...arguments);
@@ -21,7 +20,7 @@ class PileupGetGlobalValueForTag extends base_1.default {
21
20
  const featuresArray = await (0, rxjs_1.firstValueFrom)(features.pipe((0, operators_1.toArray)()));
22
21
  return [
23
22
  ...new Set(featuresArray
24
- .map(feature => (0, util_1.getTag)(feature, tag))
23
+ .map(feature => { var _a; return (_a = feature.get('tags')) === null || _a === void 0 ? void 0 : _a[tag]; })
25
24
  .filter(f => f !== undefined)
26
25
  .map(f => `${f}`)),
27
26
  ];
@@ -23,7 +23,7 @@ export default class PileupGetReducedFeatures extends PileupBaseRPC {
23
23
  pair_orientation: any;
24
24
  next_ref: any;
25
25
  next_pos: any;
26
- clipPos: any;
26
+ clipPos: number;
27
27
  SA: any;
28
28
  }[][];
29
29
  stats: {
@@ -10,7 +10,7 @@ const rxjs_1 = require("rxjs");
10
10
  // locals
11
11
  const util_2 = require("../util");
12
12
  const base_1 = __importDefault(require("../base"));
13
- const util_3 = require("../../util");
13
+ const MismatchParser_1 = require("../../MismatchParser");
14
14
  // specialized get features to return limited data about alignments
15
15
  class PileupGetReducedFeatures extends base_1.default {
16
16
  constructor() {
@@ -22,21 +22,24 @@ class PileupGetReducedFeatures extends base_1.default {
22
22
  const { adapterConfig, sessionId, regions } = des;
23
23
  const dataAdapter = (await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, adapterConfig)).dataAdapter;
24
24
  const featuresArray = await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeaturesInMultipleRegions(regions, des).pipe((0, operators_1.toArray)()));
25
- const reduced = (0, util_1.dedupe)(featuresArray.map(f => ({
26
- id: f.id(),
27
- refName: f.get('refName'),
28
- name: f.get('name'),
29
- start: f.get('start'),
30
- strand: f.get('strand'),
31
- end: f.get('end'),
32
- flags: f.get('flags'),
33
- tlen: f.get('template_length'),
34
- pair_orientation: f.get('pair_orientation'),
35
- next_ref: f.get('next_ref'),
36
- next_pos: f.get('next_pos'),
37
- clipPos: f.get('clipPos'),
38
- SA: (0, util_3.getTag)(f, 'SA'),
39
- })), f => f.id);
25
+ const reduced = (0, util_1.dedupe)(featuresArray.map(f => {
26
+ var _a;
27
+ return ({
28
+ id: f.id(),
29
+ refName: f.get('refName'),
30
+ name: f.get('name'),
31
+ start: f.get('start'),
32
+ strand: f.get('strand'),
33
+ end: f.get('end'),
34
+ flags: f.get('flags'),
35
+ tlen: f.get('template_length'),
36
+ pair_orientation: f.get('pair_orientation'),
37
+ next_ref: f.get('next_ref'),
38
+ next_pos: f.get('next_pos'),
39
+ clipPos: (0, MismatchParser_1.getClip)(f.get('CIGAR'), f.get('strand')),
40
+ SA: (_a = f.get('tags')) === null || _a === void 0 ? void 0 : _a.SA,
41
+ });
42
+ }), f => f.id);
40
43
  const filtered = (0, util_2.filterForPairs)(reduced);
41
44
  const stats = filtered.length ? (0, util_2.getInsertSizeStats)(filtered) : undefined;
42
45
  const chains = (0, util_1.groupBy)(reduced, f => f.name);
@@ -1,5 +1,6 @@
1
1
  import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals';
2
2
  import { Region } from '@jbrowse/core/util';
3
+ import { ModificationType } from '../../shared/types';
3
4
  import PileupBaseRPC from '../base';
4
5
  export default class PileupGetVisibleModifications extends PileupBaseRPC {
5
6
  name: string;
@@ -10,5 +11,5 @@ export default class PileupGetVisibleModifications extends PileupBaseRPC {
10
11
  regions: Region[];
11
12
  sessionId: string;
12
13
  tag: string;
13
- }, rpcDriver: string): Promise<string[]>;
14
+ }, rpcDriver: string): Promise<ModificationType[]>;
14
15
  }
@@ -6,10 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const dataAdapterCache_1 = require("@jbrowse/core/data_adapters/dataAdapterCache");
7
7
  const operators_1 = require("rxjs/operators");
8
8
  const rxjs_1 = require("rxjs");
9
- // locals
10
- const MismatchParser_1 = require("../../MismatchParser");
11
- const base_1 = __importDefault(require("../base"));
9
+ const ModificationParser_1 = require("../../ModificationParser");
12
10
  const util_1 = require("../../util");
11
+ const base_1 = __importDefault(require("../base"));
13
12
  class PileupGetVisibleModifications extends base_1.default {
14
13
  constructor() {
15
14
  super(...arguments);
@@ -19,11 +18,15 @@ class PileupGetVisibleModifications extends base_1.default {
19
18
  const { adapterConfig, sessionId, regions } = await this.deserializeArguments(args, rpcDriver);
20
19
  const dataAdapter = (await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, adapterConfig)).dataAdapter;
21
20
  const featuresArray = await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeaturesInMultipleRegions(regions).pipe((0, operators_1.toArray)()));
22
- const uniqueValues = new Set();
21
+ const uniqueModifications = new Map();
23
22
  featuresArray.forEach(f => {
24
- (0, MismatchParser_1.getModificationTypes)((0, util_1.getTagAlt)(f, 'MM', 'Mm') || '').forEach(t => uniqueValues.add(t));
23
+ for (const mod of (0, ModificationParser_1.getModTypes)((0, util_1.getTagAlt)(f, 'MM', 'Mm') || '')) {
24
+ if (!uniqueModifications.has(mod.type)) {
25
+ uniqueModifications.set(mod.type, mod);
26
+ }
27
+ }
25
28
  });
26
- return [...uniqueValues];
29
+ return [...uniqueModifications.values()];
27
30
  }
28
31
  }
29
32
  exports.default = PileupGetVisibleModifications;
@@ -3,26 +3,27 @@ import { AnyConfigurationModel } from '@jbrowse/core/configuration';
3
3
  import SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain';
4
4
  import GranularRectLayout from '@jbrowse/core/util/layouts/GranularRectLayout';
5
5
  import MultiLayout from '@jbrowse/core/util/layouts/MultiLayout';
6
+ import { FilterBy, SortedBy } from '../shared/types';
6
7
  export interface PileupLayoutSessionProps {
7
8
  config: AnyConfigurationModel;
8
9
  bpPerPx: number;
9
10
  filters: SerializableFilterChain;
10
- filterBy: unknown;
11
- sortedBy: unknown;
12
- showSoftClip: unknown;
11
+ filterBy: FilterBy;
12
+ sortedBy: SortedBy;
13
+ showSoftClip: boolean;
13
14
  }
14
15
  type MyMultiLayout = MultiLayout<GranularRectLayout<unknown>, unknown>;
15
16
  interface CachedPileupLayout {
16
17
  layout: MyMultiLayout;
17
18
  config: AnyConfigurationModel;
18
19
  filters?: SerializableFilterChain;
19
- filterBy: unknown;
20
- sortedBy: unknown;
20
+ filterBy?: FilterBy;
21
+ sortedBy?: SortedBy;
21
22
  showSoftClip: boolean;
22
23
  }
23
24
  export declare class PileupLayoutSession extends LayoutSession {
24
- sortedBy: unknown;
25
- filterBy: unknown;
25
+ sortedBy?: SortedBy;
26
+ filterBy?: FilterBy;
26
27
  showSoftClip: boolean;
27
28
  constructor(args: PileupLayoutSessionProps);
28
29
  cachedLayoutIsValid(cachedLayout: CachedPileupLayout): boolean;
@@ -2,20 +2,12 @@ import BoxRendererType, { RenderArgsDeserialized as BoxRenderArgsDeserialized }
2
2
  import { Feature, Region } from '@jbrowse/core/util';
3
3
  import { BaseLayout } from '@jbrowse/core/util/layouts/BaseLayout';
4
4
  import { PileupLayoutSession, PileupLayoutSessionProps } from './PileupLayoutSession';
5
+ import { ColorBy, ModificationTypeWithColor, SortedBy } from '../shared/types';
5
6
  export interface RenderArgsDeserialized extends BoxRenderArgsDeserialized {
6
- colorBy?: {
7
- type: string;
8
- tag?: string;
9
- };
7
+ colorBy?: ColorBy;
10
8
  colorTagMap?: Record<string, string>;
11
- modificationTagMap?: Record<string, string>;
12
- sortedBy?: {
13
- type: string;
14
- pos: number;
15
- refName: string;
16
- assemblyName: string;
17
- tag?: string;
18
- };
9
+ visibleModifications?: Record<string, ModificationTypeWithColor>;
10
+ sortedBy?: SortedBy;
19
11
  showSoftClip: boolean;
20
12
  highResolutionScaling: number;
21
13
  }
@@ -30,8 +22,8 @@ export default class PileupRenderer extends BoxRendererType {
30
22
  getExpandedRegion(region: Region, renderArgs: RenderArgsDeserialized): {
31
23
  start: number;
32
24
  end: number;
33
- refName: string;
34
25
  reversed?: boolean | undefined;
26
+ refName: string;
35
27
  assemblyName: string;
36
28
  };
37
29
  render(renderProps: RenderArgsDeserialized): Promise<{
@@ -63,4 +55,4 @@ export default class PileupRenderer extends BoxRendererType {
63
55
  }>;
64
56
  createSession(args: PileupLayoutSessionProps): PileupLayoutSession;
65
57
  }
66
- export { type RenderArgs, type RenderResults, type RenderArgsSerialized, type ResultsSerialized, type ResultsDeserialized, } from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType';
58
+ export type { RenderArgs, RenderResults, RenderArgsSerialized, ResultsSerialized, ResultsDeserialized, } from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType';
@@ -45,10 +45,13 @@ class PileupRenderer extends BoxRendererType_1.default {
45
45
  if (!sequenceAdapter) {
46
46
  return undefined;
47
47
  }
48
- const pm = this.pluginManager;
49
- const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(pm, sessionId, sequenceAdapter);
48
+ const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, sequenceAdapter);
50
49
  const region = regions[0];
51
- return (0, util_2.fetchSequence)(region, dataAdapter);
50
+ return (0, util_2.fetchSequence)({
51
+ ...region,
52
+ start: Math.max(0, region.start - 1),
53
+ end: region.end + 1,
54
+ }, dataAdapter);
52
55
  }
53
56
  getExpandedRegion(region, renderArgs) {
54
57
  const { config, showSoftClip } = renderArgs;
@@ -63,7 +66,6 @@ class PileupRenderer extends BoxRendererType_1.default {
63
66
  };
64
67
  }
65
68
  async render(renderProps) {
66
- var _a;
67
69
  const features = await this.getFeatures(renderProps);
68
70
  const layout = this.createLayoutInWorker(renderProps);
69
71
  const { regions, bpPerPx } = renderProps;
@@ -75,7 +77,7 @@ class PileupRenderer extends BoxRendererType_1.default {
75
77
  });
76
78
  // only need reference sequence if there are features and only for some
77
79
  // cases
78
- const regionSequence = features.size && (0, util_2.shouldFetchReferenceSequence)((_a = renderProps.colorBy) === null || _a === void 0 ? void 0 : _a.type)
80
+ const regionSequence = features.size
79
81
  ? await this.fetchSequence(renderProps)
80
82
  : undefined;
81
83
  const width = (region.end - region.start) / bpPerPx;
@@ -7,6 +7,7 @@ const renderPerBaseQuality_1 = require("./renderPerBaseQuality");
7
7
  const renderPerBaseLettering_1 = require("./renderPerBaseLettering");
8
8
  const renderModifications_1 = require("./renderModifications");
9
9
  const renderMethylation_1 = require("./renderMethylation");
10
+ const MismatchParser_1 = require("../MismatchParser");
10
11
  function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase, charWidth, charHeight, defaultColor, canvasWidth, }) {
11
12
  const { config, bpPerPx, regions, colorBy, colorTagMap = {} } = renderArgs;
12
13
  const { tag = '', type: colorType = '' } = colorBy || {};
@@ -24,16 +25,20 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
24
25
  // second pass for color types that render per-base things that go over the
25
26
  // existing drawing
26
27
  switch (colorType) {
27
- case 'perBaseQuality':
28
+ case 'perBaseQuality': {
29
+ const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
28
30
  (0, renderPerBaseQuality_1.renderPerBaseQuality)({
29
31
  ctx,
30
32
  feat,
31
33
  region,
32
34
  bpPerPx,
33
35
  canvasWidth,
36
+ cigarOps,
34
37
  });
35
38
  break;
36
- case 'perBaseLettering':
39
+ }
40
+ case 'perBaseLettering': {
41
+ const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
37
42
  (0, renderPerBaseLettering_1.renderPerBaseLettering)({
38
43
  ctx,
39
44
  feat,
@@ -44,9 +49,12 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
44
49
  charWidth,
45
50
  charHeight,
46
51
  canvasWidth,
52
+ cigarOps,
47
53
  });
48
54
  break;
49
- case 'modifications':
55
+ }
56
+ case 'modifications': {
57
+ const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
50
58
  (0, renderModifications_1.renderModifications)({
51
59
  ctx,
52
60
  feat,
@@ -54,9 +62,12 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
54
62
  bpPerPx,
55
63
  renderArgs,
56
64
  canvasWidth,
65
+ cigarOps,
57
66
  });
58
67
  break;
59
- case 'methylation':
68
+ }
69
+ case 'methylation': {
70
+ const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
60
71
  (0, renderMethylation_1.renderMethylation)({
61
72
  ctx,
62
73
  feat,
@@ -64,7 +75,9 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
64
75
  bpPerPx,
65
76
  renderArgs,
66
77
  canvasWidth,
78
+ cigarOps,
67
79
  });
68
80
  break;
81
+ }
69
82
  }
70
83
  }
@@ -2,38 +2,119 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderAlignmentShape = renderAlignmentShape;
4
4
  const util_1 = require("@jbrowse/core/util");
5
+ const MismatchParser_1 = require("../MismatchParser");
5
6
  function renderAlignmentShape({ ctx, feat, renderArgs, }) {
6
7
  const { regions, bpPerPx } = renderArgs;
7
8
  const { heightPx, topPx, feature } = feat;
8
9
  const region = regions[0];
9
10
  const s = feature.get('start');
10
11
  const e = feature.get('end');
11
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s, e, region, bpPerPx);
12
+ const CIGAR = feature.get('CIGAR');
12
13
  const flip = region.reversed ? -1 : 1;
13
14
  const strand = feature.get('strand') * flip;
14
- if (bpPerPx < 10 && heightPx > 5) {
15
- if (strand === -1) {
16
- ctx.beginPath();
17
- ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
18
- ctx.lineTo(leftPx, topPx + heightPx);
19
- ctx.lineTo(rightPx, topPx + heightPx);
20
- ctx.lineTo(rightPx, topPx);
21
- ctx.lineTo(leftPx, topPx);
22
- ctx.closePath();
23
- ctx.fill();
15
+ const renderChevrons = bpPerPx < 10 && heightPx > 5;
16
+ if (CIGAR.includes('N')) {
17
+ const cigarOps = (0, MismatchParser_1.parseCigar)(CIGAR);
18
+ if (strand === 1) {
19
+ let drawLen = 0;
20
+ let drawStart = s;
21
+ for (let i = 0; i < cigarOps.length; i += 2) {
22
+ const opLen = +cigarOps[i];
23
+ const op = cigarOps[i + 1];
24
+ if (op === 'M' || op === 'X' || op === '=' || op === 'D') {
25
+ drawLen += opLen;
26
+ }
27
+ else if (op === 'N') {
28
+ if (drawStart !== drawLen) {
29
+ const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart, drawStart + drawLen, region, bpPerPx);
30
+ const w = rightPx - leftPx;
31
+ ctx.fillRect(leftPx, topPx, w, heightPx);
32
+ }
33
+ drawStart += drawLen + opLen;
34
+ drawLen = 0;
35
+ }
36
+ }
37
+ if (drawStart !== drawLen) {
38
+ const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart, drawStart + drawLen, region, bpPerPx);
39
+ const w = rightPx - leftPx;
40
+ if (renderChevrons) {
41
+ ctx.beginPath();
42
+ ctx.moveTo(leftPx, topPx);
43
+ ctx.lineTo(leftPx, topPx + heightPx);
44
+ ctx.lineTo(rightPx, topPx + heightPx);
45
+ ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
46
+ ctx.lineTo(rightPx, topPx);
47
+ ctx.closePath();
48
+ ctx.fill();
49
+ }
50
+ else {
51
+ ctx.fillRect(leftPx, topPx, w, heightPx);
52
+ }
53
+ }
24
54
  }
25
- else {
26
- ctx.beginPath();
27
- ctx.moveTo(leftPx, topPx);
28
- ctx.lineTo(leftPx, topPx + heightPx);
29
- ctx.lineTo(rightPx, topPx + heightPx);
30
- ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
31
- ctx.lineTo(rightPx, topPx);
32
- ctx.closePath();
33
- ctx.fill();
55
+ else if (strand === -1) {
56
+ let drawLen = 0;
57
+ let drawStart = e;
58
+ for (let i = cigarOps.length - 2; i >= 0; i -= 2) {
59
+ const opLen = +cigarOps[i];
60
+ const op = cigarOps[i + 1];
61
+ if (op === 'M' || op === 'X' || op === '=' || op === 'D') {
62
+ drawLen += opLen;
63
+ }
64
+ else if (op === 'N') {
65
+ if (drawLen !== 0) {
66
+ const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart - drawLen, drawStart, region, bpPerPx);
67
+ ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
68
+ }
69
+ drawStart -= drawLen + opLen;
70
+ drawLen = 0;
71
+ }
72
+ }
73
+ if (drawLen !== 0) {
74
+ const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart - drawLen, drawStart, region, bpPerPx);
75
+ const w = rightPx - leftPx;
76
+ if (renderChevrons) {
77
+ ctx.beginPath();
78
+ ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
79
+ ctx.lineTo(leftPx, topPx + heightPx);
80
+ ctx.lineTo(rightPx, topPx + heightPx);
81
+ ctx.lineTo(rightPx, topPx);
82
+ ctx.lineTo(leftPx, topPx);
83
+ ctx.closePath();
84
+ ctx.fill();
85
+ }
86
+ else {
87
+ ctx.fillRect(leftPx, topPx, w, heightPx);
88
+ }
89
+ }
34
90
  }
35
91
  }
36
92
  else {
37
- ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
93
+ const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s, e, region, bpPerPx);
94
+ if (bpPerPx < 10 && heightPx > 5) {
95
+ if (strand === -1) {
96
+ ctx.beginPath();
97
+ ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
98
+ ctx.lineTo(leftPx, topPx + heightPx);
99
+ ctx.lineTo(rightPx, topPx + heightPx);
100
+ ctx.lineTo(rightPx, topPx);
101
+ ctx.lineTo(leftPx, topPx);
102
+ ctx.closePath();
103
+ ctx.fill();
104
+ }
105
+ else {
106
+ ctx.beginPath();
107
+ ctx.moveTo(leftPx, topPx);
108
+ ctx.lineTo(leftPx, topPx + heightPx);
109
+ ctx.lineTo(rightPx, topPx + heightPx);
110
+ ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
111
+ ctx.lineTo(rightPx, topPx);
112
+ ctx.closePath();
113
+ ctx.fill();
114
+ }
115
+ }
116
+ else {
117
+ ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
118
+ }
38
119
  }
39
120
  }
@@ -1,11 +1,12 @@
1
1
  import { Region } from '@jbrowse/core/util';
2
2
  import { LayoutFeature } from './util';
3
3
  import { RenderArgsWithColor } from './makeImageData';
4
- export declare function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }: {
4
+ export declare function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, cigarOps, }: {
5
5
  ctx: CanvasRenderingContext2D;
6
6
  feat: LayoutFeature;
7
7
  region: Region;
8
8
  bpPerPx: number;
9
9
  renderArgs: RenderArgsWithColor;
10
10
  canvasWidth: number;
11
+ cigarOps: string[];
11
12
  }): void;
@@ -2,13 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderMethylation = renderMethylation;
4
4
  const util_1 = require("@jbrowse/core/util");
5
- const MismatchParser_1 = require("../MismatchParser");
6
- const util_2 = require("./util");
7
5
  const colord_1 = require("@jbrowse/core/util/colord");
8
- // Color by methylation is slightly modified version of color by
9
- // modifications that focuses on CpG sites, with non-methylated CpG colored
10
- function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
11
- var _a, _b;
6
+ // locals
7
+ const util_2 = require("./util");
8
+ const ModificationParser_1 = require("../ModificationParser");
9
+ // Color by methylation is slightly modified version of color by modifications
10
+ // at reference CpG sites, with non-methylated CpG colored (looking only at the
11
+ // MM tag can not tell you where reference CpG sites are)
12
+ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, cigarOps, }) {
12
13
  const { regionSequence } = renderArgs;
13
14
  const { feature, topPx, heightPx } = feat;
14
15
  if (!regionSequence) {
@@ -20,7 +21,7 @@ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth
20
21
  }
21
22
  const fstart = feature.get('start');
22
23
  const fend = feature.get('end');
23
- const { methBins, methProbs } = (0, MismatchParser_1.getMethBins)(feature);
24
+ const { methBins, methProbs, hydroxyMethBins, hydroxyMethProbs } = (0, ModificationParser_1.getMethBins)(feature, cigarOps);
24
25
  function getCol(k) {
25
26
  if (methBins[k]) {
26
27
  const p = methProbs[k] || 0;
@@ -28,12 +29,19 @@ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth
28
29
  ? (0, colord_1.colord)('red').alpha((p - 0.5) * 2)
29
30
  : (0, colord_1.colord)('blue').alpha(1 - p * 2)).toHslString();
30
31
  }
32
+ if (hydroxyMethBins[k]) {
33
+ const p = hydroxyMethProbs[k] || 0;
34
+ return (p > 0.5
35
+ ? (0, colord_1.colord)('pink').alpha((p - 0.5) * 2)
36
+ : (0, colord_1.colord)('purple').alpha(1 - p * 2)).toHslString();
37
+ }
31
38
  return undefined;
32
39
  }
40
+ const r = regionSequence.toLowerCase();
33
41
  for (let i = 0; i < fend - fstart; i++) {
34
42
  const j = i + fstart;
35
- const l1 = (_a = regionSequence[j - region.start + 1]) === null || _a === void 0 ? void 0 : _a.toLowerCase();
36
- const l2 = (_b = regionSequence[j - region.start + 2]) === null || _b === void 0 ? void 0 : _b.toLowerCase();
43
+ const l1 = r[j - region.start + 1];
44
+ const l2 = r[j - region.start + 2];
37
45
  if (l1 === 'c' && l2 === 'g') {
38
46
  if (bpPerPx > 2) {
39
47
  const [leftPx, rightPx] = (0, util_1.bpSpanPx)(j, j + 2, region, bpPerPx);
@@ -12,8 +12,8 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
12
12
  const pxPerBp = Math.min(1 / bpPerPx, 2);
13
13
  const mismatches = feature.get('mismatches');
14
14
  const heightLim = charHeight - 2;
15
- // extraHorizontallyFlippedOffset is used to draw interbase items, which
16
- // are located to the left when forward and right when reversed
15
+ // extraHorizontallyFlippedOffset is used to draw interbase items, which are
16
+ // located to the left when forward and right when reversed
17
17
  const extraHorizontallyFlippedOffset = region.reversed ? 1 / bpPerPx + 1 : -1;
18
18
  if (!mismatches) {
19
19
  return;
@@ -25,16 +25,14 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
25
25
  const mlen = mismatch.length;
26
26
  const mbase = mismatch.base;
27
27
  const [leftPx, rightPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
28
- const widthPx = Math.max(minSubfeatureWidth, Math.abs(leftPx - rightPx));
28
+ const widthPx = Math.max(minSubfeatureWidth, rightPx - leftPx);
29
29
  if (mismatch.type === 'mismatch') {
30
30
  if (!drawSNPsMuted) {
31
31
  const baseColor = colorForBase[mismatch.base] || '#888';
32
- const c = mismatchAlpha
33
- ? mismatch.qual === undefined
34
- ? baseColor
35
- : (0, colord_1.colord)(baseColor)
36
- .alpha(Math.min(1, mismatch.qual / 50))
37
- .toHslString()
32
+ const c = mismatchAlpha && mismatch.qual !== undefined
33
+ ? (0, colord_1.colord)(baseColor)
34
+ .alpha(Math.min(1, mismatch.qual / 50))
35
+ .toHslString()
38
36
  : baseColor;
39
37
  (0, util_2.fillRect)(ctx, Math.round(leftPx), topPx, widthPx, heightPx, canvasWidth, c);
40
38
  }
@@ -43,13 +41,12 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
43
41
  const contrastColor = drawSNPsMuted
44
42
  ? 'black'
45
43
  : contrastForBase[mismatch.base] || 'black';
46
- ctx.fillStyle = mismatchAlpha
47
- ? mismatch.qual === undefined
48
- ? contrastColor
49
- : (0, colord_1.colord)(contrastColor)
44
+ ctx.fillStyle =
45
+ mismatchAlpha && mismatch.qual !== undefined
46
+ ? (0, colord_1.colord)(contrastColor)
50
47
  .alpha(Math.min(1, mismatch.qual / 50))
51
48
  .toHslString()
52
- : contrastColor;
49
+ : contrastColor;
53
50
  ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
54
51
  }
55
52
  }
@@ -63,7 +60,6 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
63
60
  }
64
61
  }
65
62
  else if (mismatch.type === 'insertion' && drawIndels) {
66
- ctx.fillStyle = 'purple';
67
63
  const pos = leftPx + extraHorizontallyFlippedOffset;
68
64
  const len = +mismatch.base || mismatch.length;
69
65
  const insW = Math.max(0, Math.min(1.2, 1 / bpPerPx));
@@ -92,12 +88,16 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
92
88
  else if (mismatch.type === 'skip') {
93
89
  // fix to avoid bad rendering note that this was also related to chrome
94
90
  // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1131528
91
+ //
95
92
  // also affected firefox ref #1236 #2750
96
93
  if (leftPx + widthPx > 0) {
97
94
  // make small exons more visible when zoomed far out
98
95
  const adjustPx = widthPx - (bpPerPx > 10 ? 1.5 : 0);
99
- ctx.clearRect(leftPx, topPx, adjustPx, heightPx);
100
- (0, util_2.fillRect)(ctx, Math.max(0, leftPx), topPx + heightPx / 2 - 1, adjustPx + Math.min(leftPx, 0), 2, canvasWidth, '#333');
96
+ const l = Math.max(0, leftPx);
97
+ const t = topPx + heightPx / 2 - 1;
98
+ const w = adjustPx + Math.min(leftPx, 0);
99
+ const h = 1;
100
+ (0, util_2.fillRect)(ctx, l, t, w, h, canvasWidth, 'rgb(151,184,201)');
101
101
  }
102
102
  }
103
103
  }
@@ -106,10 +106,10 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
106
106
  for (const mismatch of mismatches) {
107
107
  const mstart = start + mismatch.start;
108
108
  const mlen = mismatch.length;
109
- const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
110
109
  const len = +mismatch.base || mismatch.length;
111
- const txt = `${len}`;
112
110
  if (mismatch.type === 'insertion' && len >= 10) {
111
+ const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
112
+ const txt = `${len}`;
113
113
  if (bpPerPx > largeInsertionIndicatorScale) {
114
114
  (0, util_2.fillRect)(ctx, leftPx - 1, topPx, 2, heightPx, canvasWidth, 'purple');
115
115
  }
@@ -1,11 +1,12 @@
1
- import { Region } from '@jbrowse/core/util';
1
+ import type { Region } from '@jbrowse/core/util';
2
2
  import { LayoutFeature } from './util';
3
3
  import { RenderArgsWithColor } from './makeImageData';
4
- export declare function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }: {
4
+ export declare function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, cigarOps, }: {
5
5
  ctx: CanvasRenderingContext2D;
6
6
  feat: LayoutFeature;
7
7
  region: Region;
8
8
  bpPerPx: number;
9
9
  renderArgs: RenderArgsWithColor;
10
10
  canvasWidth: number;
11
+ cigarOps: string[];
11
12
  }): void;