@jbrowse/plugin-alignments 1.7.10 → 2.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 (291) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +192 -216
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -0
  3. package/dist/AlignmentsFeatureDetail/index.d.ts +3 -3
  4. package/dist/AlignmentsFeatureDetail/index.js +48 -44
  5. package/dist/AlignmentsFeatureDetail/index.js.map +1 -0
  6. package/dist/AlignmentsTrack/index.js +24 -32
  7. package/dist/AlignmentsTrack/index.js.map +1 -0
  8. package/dist/BamAdapter/BamAdapter.js +345 -585
  9. package/dist/BamAdapter/BamAdapter.js.map +1 -0
  10. package/dist/BamAdapter/BamSlightlyLazyFeature.js +143 -174
  11. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -0
  12. package/dist/BamAdapter/MismatchParser.d.ts +1 -1
  13. package/dist/BamAdapter/MismatchParser.js +341 -417
  14. package/dist/BamAdapter/MismatchParser.js.map +1 -0
  15. package/dist/BamAdapter/configSchema.js +33 -46
  16. package/dist/BamAdapter/configSchema.js.map +1 -0
  17. package/dist/BamAdapter/index.js +36 -32
  18. package/dist/BamAdapter/index.js.map +1 -0
  19. package/dist/CramAdapter/CramAdapter.js +376 -644
  20. package/dist/CramAdapter/CramAdapter.js.map +1 -0
  21. package/dist/CramAdapter/CramSlightlyLazyFeature.js +374 -439
  22. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -0
  23. package/dist/CramAdapter/CramTestAdapters.js +169 -227
  24. package/dist/CramAdapter/CramTestAdapters.js.map +1 -0
  25. package/dist/CramAdapter/configSchema.js +28 -38
  26. package/dist/CramAdapter/configSchema.js.map +1 -0
  27. package/dist/CramAdapter/index.js +37 -32
  28. package/dist/CramAdapter/index.js.map +1 -0
  29. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +91 -93
  30. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -0
  31. package/dist/HtsgetBamAdapter/configSchema.js +19 -29
  32. package/dist/HtsgetBamAdapter/configSchema.js.map +1 -0
  33. package/dist/HtsgetBamAdapter/index.js +44 -38
  34. package/dist/HtsgetBamAdapter/index.js.map +1 -0
  35. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +36 -65
  36. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -0
  37. package/dist/LinearAlignmentsDisplay/index.js +22 -28
  38. package/dist/LinearAlignmentsDisplay/index.js.map +1 -0
  39. package/dist/LinearAlignmentsDisplay/models/configSchema.js +12 -23
  40. package/dist/LinearAlignmentsDisplay/models/configSchema.js.map +1 -0
  41. package/dist/LinearAlignmentsDisplay/models/model.d.ts +10 -10
  42. package/dist/LinearAlignmentsDisplay/models/model.js +257 -245
  43. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -0
  44. package/dist/LinearPileupDisplay/components/ColorByModifications.js +98 -116
  45. package/dist/LinearPileupDisplay/components/ColorByModifications.js.map +1 -0
  46. package/dist/LinearPileupDisplay/components/ColorByTag.js +82 -91
  47. package/dist/LinearPileupDisplay/components/ColorByTag.js.map +1 -0
  48. package/dist/LinearPileupDisplay/components/FilterByTag.js +156 -192
  49. package/dist/LinearPileupDisplay/components/FilterByTag.js.map +1 -0
  50. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +15 -29
  51. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js.map +1 -0
  52. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +79 -93
  53. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -0
  54. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +78 -81
  55. package/dist/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -0
  56. package/dist/LinearPileupDisplay/components/SortByTag.js +80 -88
  57. package/dist/LinearPileupDisplay/components/SortByTag.js.map +1 -0
  58. package/dist/LinearPileupDisplay/configSchema.js +40 -42
  59. package/dist/LinearPileupDisplay/configSchema.js.map +1 -0
  60. package/dist/LinearPileupDisplay/index.js +21 -27
  61. package/dist/LinearPileupDisplay/index.js.map +1 -0
  62. package/dist/LinearPileupDisplay/model.d.ts +28 -18
  63. package/dist/LinearPileupDisplay/model.js +702 -797
  64. package/dist/LinearPileupDisplay/model.js.map +1 -0
  65. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  66. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +104 -77
  67. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js.map +1 -0
  68. package/dist/LinearSNPCoverageDisplay/index.js +21 -27
  69. package/dist/LinearSNPCoverageDisplay/index.js.map +1 -0
  70. package/dist/LinearSNPCoverageDisplay/models/configSchema.js +45 -55
  71. package/dist/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -0
  72. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +14 -12
  73. package/dist/LinearSNPCoverageDisplay/models/model.js +257 -230
  74. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -0
  75. package/dist/NestedFrequencyTable.js +104 -139
  76. package/dist/NestedFrequencyTable.js.map +1 -0
  77. package/dist/PileupRPC/rpcMethods.js +199 -278
  78. package/dist/PileupRPC/rpcMethods.js.map +1 -0
  79. package/dist/PileupRenderer/PileupLayoutSession.js +56 -76
  80. package/dist/PileupRenderer/PileupLayoutSession.js.map +1 -0
  81. package/dist/PileupRenderer/PileupRenderer.d.ts +4 -4
  82. package/dist/PileupRenderer/PileupRenderer.js +938 -1205
  83. package/dist/PileupRenderer/PileupRenderer.js.map +1 -0
  84. package/dist/PileupRenderer/components/PileupRendering.d.ts +1 -1
  85. package/dist/PileupRenderer/components/PileupRendering.js +173 -253
  86. package/dist/PileupRenderer/components/PileupRendering.js.map +1 -0
  87. package/dist/PileupRenderer/configSchema.js +65 -71
  88. package/dist/PileupRenderer/configSchema.js.map +1 -0
  89. package/dist/PileupRenderer/index.js +17 -22
  90. package/dist/PileupRenderer/index.js.map +1 -0
  91. package/dist/PileupRenderer/sortUtil.js +83 -107
  92. package/dist/PileupRenderer/sortUtil.js.map +1 -0
  93. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +436 -589
  94. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -0
  95. package/dist/SNPCoverageAdapter/configSchema.js +10 -20
  96. package/dist/SNPCoverageAdapter/configSchema.js.map +1 -0
  97. package/dist/SNPCoverageAdapter/index.js +46 -41
  98. package/dist/SNPCoverageAdapter/index.js.map +1 -0
  99. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +1 -1
  100. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +265 -290
  101. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -0
  102. package/dist/SNPCoverageRenderer/configSchema.js +30 -39
  103. package/dist/SNPCoverageRenderer/configSchema.js.map +1 -0
  104. package/dist/SNPCoverageRenderer/index.js +19 -30
  105. package/dist/SNPCoverageRenderer/index.js.map +1 -0
  106. package/dist/index.js +135 -152
  107. package/dist/index.js.map +1 -0
  108. package/dist/shared.js +84 -92
  109. package/dist/shared.js.map +1 -0
  110. package/dist/util.js +130 -121
  111. package/dist/util.js.map +1 -0
  112. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +6 -0
  113. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +145 -0
  114. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -0
  115. package/esm/AlignmentsFeatureDetail/index.d.ts +38 -0
  116. package/esm/AlignmentsFeatureDetail/index.js +23 -0
  117. package/esm/AlignmentsFeatureDetail/index.js.map +1 -0
  118. package/esm/AlignmentsTrack/index.d.ts +2 -0
  119. package/esm/AlignmentsTrack/index.js +23 -0
  120. package/esm/AlignmentsTrack/index.js.map +1 -0
  121. package/esm/BamAdapter/BamAdapter.d.ts +40 -0
  122. package/esm/BamAdapter/BamAdapter.js +173 -0
  123. package/esm/BamAdapter/BamAdapter.js.map +1 -0
  124. package/esm/BamAdapter/BamSlightlyLazyFeature.d.ts +33 -0
  125. package/esm/BamAdapter/BamSlightlyLazyFeature.js +107 -0
  126. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -0
  127. package/esm/BamAdapter/MismatchParser.d.ts +25 -0
  128. package/esm/BamAdapter/MismatchParser.js +294 -0
  129. package/esm/BamAdapter/MismatchParser.js.map +1 -0
  130. package/esm/BamAdapter/configSchema.d.ts +2 -0
  131. package/esm/BamAdapter/configSchema.js +31 -0
  132. package/esm/BamAdapter/configSchema.js.map +1 -0
  133. package/esm/BamAdapter/index.d.ts +3 -0
  134. package/esm/BamAdapter/index.js +10 -0
  135. package/esm/BamAdapter/index.js.map +1 -0
  136. package/esm/CramAdapter/CramAdapter.d.ts +53 -0
  137. package/esm/CramAdapter/CramAdapter.js +228 -0
  138. package/esm/CramAdapter/CramAdapter.js.map +1 -0
  139. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +49 -0
  140. package/esm/CramAdapter/CramSlightlyLazyFeature.js +349 -0
  141. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -0
  142. package/esm/CramAdapter/CramTestAdapters.d.ts +29 -0
  143. package/esm/CramAdapter/CramTestAdapters.js +70 -0
  144. package/esm/CramAdapter/CramTestAdapters.js.map +1 -0
  145. package/esm/CramAdapter/configSchema.d.ts +3 -0
  146. package/esm/CramAdapter/configSchema.js +26 -0
  147. package/esm/CramAdapter/configSchema.js.map +1 -0
  148. package/esm/CramAdapter/index.d.ts +3 -0
  149. package/esm/CramAdapter/index.js +11 -0
  150. package/esm/CramAdapter/index.js.map +1 -0
  151. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +9 -0
  152. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js +27 -0
  153. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -0
  154. package/esm/HtsgetBamAdapter/configSchema.d.ts +2 -0
  155. package/esm/HtsgetBamAdapter/configSchema.js +17 -0
  156. package/esm/HtsgetBamAdapter/configSchema.js.map +1 -0
  157. package/esm/HtsgetBamAdapter/index.d.ts +3 -0
  158. package/esm/HtsgetBamAdapter/index.js +16 -0
  159. package/esm/HtsgetBamAdapter/index.js.map +1 -0
  160. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +7 -0
  161. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +34 -0
  162. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -0
  163. package/esm/LinearAlignmentsDisplay/index.d.ts +2 -0
  164. package/esm/LinearAlignmentsDisplay/index.js +19 -0
  165. package/esm/LinearAlignmentsDisplay/index.js.map +1 -0
  166. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +4 -0
  167. package/esm/LinearAlignmentsDisplay/models/configSchema.js +12 -0
  168. package/esm/LinearAlignmentsDisplay/models/configSchema.js.map +1 -0
  169. package/esm/LinearAlignmentsDisplay/models/model.d.ts +105 -0
  170. package/esm/LinearAlignmentsDisplay/models/model.js +181 -0
  171. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -0
  172. package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +14 -0
  173. package/esm/LinearPileupDisplay/components/ColorByModifications.js +71 -0
  174. package/esm/LinearPileupDisplay/components/ColorByModifications.js.map +1 -0
  175. package/esm/LinearPileupDisplay/components/ColorByTag.d.ts +9 -0
  176. package/esm/LinearPileupDisplay/components/ColorByTag.js +45 -0
  177. package/esm/LinearPileupDisplay/components/ColorByTag.js.map +1 -0
  178. package/esm/LinearPileupDisplay/components/FilterByTag.d.ts +18 -0
  179. package/esm/LinearPileupDisplay/components/FilterByTag.js +123 -0
  180. package/esm/LinearPileupDisplay/components/FilterByTag.js.map +1 -0
  181. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +13 -0
  182. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +13 -0
  183. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js.map +1 -0
  184. package/esm/LinearPileupDisplay/components/SetFeatureHeight.d.ts +16 -0
  185. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +41 -0
  186. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -0
  187. package/esm/LinearPileupDisplay/components/SetMaxHeight.d.ts +10 -0
  188. package/esm/LinearPileupDisplay/components/SetMaxHeight.js +43 -0
  189. package/esm/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -0
  190. package/esm/LinearPileupDisplay/components/SortByTag.d.ts +9 -0
  191. package/esm/LinearPileupDisplay/components/SortByTag.js +43 -0
  192. package/esm/LinearPileupDisplay/components/SortByTag.js.map +1 -0
  193. package/esm/LinearPileupDisplay/configSchema.d.ts +6 -0
  194. package/esm/LinearPileupDisplay/configSchema.js +41 -0
  195. package/esm/LinearPileupDisplay/configSchema.js.map +1 -0
  196. package/esm/LinearPileupDisplay/index.d.ts +2 -0
  197. package/esm/LinearPileupDisplay/index.js +18 -0
  198. package/esm/LinearPileupDisplay/index.js.map +1 -0
  199. package/esm/LinearPileupDisplay/model.d.ts +332 -0
  200. package/esm/LinearPileupDisplay/model.js +576 -0
  201. package/esm/LinearPileupDisplay/model.js.map +1 -0
  202. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +10 -0
  203. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +57 -0
  204. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js.map +1 -0
  205. package/esm/LinearSNPCoverageDisplay/index.d.ts +2 -0
  206. package/esm/LinearSNPCoverageDisplay/index.js +18 -0
  207. package/esm/LinearSNPCoverageDisplay/index.js.map +1 -0
  208. package/esm/LinearSNPCoverageDisplay/models/configSchema.d.ts +2 -0
  209. package/esm/LinearSNPCoverageDisplay/models/configSchema.js +44 -0
  210. package/esm/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -0
  211. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +348 -0
  212. package/esm/LinearSNPCoverageDisplay/models/model.js +185 -0
  213. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -0
  214. package/esm/NestedFrequencyTable.d.ts +14 -0
  215. package/esm/NestedFrequencyTable.js +101 -0
  216. package/esm/NestedFrequencyTable.js.map +1 -0
  217. package/esm/PileupRPC/rpcMethods.d.ts +34 -0
  218. package/esm/PileupRPC/rpcMethods.js +70 -0
  219. package/esm/PileupRPC/rpcMethods.js.map +1 -0
  220. package/esm/PileupRenderer/PileupLayoutSession.d.ts +32 -0
  221. package/esm/PileupRenderer/PileupLayoutSession.js +32 -0
  222. package/esm/PileupRenderer/PileupLayoutSession.js.map +1 -0
  223. package/esm/PileupRenderer/PileupRenderer.d.ts +182 -0
  224. package/esm/PileupRenderer/PileupRenderer.js +830 -0
  225. package/esm/PileupRenderer/PileupRenderer.js.map +1 -0
  226. package/esm/PileupRenderer/components/PileupRendering.d.ts +23 -0
  227. package/esm/PileupRenderer/components/PileupRendering.js +138 -0
  228. package/esm/PileupRenderer/components/PileupRendering.js.map +1 -0
  229. package/esm/PileupRenderer/configSchema.d.ts +2 -0
  230. package/esm/PileupRenderer/configSchema.js +64 -0
  231. package/esm/PileupRenderer/configSchema.js.map +1 -0
  232. package/esm/PileupRenderer/index.d.ts +2 -0
  233. package/esm/PileupRenderer/index.js +12 -0
  234. package/esm/PileupRenderer/index.js.map +1 -0
  235. package/esm/PileupRenderer/sortUtil.d.ts +8 -0
  236. package/esm/PileupRenderer/sortUtil.js +80 -0
  237. package/esm/PileupRenderer/sortUtil.js.map +1 -0
  238. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +67 -0
  239. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +259 -0
  240. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -0
  241. package/esm/SNPCoverageAdapter/configSchema.d.ts +3 -0
  242. package/esm/SNPCoverageAdapter/configSchema.js +6 -0
  243. package/esm/SNPCoverageAdapter/configSchema.js.map +1 -0
  244. package/esm/SNPCoverageAdapter/index.d.ts +3 -0
  245. package/esm/SNPCoverageAdapter/index.js +18 -0
  246. package/esm/SNPCoverageAdapter/index.js.map +1 -0
  247. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +20 -0
  248. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +185 -0
  249. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -0
  250. package/esm/SNPCoverageRenderer/configSchema.d.ts +2 -0
  251. package/esm/SNPCoverageRenderer/configSchema.js +29 -0
  252. package/esm/SNPCoverageRenderer/configSchema.js.map +1 -0
  253. package/esm/SNPCoverageRenderer/index.d.ts +3 -0
  254. package/esm/SNPCoverageRenderer/index.js +14 -0
  255. package/esm/SNPCoverageRenderer/index.js.map +1 -0
  256. package/esm/index.d.ts +10 -0
  257. package/esm/index.js +91 -0
  258. package/esm/index.js.map +1 -0
  259. package/esm/shared.d.ts +25 -0
  260. package/esm/shared.js +28 -0
  261. package/esm/shared.js.map +1 -0
  262. package/esm/util.d.ts +19 -0
  263. package/esm/util.js +83 -0
  264. package/esm/util.js.map +1 -0
  265. package/package.json +22 -14
  266. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +4 -4
  267. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +321 -397
  268. package/src/BamAdapter/MismatchParser.ts +2 -2
  269. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -3
  270. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +7 -7
  271. package/src/LinearPileupDisplay/components/ColorByTag.tsx +5 -5
  272. package/src/LinearPileupDisplay/components/FilterByTag.tsx +5 -5
  273. package/src/LinearPileupDisplay/components/LinearPileupDisplayBlurb.tsx +1 -1
  274. package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +9 -9
  275. package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +5 -5
  276. package/src/LinearPileupDisplay/components/SortByTag.tsx +5 -5
  277. package/src/LinearPileupDisplay/model.ts +16 -10
  278. package/src/LinearSNPCoverageDisplay/models/model.ts +25 -25
  279. package/src/PileupRenderer/PileupRenderer.tsx +54 -40
  280. package/src/PileupRenderer/components/PileupRendering.tsx +11 -11
  281. package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +7 -5
  282. package/dist/AlignmentsFeatureDetail/index.test.js +0 -60
  283. package/dist/BamAdapter/BamAdapter.test.js +0 -177
  284. package/dist/BamAdapter/MismatchParser.test.js +0 -251
  285. package/dist/CramAdapter/CramAdapter.test.js +0 -138
  286. package/dist/LinearAlignmentsDisplay/models/configSchema.test.js +0 -83
  287. package/dist/LinearPileupDisplay/configSchema.test.js +0 -92
  288. package/dist/LinearSNPCoverageDisplay/models/configSchema.test.js +0 -62
  289. package/dist/PileupRenderer/components/PileupRendering.test.js +0 -36
  290. package/dist/declare.d.js +0 -1
  291. package/dist/index.test.js +0 -26
@@ -1,391 +1,363 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
32
+ desc = { enumerable: true, get: function() { return m[k]; } };
33
+ }
34
+ Object.defineProperty(o, k2, desc);
35
+ }) : (function(o, m, k, k2) {
36
+ if (k2 === undefined) k2 = k;
37
+ o[k2] = m[k];
38
+ }));
39
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
40
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
41
+ }) : function(o, v) {
42
+ o["default"] = v;
7
43
  });
8
- exports.default = void 0;
9
-
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
-
14
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
-
20
- var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
21
-
22
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
23
-
24
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
25
-
26
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
27
-
28
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
-
30
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
31
-
32
- var _color = _interopRequireDefault(require("color"));
33
-
34
- var _BoxRendererType2 = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType"));
35
-
36
- var _ui = require("@jbrowse/core/ui");
37
-
38
- var _util = require("@jbrowse/core/util");
39
-
40
- var _offscreenCanvasUtils = require("@jbrowse/core/util/offscreenCanvasUtils");
41
-
42
- var _dataAdapterCache = require("@jbrowse/core/data_adapters/dataAdapterCache");
43
-
44
- var _configuration = require("@jbrowse/core/configuration");
45
-
46
- var _MismatchParser = require("../BamAdapter/MismatchParser");
47
-
48
- var _sortUtil = require("./sortUtil");
49
-
50
- var _util2 = require("../util");
51
-
52
- var _PileupLayoutSession = require("./PileupLayoutSession");
53
-
54
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
55
-
56
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
57
-
58
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
59
-
60
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
61
-
62
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
63
-
64
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
65
-
66
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
67
-
44
+ var __importStar = (this && this.__importStar) || function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
52
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
53
+ return new (P || (P = Promise))(function (resolve, reject) {
54
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
56
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
57
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
58
+ });
59
+ };
60
+ var __generator = (this && this.__generator) || function (thisArg, body) {
61
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
62
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
63
+ function verb(n) { return function (v) { return step([n, v]); }; }
64
+ function step(op) {
65
+ if (f) throw new TypeError("Generator is already executing.");
66
+ while (_) try {
67
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
68
+ if (y = 0, t) op = [op[0] & 2, t.value];
69
+ switch (op[0]) {
70
+ case 0: case 1: t = op; break;
71
+ case 4: _.label++; return { value: op[1], done: false };
72
+ case 5: _.label++; y = op[1]; op = [0]; continue;
73
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
74
+ default:
75
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
76
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
77
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
78
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
79
+ if (t[2]) _.ops.pop();
80
+ _.trys.pop(); continue;
81
+ }
82
+ op = body.call(thisArg, _);
83
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
84
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
85
+ }
86
+ };
87
+ var __read = (this && this.__read) || function (o, n) {
88
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
89
+ if (!m) return o;
90
+ var i = m.call(o), r, ar = [], e;
91
+ try {
92
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
93
+ }
94
+ catch (error) { e = { error: error }; }
95
+ finally {
96
+ try {
97
+ if (r && !r.done && (m = i["return"])) m.call(i);
98
+ }
99
+ finally { if (e) throw e.error; }
100
+ }
101
+ return ar;
102
+ };
103
+ var __values = (this && this.__values) || function(o) {
104
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
105
+ if (m) return m.call(o);
106
+ if (o && typeof o.length === "number") return {
107
+ next: function () {
108
+ if (o && i >= o.length) o = void 0;
109
+ return { value: o && o[i++], done: !o };
110
+ }
111
+ };
112
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
113
+ };
114
+ var __importDefault = (this && this.__importDefault) || function (mod) {
115
+ return (mod && mod.__esModule) ? mod : { "default": mod };
116
+ };
117
+ Object.defineProperty(exports, "__esModule", { value: true });
118
+ var BoxRendererType_1 = __importDefault(require("@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType"));
119
+ var ui_1 = require("@jbrowse/core/ui");
120
+ var util_1 = require("@jbrowse/core/util");
121
+ var offscreenCanvasUtils_1 = require("@jbrowse/core/util/offscreenCanvasUtils");
122
+ var dataAdapterCache_1 = require("@jbrowse/core/data_adapters/dataAdapterCache");
123
+ var configuration_1 = require("@jbrowse/core/configuration");
124
+ // locals
125
+ var MismatchParser_1 = require("../BamAdapter/MismatchParser");
126
+ var sortUtil_1 = require("./sortUtil");
127
+ var util_2 = require("../util");
128
+ var PileupLayoutSession_1 = require("./PileupLayoutSession");
68
129
  function fillRect(ctx, l, t, w, h, cw, color) {
69
- if (l + w < 0 || l > cw) {
70
- return;
71
- } else {
72
- if (color) {
73
- ctx.fillStyle = color;
130
+ if (l + w < 0 || l > cw) {
131
+ return;
132
+ }
133
+ else {
134
+ if (color) {
135
+ ctx.fillStyle = color;
136
+ }
137
+ ctx.fillRect(l, t, w, h);
74
138
  }
75
-
76
- ctx.fillRect(l, t, w, h);
77
- }
78
139
  }
79
-
80
140
  function getColorBaseMap(theme) {
81
- return {
82
- A: theme.palette.bases.A.main,
83
- C: theme.palette.bases.C.main,
84
- G: theme.palette.bases.G.main,
85
- T: theme.palette.bases.T.main,
86
- deletion: '#808080' // gray
87
-
88
- };
141
+ // @ts-ignore
142
+ var bases = theme.palette.bases;
143
+ return {
144
+ A: bases.A.main,
145
+ C: bases.C.main,
146
+ G: bases.G.main,
147
+ T: bases.T.main,
148
+ deletion: '#808080', // gray
149
+ };
89
150
  }
90
-
91
151
  function getContrastBaseMap(theme) {
92
- return Object.fromEntries(Object.entries(getColorBaseMap(theme)).map(function (_ref) {
93
- var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
94
- key = _ref2[0],
95
- value = _ref2[1];
96
-
97
- return [key, theme.palette.getContrastText(value)];
98
- }));
152
+ return Object.fromEntries(Object.entries(getColorBaseMap(theme)).map(function (_a) {
153
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
154
+ return [
155
+ key,
156
+ theme.palette.getContrastText(value),
157
+ ];
158
+ }));
99
159
  }
100
-
101
160
  var alignmentColoring = {
102
- color_fwd_strand_not_proper: '#ECC8C8',
103
- color_rev_strand_not_proper: '#BEBED8',
104
- color_fwd_strand: '#EC8B8B',
105
- color_rev_strand: '#8F8FD8',
106
- color_fwd_missing_mate: '#D11919',
107
- color_rev_missing_mate: '#1919D1',
108
- color_fwd_diff_chr: '#000',
109
- color_rev_diff_chr: '#969696',
110
- color_pair_lr: '#c8c8c8',
111
- color_pair_rr: 'navy',
112
- color_pair_rl: 'teal',
113
- color_pair_ll: 'green',
114
- color_nostrand: '#c8c8c8',
115
- color_interchrom: 'orange',
116
- color_longinsert: 'red',
117
- color_shortinsert: 'pink'
161
+ color_fwd_strand_not_proper: '#ECC8C8',
162
+ color_rev_strand_not_proper: '#BEBED8',
163
+ color_fwd_strand: '#EC8B8B',
164
+ color_rev_strand: '#8F8FD8',
165
+ color_fwd_missing_mate: '#D11919',
166
+ color_rev_missing_mate: '#1919D1',
167
+ color_fwd_diff_chr: '#000',
168
+ color_rev_diff_chr: '#969696',
169
+ color_pair_lr: '#c8c8c8',
170
+ color_pair_rr: 'navy',
171
+ color_pair_rl: 'teal',
172
+ color_pair_ll: 'green',
173
+ color_nostrand: '#c8c8c8',
174
+ color_interchrom: 'orange',
175
+ color_longinsert: 'red',
176
+ color_shortinsert: 'pink',
118
177
  };
119
-
120
- function shouldDrawSNPs(type) {
121
- return !['methylation', 'modifications'].includes(type || '');
178
+ function shouldDrawSNPsMuted(type) {
179
+ return ['methylation', 'modifications'].includes(type || '');
122
180
  }
123
-
124
181
  function shouldDrawIndels(type) {
125
- return true;
182
+ return true;
126
183
  }
127
-
128
- var PileupRenderer = /*#__PURE__*/function (_BoxRendererType) {
129
- (0, _inherits2.default)(PileupRenderer, _BoxRendererType);
130
-
131
- var _super = _createSuper(PileupRenderer);
132
-
133
- function PileupRenderer() {
134
- var _this;
135
-
136
- (0, _classCallCheck2.default)(this, PileupRenderer);
137
-
138
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
139
- args[_key] = arguments[_key];
184
+ var PileupRenderer = /** @class */ (function (_super) {
185
+ __extends(PileupRenderer, _super);
186
+ function PileupRenderer() {
187
+ var _this = _super !== null && _super.apply(this, arguments) || this;
188
+ _this.supportsSVG = true;
189
+ return _this;
140
190
  }
141
-
142
- _this = _super.call.apply(_super, [this].concat(args));
143
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "supportsSVG", true);
144
- return _this;
145
- }
146
-
147
- (0, _createClass2.default)(PileupRenderer, [{
148
- key: "getCharWidthHeight",
149
- value: // get width and height of chars the height is an approximation: width
191
+ // get width and height of chars the height is an approximation: width
150
192
  // letter M is approximately the height
151
- function getCharWidthHeight(ctx) {
152
- var charWidth = (0, _util.measureText)('A');
153
- var charHeight = (0, _util.measureText)('M');
154
- return {
155
- charWidth: charWidth,
156
- charHeight: charHeight
157
- };
158
- }
159
- }, {
160
- key: "layoutFeature",
161
- value: function layoutFeature(_ref3) {
162
- var feature = _ref3.feature,
163
- layout = _ref3.layout,
164
- bpPerPx = _ref3.bpPerPx,
165
- region = _ref3.region,
166
- showSoftClip = _ref3.showSoftClip,
167
- heightPx = _ref3.heightPx,
168
- displayMode = _ref3.displayMode;
169
- var expansionBefore = 0;
170
- var expansionAfter = 0; // Expand the start and end of feature when softclipping enabled
171
-
172
- if (showSoftClip) {
173
- var mismatches = feature.get('mismatches');
174
- var seq = feature.get('seq');
175
-
176
- if (seq) {
177
- for (var i = 0; i < mismatches.length; i += 1) {
178
- var _mismatches$i = mismatches[i],
179
- type = _mismatches$i.type,
180
- start = _mismatches$i.start,
181
- _mismatches$i$cliplen = _mismatches$i.cliplen,
182
- cliplen = _mismatches$i$cliplen === void 0 ? 0 : _mismatches$i$cliplen;
183
-
184
- if (type === 'softclip') {
185
- start === 0 ? expansionBefore = cliplen : expansionAfter = cliplen;
193
+ PileupRenderer.prototype.getCharWidthHeight = function (ctx) {
194
+ var charWidth = (0, util_1.measureText)('A');
195
+ var charHeight = (0, util_1.measureText)('M') - 2;
196
+ return { charWidth: charWidth, charHeight: charHeight };
197
+ };
198
+ PileupRenderer.prototype.layoutFeature = function (_a) {
199
+ var feature = _a.feature, layout = _a.layout, bpPerPx = _a.bpPerPx, region = _a.region, showSoftClip = _a.showSoftClip, heightPx = _a.heightPx, displayMode = _a.displayMode;
200
+ var expansionBefore = 0;
201
+ var expansionAfter = 0;
202
+ // Expand the start and end of feature when softclipping enabled
203
+ if (showSoftClip) {
204
+ var mismatches = feature.get('mismatches');
205
+ var seq = feature.get('seq');
206
+ if (seq) {
207
+ for (var i = 0; i < mismatches.length; i += 1) {
208
+ var _b = mismatches[i], type = _b.type, start = _b.start, _c = _b.cliplen, cliplen = _c === void 0 ? 0 : _c;
209
+ if (type === 'softclip') {
210
+ start === 0
211
+ ? (expansionBefore = cliplen)
212
+ : (expansionAfter = cliplen);
213
+ }
214
+ }
186
215
  }
187
- }
188
216
  }
189
- }
190
-
191
- var _bpSpanPx = (0, _util.bpSpanPx)(feature.get('start') - expansionBefore, feature.get('end') + expansionAfter, region, bpPerPx),
192
- _bpSpanPx2 = (0, _slicedToArray2.default)(_bpSpanPx, 2),
193
- leftPx = _bpSpanPx2[0],
194
- rightPx = _bpSpanPx2[1];
195
-
196
- if (displayMode === 'compact') {
197
- heightPx /= 3;
198
- }
199
-
200
- if (feature.get('refName') !== region.refName) {
201
- throw new Error("feature ".concat(feature.id(), " is not on the current region's reference sequence ").concat(region.refName));
202
- }
203
-
204
- var topPx = layout.addRect(feature.id(), feature.get('start') - expansionBefore, feature.get('end') + expansionAfter, heightPx, feature);
205
-
206
- if (topPx === null) {
207
- return null;
208
- }
209
-
210
- return {
211
- feature: feature,
212
- leftPx: leftPx,
213
- rightPx: rightPx,
214
- topPx: displayMode === 'collapse' ? 0 : topPx,
215
- heightPx: heightPx
216
- };
217
- } // expands region for clipping to use. possible improvement: use average read
217
+ var _d = __read((0, util_1.bpSpanPx)(feature.get('start') - expansionBefore, feature.get('end') + expansionAfter, region, bpPerPx), 2), leftPx = _d[0], rightPx = _d[1];
218
+ if (displayMode === 'compact') {
219
+ heightPx /= 3;
220
+ }
221
+ if (feature.get('refName') !== region.refName) {
222
+ throw new Error("feature ".concat(feature.id(), " is not on the current region's reference sequence ").concat(region.refName));
223
+ }
224
+ var topPx = layout.addRect(feature.id(), feature.get('start') - expansionBefore, feature.get('end') + expansionAfter, heightPx, feature);
225
+ if (topPx === null) {
226
+ return null;
227
+ }
228
+ return {
229
+ feature: feature,
230
+ leftPx: leftPx,
231
+ rightPx: rightPx,
232
+ topPx: displayMode === 'collapse' ? 0 : topPx,
233
+ heightPx: heightPx,
234
+ };
235
+ };
236
+ // expands region for clipping to use. possible improvement: use average read
218
237
  // size to set the heuristic maxClippingSize expansion (e.g. short reads
219
238
  // don't have to expand a softclipping size a lot, but long reads might)
220
-
221
- }, {
222
- key: "getExpandedRegion",
223
- value: function getExpandedRegion(region, renderArgs) {
224
- var config = renderArgs.config,
225
- showSoftClip = renderArgs.showSoftClip;
226
- var maxClippingSize = (0, _configuration.readConfObject)(config, 'maxClippingSize');
227
- var start = region.start,
228
- end = region.end;
229
- var len = end - start;
230
- var bpExpansion = Math.max(len, showSoftClip ? Math.round(maxClippingSize) : 0);
231
- return _objectSpread(_objectSpread({}, region), {}, {
232
- start: Math.floor(Math.max(start - bpExpansion, 0)),
233
- end: Math.ceil(end + bpExpansion)
234
- });
235
- }
236
- }, {
237
- key: "colorByOrientation",
238
- value: function colorByOrientation(feature, config) {
239
- return alignmentColoring[this.getOrientation(feature, config) || 'color_nostrand'];
240
- }
241
- }, {
242
- key: "getOrientation",
243
- value: function getOrientation(feature, config) {
244
- var orientationType = (0, _configuration.readConfObject)(config, 'orientationType');
245
- var type = _util2.orientationTypes[orientationType];
246
- var orientation = type[feature.get('pair_orientation')];
247
- var map = {
248
- LR: 'color_pair_lr',
249
- RR: 'color_pair_rr',
250
- RL: 'color_pair_rl',
251
- LL: 'color_pair_ll'
252
- };
253
- return map[orientation];
254
- }
255
- }, {
256
- key: "colorByInsertSize",
257
- value: function colorByInsertSize(feature, _config) {
258
- return feature.get('is_paired') && feature.get('seq_id') !== feature.get('next_seq_id') ? '#555' : "hsl(".concat(Math.abs(feature.get('template_length')) / 10, ",50%,50%)");
259
- }
260
- }, {
261
- key: "colorByStranded",
262
- value: function colorByStranded(feature, _config) {
263
- var flags = feature.get('flags');
264
- var strand = feature.get('strand'); // is paired
265
-
266
- if (flags & 1) {
267
- var revflag = flags & 64;
268
- var flipper = revflag ? -1 : 1; // proper pairing
269
-
270
- if (flags & 2) {
271
- return strand * flipper === 1 ? 'color_rev_strand' : 'color_fwd_strand';
272
- }
273
-
274
- if (feature.get('multi_segment_next_segment_unmapped')) {
275
- return strand * flipper === 1 ? 'color_rev_missing_mate' : 'color_fwd_missing_mate';
239
+ PileupRenderer.prototype.getExpandedRegion = function (region, renderArgs) {
240
+ var config = renderArgs.config, showSoftClip = renderArgs.showSoftClip;
241
+ var maxClippingSize = (0, configuration_1.readConfObject)(config, 'maxClippingSize');
242
+ var start = region.start, end = region.end;
243
+ var len = end - start;
244
+ var bpExpansion = Math.max(len, showSoftClip ? Math.round(maxClippingSize) : 0);
245
+ return __assign(__assign({}, region), { start: Math.floor(Math.max(start - bpExpansion, 0)), end: Math.ceil(end + bpExpansion) });
246
+ };
247
+ PileupRenderer.prototype.colorByOrientation = function (feature, config) {
248
+ return alignmentColoring[this.getOrientation(feature, config) || 'color_nostrand'];
249
+ };
250
+ PileupRenderer.prototype.getOrientation = function (feature, config) {
251
+ var orientationType = (0, configuration_1.readConfObject)(config, 'orientationType');
252
+ var type = util_2.orientationTypes[orientationType];
253
+ var orientation = type[feature.get('pair_orientation')];
254
+ var map = {
255
+ LR: 'color_pair_lr',
256
+ RR: 'color_pair_rr',
257
+ RL: 'color_pair_rl',
258
+ LL: 'color_pair_ll',
259
+ };
260
+ return map[orientation];
261
+ };
262
+ PileupRenderer.prototype.colorByInsertSize = function (feature, _config) {
263
+ return feature.get('is_paired') &&
264
+ feature.get('seq_id') !== feature.get('next_seq_id')
265
+ ? '#555'
266
+ : "hsl(".concat(Math.abs(feature.get('template_length')) / 10, ",50%,50%)");
267
+ };
268
+ PileupRenderer.prototype.colorByStranded = function (feature, _config) {
269
+ var flags = feature.get('flags');
270
+ var strand = feature.get('strand');
271
+ // is paired
272
+ if (flags & 1) {
273
+ var revflag = flags & 64;
274
+ var flipper = revflag ? -1 : 1;
275
+ // proper pairing
276
+ if (flags & 2) {
277
+ return strand * flipper === 1 ? 'color_rev_strand' : 'color_fwd_strand';
278
+ }
279
+ if (feature.get('multi_segment_next_segment_unmapped')) {
280
+ return strand * flipper === 1
281
+ ? 'color_rev_missing_mate'
282
+ : 'color_fwd_missing_mate';
283
+ }
284
+ if (feature.get('seq_id') === feature.get('next_seq_id')) {
285
+ return strand * flipper === 1
286
+ ? 'color_rev_strand_not_proper'
287
+ : 'color_fwd_strand_not_proper';
288
+ }
289
+ // should only leave aberrant chr
290
+ return strand === 1 ? 'color_fwd_diff_chr' : 'color_rev_diff_chr';
276
291
  }
277
-
278
- if (feature.get('seq_id') === feature.get('next_seq_id')) {
279
- return strand * flipper === 1 ? 'color_rev_strand_not_proper' : 'color_fwd_strand_not_proper';
280
- } // should only leave aberrant chr
281
-
282
-
283
- return strand === 1 ? 'color_fwd_diff_chr' : 'color_rev_diff_chr';
284
- }
285
-
286
- return strand === 1 ? 'color_fwd_strand' : 'color_rev_strand';
287
- }
288
- }, {
289
- key: "colorByPerBaseLettering",
290
- value: function colorByPerBaseLettering(_ref4) {
291
- var ctx = _ref4.ctx,
292
- feat = _ref4.feat,
293
- region = _ref4.region,
294
- bpPerPx = _ref4.bpPerPx,
295
- colorForBase = _ref4.colorForBase,
296
- contrastForBase = _ref4.contrastForBase,
297
- charWidth = _ref4.charWidth,
298
- charHeight = _ref4.charHeight,
299
- canvasWidth = _ref4.canvasWidth;
300
- var heightLim = charHeight - 2;
301
- var feature = feat.feature,
302
- topPx = feat.topPx,
303
- heightPx = feat.heightPx;
304
- var seq = feature.get('seq');
305
- var cigarOps = (0, _MismatchParser.parseCigar)(feature.get('CIGAR'));
306
- var w = 1 / bpPerPx;
307
- var start = feature.get('start');
308
- var soffset = 0; // sequence offset
309
-
310
- var roffset = 0; // reference offset
311
-
312
- for (var i = 0; i < cigarOps.length; i += 2) {
313
- var len = +cigarOps[i];
314
- var op = cigarOps[i + 1];
315
-
316
- if (op === 'S' || op === 'I') {
317
- soffset += len;
318
- } else if (op === 'D' || op === 'N') {
319
- roffset += len;
320
- } else if (op === 'M' || op === 'X' || op === '=') {
321
- for (var m = 0; m < len; m++) {
322
- var letter = seq[soffset + m];
323
- var r = start + roffset + m;
324
-
325
- var _bpSpanPx3 = (0, _util.bpSpanPx)(r, r + 1, region, bpPerPx),
326
- _bpSpanPx4 = (0, _slicedToArray2.default)(_bpSpanPx3, 1),
327
- leftPx = _bpSpanPx4[0];
328
-
329
- fillRect(ctx, leftPx, topPx, w + 0.5, heightPx, canvasWidth, colorForBase[letter]);
330
-
331
- if (w >= charWidth && heightPx >= heightLim) {
332
- // normal SNP coloring
333
- ctx.fillStyle = contrastForBase[letter];
334
- ctx.fillText(letter, leftPx + (w - charWidth) / 2 + 1, topPx + heightPx);
292
+ return strand === 1 ? 'color_fwd_strand' : 'color_rev_strand';
293
+ };
294
+ PileupRenderer.prototype.colorByPerBaseLettering = function (_a) {
295
+ var ctx = _a.ctx, feat = _a.feat, region = _a.region, bpPerPx = _a.bpPerPx, colorForBase = _a.colorForBase, contrastForBase = _a.contrastForBase, charWidth = _a.charWidth, charHeight = _a.charHeight, canvasWidth = _a.canvasWidth;
296
+ var heightLim = charHeight - 2;
297
+ var feature = feat.feature, topPx = feat.topPx, heightPx = feat.heightPx;
298
+ var seq = feature.get('seq');
299
+ var cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
300
+ var w = 1 / bpPerPx;
301
+ var start = feature.get('start');
302
+ var soffset = 0; // sequence offset
303
+ var roffset = 0; // reference offset
304
+ for (var i = 0; i < cigarOps.length; i += 2) {
305
+ var len = +cigarOps[i];
306
+ var op = cigarOps[i + 1];
307
+ if (op === 'S' || op === 'I') {
308
+ soffset += len;
309
+ }
310
+ else if (op === 'D' || op === 'N') {
311
+ roffset += len;
312
+ }
313
+ else if (op === 'M' || op === 'X' || op === '=') {
314
+ for (var m = 0; m < len; m++) {
315
+ var letter = seq[soffset + m];
316
+ var r = start + roffset + m;
317
+ var _b = __read((0, util_1.bpSpanPx)(r, r + 1, region, bpPerPx), 1), leftPx = _b[0];
318
+ fillRect(ctx, leftPx, topPx, w + 0.5, heightPx, canvasWidth, colorForBase[letter]);
319
+ if (w >= charWidth && heightPx >= heightLim) {
320
+ // normal SNP coloring
321
+ ctx.fillStyle = contrastForBase[letter];
322
+ ctx.fillText(letter, leftPx + (w - charWidth) / 2 + 1, topPx + heightPx);
323
+ }
324
+ }
325
+ soffset += len;
326
+ roffset += len;
335
327
  }
336
- }
337
-
338
- soffset += len;
339
- roffset += len;
340
328
  }
341
- }
342
- }
343
- }, {
344
- key: "colorByPerBaseQuality",
345
- value: function colorByPerBaseQuality(_ref5) {
346
- var ctx = _ref5.ctx,
347
- feat = _ref5.feat,
348
- region = _ref5.region,
349
- bpPerPx = _ref5.bpPerPx,
350
- canvasWidth = _ref5.canvasWidth;
351
- var feature = feat.feature,
352
- topPx = feat.topPx,
353
- heightPx = feat.heightPx;
354
- var qual = feature.get('qual') || '';
355
- var scores = qual.split(' ').map(function (val) {
356
- return +val;
357
- });
358
- var cigarOps = (0, _MismatchParser.parseCigar)(feature.get('CIGAR'));
359
- var width = 1 / bpPerPx;
360
- var start = feature.get('start');
361
- var soffset = 0; // sequence offset
362
-
363
- var roffset = 0; // reference offset
364
-
365
- for (var i = 0; i < cigarOps.length; i += 2) {
366
- var len = +cigarOps[i];
367
- var op = cigarOps[i + 1];
368
-
369
- if (op === 'S' || op === 'I') {
370
- soffset += len;
371
- } else if (op === 'D' || op === 'N') {
372
- roffset += len;
373
- } else if (op === 'M' || op === 'X' || op === '=') {
374
- for (var m = 0; m < len; m++) {
375
- var score = scores[soffset + m];
376
-
377
- var _bpSpanPx5 = (0, _util.bpSpanPx)(start + roffset + m, start + roffset + m + 1, region, bpPerPx),
378
- _bpSpanPx6 = (0, _slicedToArray2.default)(_bpSpanPx5, 1),
379
- leftPx = _bpSpanPx6[0];
380
-
381
- fillRect(ctx, leftPx, topPx, width + 0.5, heightPx, canvasWidth, "hsl(".concat(score === 255 ? 150 : score * 1.5, ",55%,50%)"));
382
- }
383
-
384
- soffset += len;
385
- roffset += len;
329
+ };
330
+ PileupRenderer.prototype.colorByPerBaseQuality = function (_a) {
331
+ var ctx = _a.ctx, feat = _a.feat, region = _a.region, bpPerPx = _a.bpPerPx, canvasWidth = _a.canvasWidth;
332
+ var feature = feat.feature, topPx = feat.topPx, heightPx = feat.heightPx;
333
+ var qual = feature.get('qual') || '';
334
+ var scores = qual.split(' ').map(function (val) { return +val; });
335
+ var cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
336
+ var width = 1 / bpPerPx;
337
+ var start = feature.get('start');
338
+ var soffset = 0; // sequence offset
339
+ var roffset = 0; // reference offset
340
+ for (var i = 0; i < cigarOps.length; i += 2) {
341
+ var len = +cigarOps[i];
342
+ var op = cigarOps[i + 1];
343
+ if (op === 'S' || op === 'I') {
344
+ soffset += len;
345
+ }
346
+ else if (op === 'D' || op === 'N') {
347
+ roffset += len;
348
+ }
349
+ else if (op === 'M' || op === 'X' || op === '=') {
350
+ for (var m = 0; m < len; m++) {
351
+ var score = scores[soffset + m];
352
+ var _b = __read((0, util_1.bpSpanPx)(start + roffset + m, start + roffset + m + 1, region, bpPerPx), 1), leftPx = _b[0];
353
+ fillRect(ctx, leftPx, topPx, width + 0.5, heightPx, canvasWidth, "hsl(".concat(score === 255 ? 150 : score * 1.5, ",55%,50%)"));
354
+ }
355
+ soffset += len;
356
+ roffset += len;
357
+ }
386
358
  }
387
- }
388
- } // ML stores probabilities as array of numerics and MP is scaled phred scores
359
+ };
360
+ // ML stores probabilities as array of numerics and MP is scaled phred scores
389
361
  // https://github.com/samtools/hts-specs/pull/418/files#diff-e765c6479316309f56b636f88189cdde8c40b854c7bdcce9ee7fe87a4e76febcR596
390
362
  //
391
363
  // if we have ML or Ml, it is an 8bit probability, divide by 255
@@ -394,865 +366,626 @@ var PileupRenderer = /*#__PURE__*/function (_BoxRendererType) {
394
366
  // has very high likelihood basecalls at that point, we really only care
395
367
  // about low qual calls <20 approx
396
368
  //
397
-
398
- }, {
399
- key: "colorByModifications",
400
- value: function colorByModifications(_ref6) {
401
- var ctx = _ref6.ctx,
402
- feat = _ref6.feat,
403
- region = _ref6.region,
404
- bpPerPx = _ref6.bpPerPx,
405
- renderArgs = _ref6.renderArgs,
406
- canvasWidth = _ref6.canvasWidth;
407
- var feature = feat.feature,
408
- topPx = feat.topPx,
409
- heightPx = feat.heightPx;
410
- var _renderArgs$modificat = renderArgs.modificationTagMap,
411
- modificationTagMap = _renderArgs$modificat === void 0 ? {} : _renderArgs$modificat;
412
- var mm = (0, _util2.getTagAlt)(feature, 'MM', 'Mm') || '';
413
- var ml = (0, _util2.getTagAlt)(feature, 'ML', 'Ml') || [];
414
- var probabilities = ml ? (typeof ml === 'string' ? ml.split(',').map(function (e) {
415
- return +e;
416
- }) : ml).map(function (e) {
417
- return e / 255;
418
- }) : (0, _util2.getTagAlt)(feature, 'MP', 'Mp').split('').map(function (s) {
419
- return s.charCodeAt(0) - 33;
420
- }).map(function (elt) {
421
- return Math.min(1, elt / 50);
422
- });
423
- var cigar = feature.get('CIGAR');
424
- var start = feature.get('start');
425
- var seq = feature.get('seq');
426
- var strand = feature.get('strand');
427
- var cigarOps = (0, _MismatchParser.parseCigar)(cigar);
428
- var modifications = (0, _MismatchParser.getModificationPositions)(mm, seq, strand); // probIndex applies across multiple modifications e.g.
429
-
430
- var probIndex = 0;
431
-
432
- for (var i = 0; i < modifications.length; i++) {
433
- var _modifications$i = modifications[i],
434
- type = _modifications$i.type,
435
- positions = _modifications$i.positions;
436
- var col = modificationTagMap[type] || 'black';
437
- var base = (0, _color.default)(col);
438
-
439
- var _iterator = _createForOfIteratorHelper((0, _MismatchParser.getNextRefPos)(cigarOps, positions)),
440
- _step;
441
-
442
- try {
443
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
444
- var readPos = _step.value;
445
- var r = start + readPos;
446
-
447
- var _bpSpanPx7 = (0, _util.bpSpanPx)(r, r + 1, region, bpPerPx),
448
- _bpSpanPx8 = (0, _slicedToArray2.default)(_bpSpanPx7, 2),
449
- leftPx = _bpSpanPx8[0],
450
- rightPx = _bpSpanPx8[1]; // give it a little boost of 0.1 to not make them fully
451
- // invisible to avoid confusion
452
-
453
-
454
- var prob = probabilities[probIndex];
455
- fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, prob && prob !== 1 ? base.alpha(prob + 0.1).hsl().string() : col);
456
- probIndex++;
457
- }
458
- } catch (err) {
459
- _iterator.e(err);
460
- } finally {
461
- _iterator.f();
369
+ PileupRenderer.prototype.colorByModifications = function (_a) {
370
+ var e_1, _b;
371
+ var ctx = _a.ctx, feat = _a.feat, region = _a.region, bpPerPx = _a.bpPerPx, renderArgs = _a.renderArgs, canvasWidth = _a.canvasWidth;
372
+ var feature = feat.feature, topPx = feat.topPx, heightPx = feat.heightPx;
373
+ var Color = renderArgs.Color, _c = renderArgs.modificationTagMap, modificationTagMap = _c === void 0 ? {} : _c;
374
+ var mm = (0, util_2.getTagAlt)(feature, 'MM', 'Mm') || '';
375
+ var ml = (0, util_2.getTagAlt)(feature, 'ML', 'Ml') || [];
376
+ var probabilities = ml
377
+ ? (typeof ml === 'string' ? ml.split(',').map(function (e) { return +e; }) : ml).map(function (e) { return e / 255; })
378
+ : (0, util_2.getTagAlt)(feature, 'MP', 'Mp')
379
+ .split('')
380
+ .map(function (s) { return s.charCodeAt(0) - 33; })
381
+ .map(function (elt) { return Math.min(1, elt / 50); });
382
+ var cigar = feature.get('CIGAR');
383
+ var start = feature.get('start');
384
+ var seq = feature.get('seq');
385
+ var strand = feature.get('strand');
386
+ var cigarOps = (0, MismatchParser_1.parseCigar)(cigar);
387
+ var modifications = (0, MismatchParser_1.getModificationPositions)(mm, seq, strand);
388
+ // probIndex applies across multiple modifications e.g.
389
+ var probIndex = 0;
390
+ for (var i = 0; i < modifications.length; i++) {
391
+ var _d = modifications[i], type = _d.type, positions = _d.positions;
392
+ var col = modificationTagMap[type] || 'black';
393
+ // @ts-ignore
394
+ var base = Color(col);
395
+ try {
396
+ for (var _e = (e_1 = void 0, __values((0, MismatchParser_1.getNextRefPos)(cigarOps, positions))), _f = _e.next(); !_f.done; _f = _e.next()) {
397
+ var readPos = _f.value;
398
+ var r = start + readPos;
399
+ var _g = __read((0, util_1.bpSpanPx)(r, r + 1, region, bpPerPx), 2), leftPx = _g[0], rightPx = _g[1];
400
+ // give it a little boost of 0.1 to not make them fully
401
+ // invisible to avoid confusion
402
+ var prob = probabilities[probIndex];
403
+ fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, prob && prob !== 1
404
+ ? base
405
+ .alpha(prob + 0.1)
406
+ .hsl()
407
+ .string()
408
+ : col);
409
+ probIndex++;
410
+ }
411
+ }
412
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
413
+ finally {
414
+ try {
415
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
416
+ }
417
+ finally { if (e_1) throw e_1.error; }
418
+ }
462
419
  }
463
- }
464
- } // Color by methylation is slightly modified version of color by
420
+ };
421
+ // Color by methylation is slightly modified version of color by
465
422
  // modifications that focuses on CpG sites, with non-methylated CpG colored
466
423
  // blue
467
-
468
- }, {
469
- key: "colorByMethylation",
470
- value: function colorByMethylation(_ref7) {
471
- var ctx = _ref7.ctx,
472
- feat = _ref7.feat,
473
- region = _ref7.region,
474
- bpPerPx = _ref7.bpPerPx,
475
- renderArgs = _ref7.renderArgs,
476
- canvasWidth = _ref7.canvasWidth;
477
- var regionSequence = renderArgs.regionSequence;
478
- var feature = feat.feature,
479
- topPx = feat.topPx,
480
- heightPx = feat.heightPx;
481
- var mm = (0, _util2.getTagAlt)(feature, 'MM', 'Mm') || '';
482
-
483
- if (!regionSequence) {
484
- throw new Error('region sequence required for methylation');
485
- }
486
-
487
- var cigar = feature.get('CIGAR');
488
- var fstart = feature.get('start');
489
- var fend = feature.get('end');
490
- var seq = feature.get('seq');
491
- var strand = feature.get('strand');
492
- var cigarOps = (0, _MismatchParser.parseCigar)(cigar);
493
- var methBins = new Array(region.end - region.start).fill(0);
494
- var modifications = (0, _MismatchParser.getModificationPositions)(mm, seq, strand);
495
-
496
- for (var i = 0; i < modifications.length; i++) {
497
- var _modifications$i2 = modifications[i],
498
- type = _modifications$i2.type,
499
- positions = _modifications$i2.positions;
500
-
501
- if (type === 'm' && positions) {
502
- var _iterator2 = _createForOfIteratorHelper((0, _MismatchParser.getNextRefPos)(cigarOps, positions)),
503
- _step2;
504
-
505
- try {
506
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
507
- var pos = _step2.value;
508
- var epos = pos + fstart - region.start;
509
-
510
- if (epos >= 0 && epos < methBins.length) {
511
- methBins[epos] = 1;
512
- }
513
- }
514
- } catch (err) {
515
- _iterator2.e(err);
516
- } finally {
517
- _iterator2.f();
518
- }
424
+ PileupRenderer.prototype.colorByMethylation = function (_a) {
425
+ var e_2, _b;
426
+ var ctx = _a.ctx, feat = _a.feat, region = _a.region, bpPerPx = _a.bpPerPx, renderArgs = _a.renderArgs, canvasWidth = _a.canvasWidth;
427
+ var regionSequence = renderArgs.regionSequence;
428
+ var feature = feat.feature, topPx = feat.topPx, heightPx = feat.heightPx;
429
+ var mm = (0, util_2.getTagAlt)(feature, 'MM', 'Mm') || '';
430
+ if (!regionSequence) {
431
+ throw new Error('region sequence required for methylation');
519
432
  }
520
- }
521
-
522
- for (var j = fstart; j < fend; j++) {
523
- var _i = j - region.start;
524
-
525
- if (_i >= 0 && _i < methBins.length) {
526
- var l1 = regionSequence[_i].toLowerCase();
527
-
528
- var l2 = regionSequence[_i + 1].toLowerCase(); // if we are zoomed out, display just a block over the cpg
529
-
530
-
531
- if (bpPerPx > 2) {
532
- if (l1 === 'c' && l2 === 'g') {
533
- var s = region.start + _i;
534
-
535
- var _bpSpanPx9 = (0, _util.bpSpanPx)(s, s + 2, region, bpPerPx),
536
- _bpSpanPx10 = (0, _slicedToArray2.default)(_bpSpanPx9, 2),
537
- leftPx = _bpSpanPx10[0],
538
- rightPx = _bpSpanPx10[1];
539
-
540
- fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, methBins[_i] || methBins[_i + 1] ? 'red' : 'blue');
541
- }
542
- } // if we are zoomed in, color the c inside the cpg
543
- else {
544
- // color
545
- if (l1 === 'c' && l2 === 'g') {
546
- var _s = region.start + _i;
547
-
548
- var _bpSpanPx11 = (0, _util.bpSpanPx)(_s, _s + 1, region, bpPerPx),
549
- _bpSpanPx12 = (0, _slicedToArray2.default)(_bpSpanPx11, 2),
550
- _leftPx = _bpSpanPx12[0],
551
- _rightPx = _bpSpanPx12[1];
552
-
553
- fillRect(ctx, _leftPx, topPx, _rightPx - _leftPx + 0.5, heightPx, canvasWidth, methBins[_i] ? 'red' : 'blue');
554
-
555
- var _bpSpanPx13 = (0, _util.bpSpanPx)(_s + 1, _s + 2, region, bpPerPx),
556
- _bpSpanPx14 = (0, _slicedToArray2.default)(_bpSpanPx13, 2),
557
- leftPx2 = _bpSpanPx14[0],
558
- rightPx2 = _bpSpanPx14[1];
559
-
560
- fillRect(ctx, leftPx2, topPx, rightPx2 - leftPx2 + 0.5, heightPx, canvasWidth, methBins[_i + 1] ? 'red' : 'blue');
433
+ var cigar = feature.get('CIGAR');
434
+ var fstart = feature.get('start');
435
+ var fend = feature.get('end');
436
+ var seq = feature.get('seq');
437
+ var strand = feature.get('strand');
438
+ var cigarOps = (0, MismatchParser_1.parseCigar)(cigar);
439
+ var methBins = new Array(region.end - region.start).fill(0);
440
+ var modifications = (0, MismatchParser_1.getModificationPositions)(mm, seq, strand);
441
+ for (var i = 0; i < modifications.length; i++) {
442
+ var _c = modifications[i], type = _c.type, positions = _c.positions;
443
+ if (type === 'm' && positions) {
444
+ try {
445
+ for (var _d = (e_2 = void 0, __values((0, MismatchParser_1.getNextRefPos)(cigarOps, positions))), _e = _d.next(); !_e.done; _e = _d.next()) {
446
+ var pos = _e.value;
447
+ var epos = pos + fstart - region.start;
448
+ if (epos >= 0 && epos < methBins.length) {
449
+ methBins[epos] = 1;
450
+ }
451
+ }
452
+ }
453
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
454
+ finally {
455
+ try {
456
+ if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
457
+ }
458
+ finally { if (e_2) throw e_2.error; }
459
+ }
561
460
  }
562
- }
563
461
  }
564
- }
565
- }
566
- }, {
567
- key: "drawRect",
568
- value: function drawRect(ctx, feat, props) {
569
- var regions = props.regions,
570
- bpPerPx = props.bpPerPx;
571
- var heightPx = feat.heightPx,
572
- topPx = feat.topPx,
573
- feature = feat.feature;
574
-
575
- var _regions = (0, _slicedToArray2.default)(regions, 1),
576
- region = _regions[0];
577
-
578
- var _bpSpanPx15 = (0, _util.bpSpanPx)(feature.get('start'), feature.get('end'), region, bpPerPx),
579
- _bpSpanPx16 = (0, _slicedToArray2.default)(_bpSpanPx15, 2),
580
- leftPx = _bpSpanPx16[0],
581
- rightPx = _bpSpanPx16[1];
582
-
583
- var flip = region.reversed ? -1 : 1;
584
- var strand = feature.get('strand') * flip;
585
-
586
- if (bpPerPx < 10) {
587
- if (strand === -1) {
588
- ctx.beginPath();
589
- ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
590
- ctx.lineTo(leftPx, topPx + heightPx);
591
- ctx.lineTo(rightPx, topPx + heightPx);
592
- ctx.lineTo(rightPx, topPx);
593
- ctx.lineTo(leftPx, topPx);
594
- ctx.closePath();
595
- ctx.fill();
596
- } else {
597
- ctx.beginPath();
598
- ctx.moveTo(leftPx, topPx);
599
- ctx.lineTo(leftPx, topPx + heightPx);
600
- ctx.lineTo(rightPx, topPx + heightPx);
601
- ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
602
- ctx.lineTo(rightPx, topPx);
603
- ctx.closePath();
604
- ctx.fill();
462
+ for (var j = fstart; j < fend; j++) {
463
+ var i = j - region.start;
464
+ if (i >= 0 && i < methBins.length) {
465
+ var l1 = regionSequence[i].toLowerCase();
466
+ var l2 = regionSequence[i + 1].toLowerCase();
467
+ // if we are zoomed out, display just a block over the cpg
468
+ if (bpPerPx > 2) {
469
+ if (l1 === 'c' && l2 === 'g') {
470
+ var s = region.start + i;
471
+ var _f = __read((0, util_1.bpSpanPx)(s, s + 2, region, bpPerPx), 2), leftPx = _f[0], rightPx = _f[1];
472
+ fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, methBins[i] || methBins[i + 1] ? 'red' : 'blue');
473
+ }
474
+ }
475
+ // if we are zoomed in, color the c inside the cpg
476
+ else {
477
+ // color
478
+ if (l1 === 'c' && l2 === 'g') {
479
+ var s = region.start + i;
480
+ var _g = __read((0, util_1.bpSpanPx)(s, s + 1, region, bpPerPx), 2), leftPx = _g[0], rightPx = _g[1];
481
+ fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, methBins[i] ? 'red' : 'blue');
482
+ var _h = __read((0, util_1.bpSpanPx)(s + 1, s + 2, region, bpPerPx), 2), leftPx2 = _h[0], rightPx2 = _h[1];
483
+ fillRect(ctx, leftPx2, topPx, rightPx2 - leftPx2 + 0.5, heightPx, canvasWidth, methBins[i + 1] ? 'red' : 'blue');
484
+ }
485
+ }
486
+ }
605
487
  }
606
- } else {
607
- ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
608
- }
609
- }
610
- }, {
611
- key: "drawAlignmentRect",
612
- value: function drawAlignmentRect(_ref8) {
613
- var ctx = _ref8.ctx,
614
- feat = _ref8.feat,
615
- renderArgs = _ref8.renderArgs,
616
- colorForBase = _ref8.colorForBase,
617
- contrastForBase = _ref8.contrastForBase,
618
- charWidth = _ref8.charWidth,
619
- charHeight = _ref8.charHeight,
620
- defaultColor = _ref8.defaultColor,
621
- canvasWidth = _ref8.canvasWidth;
622
- var config = renderArgs.config,
623
- bpPerPx = renderArgs.bpPerPx,
624
- regions = renderArgs.regions,
625
- colorBy = renderArgs.colorBy,
626
- _renderArgs$colorTagM = renderArgs.colorTagMap,
627
- colorTagMap = _renderArgs$colorTagM === void 0 ? {} : _renderArgs$colorTagM;
628
-
629
- var _ref9 = colorBy || {},
630
- _ref9$tag = _ref9.tag,
631
- tag = _ref9$tag === void 0 ? '' : _ref9$tag,
632
- _ref9$type = _ref9.type,
633
- colorType = _ref9$type === void 0 ? '' : _ref9$type;
634
-
635
- var feature = feat.feature;
636
- var region = regions[0]; // first pass for simple color changes that change the color of the
637
- // alignment
638
-
639
- switch (colorType) {
640
- case 'insertSize':
641
- ctx.fillStyle = this.colorByInsertSize(feature, config);
642
- break;
643
-
644
- case 'strand':
645
- ctx.fillStyle = feature.get('strand') === -1 ? '#8F8FD8' : '#EC8B8B';
646
- break;
647
-
648
- case 'mappingQuality':
649
- ctx.fillStyle = "hsl(".concat(feature.get('mq'), ",50%,50%)");
650
- break;
651
-
652
- case 'pairOrientation':
653
- ctx.fillStyle = this.colorByOrientation(feature, config);
654
- break;
655
-
656
- case 'stranded':
657
- ctx.fillStyle = alignmentColoring[this.colorByStranded(feature, config)];
658
- break;
659
-
660
- case 'xs':
661
- case 'tag':
662
- {
663
- var tags = feature.get('tags');
664
- var val = tags ? tags[tag] : feature.get(tag); // special for for XS/TS tag
665
-
666
- if (tag === 'XS' || tag === 'TS') {
667
- var map = {
668
- '-': 'color_rev_strand',
669
- '+': 'color_fwd_strand'
670
- };
671
- ctx.fillStyle = alignmentColoring[map[val] || 'color_nostrand'];
672
- } // lower case 'ts' from minimap2 is flipped from xs
673
-
674
-
675
- if (tag === 'ts') {
676
- var _map = {
677
- '-': feature.get('strand') === -1 ? 'color_fwd_strand' : 'color_rev_strand',
678
- '+': feature.get('strand') === -1 ? 'color_rev_strand' : 'color_fwd_strand'
679
- };
680
- ctx.fillStyle = alignmentColoring[_map[val] || 'color_nostrand'];
681
- } // tag is not one of the autofilled tags, has color-value pairs from
682
- // fetchValues
683
- else {
684
- var foundValue = colorTagMap[val];
685
- ctx.fillStyle = foundValue || alignmentColoring['color_nostrand'];
488
+ };
489
+ PileupRenderer.prototype.drawRect = function (ctx, feat, props) {
490
+ var regions = props.regions, bpPerPx = props.bpPerPx;
491
+ var heightPx = feat.heightPx, topPx = feat.topPx, feature = feat.feature;
492
+ var _a = __read(regions, 1), region = _a[0];
493
+ var _b = __read((0, util_1.bpSpanPx)(feature.get('start'), feature.get('end'), region, bpPerPx), 2), leftPx = _b[0], rightPx = _b[1];
494
+ var flip = region.reversed ? -1 : 1;
495
+ var strand = feature.get('strand') * flip;
496
+ if (bpPerPx < 10) {
497
+ if (strand === -1) {
498
+ ctx.beginPath();
499
+ ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
500
+ ctx.lineTo(leftPx, topPx + heightPx);
501
+ ctx.lineTo(rightPx, topPx + heightPx);
502
+ ctx.lineTo(rightPx, topPx);
503
+ ctx.lineTo(leftPx, topPx);
504
+ ctx.closePath();
505
+ ctx.fill();
686
506
  }
687
-
688
- break;
689
- }
690
-
691
- case 'insertSizeAndPairOrientation':
692
- break;
693
-
694
- case 'modifications':
695
- case 'methylation':
696
- // this coloring is similar to igv.js, and is helpful to color negative
697
- // strand reads differently because their c-g will be flipped (e.g. g-c
698
- // read right to left)
699
- if (feature.get('flags') & 16) {
700
- ctx.fillStyle = '#c8dcc8';
701
- } else {
702
- ctx.fillStyle = '#c8c8c8';
703
- }
704
-
705
- break;
706
-
707
- case 'normal':
708
- default:
709
- if (defaultColor) {
710
- // avoid a readConfObject call here
711
- ctx.fillStyle = '#c8c8c8';
712
- } else {
713
- ctx.fillStyle = (0, _configuration.readConfObject)(config, 'color', {
714
- feature: feature
715
- });
716
- }
717
-
718
- break;
719
- }
720
-
721
- this.drawRect(ctx, feat, renderArgs); // second pass for color types that render per-base things that go over the
722
- // existing drawing
723
-
724
- switch (colorType) {
725
- case 'perBaseQuality':
726
- this.colorByPerBaseQuality({
727
- ctx: ctx,
728
- feat: feat,
729
- region: region,
730
- bpPerPx: bpPerPx,
731
- canvasWidth: canvasWidth
732
- });
733
- break;
734
-
735
- case 'perBaseLettering':
736
- this.colorByPerBaseLettering({
737
- ctx: ctx,
738
- feat: feat,
739
- region: region,
740
- bpPerPx: bpPerPx,
741
- colorForBase: colorForBase,
742
- contrastForBase: contrastForBase,
743
- charWidth: charWidth,
744
- charHeight: charHeight,
745
- canvasWidth: canvasWidth
746
- });
747
- break;
748
-
749
- case 'modifications':
750
- this.colorByModifications({
751
- ctx: ctx,
752
- feat: feat,
753
- region: region,
754
- bpPerPx: bpPerPx,
755
- renderArgs: renderArgs,
756
- canvasWidth: canvasWidth
757
- });
758
- break;
759
-
760
- case 'methylation':
761
- this.colorByMethylation({
762
- ctx: ctx,
763
- feat: feat,
764
- region: region,
765
- bpPerPx: bpPerPx,
766
- renderArgs: renderArgs,
767
- canvasWidth: canvasWidth
768
- });
769
- break;
770
- }
771
- }
772
- }, {
773
- key: "drawMismatches",
774
- value: function drawMismatches(_ref10) {
775
- var ctx = _ref10.ctx,
776
- feat = _ref10.feat,
777
- renderArgs = _ref10.renderArgs,
778
- minSubfeatureWidth = _ref10.minSubfeatureWidth,
779
- largeInsertionIndicatorScale = _ref10.largeInsertionIndicatorScale,
780
- mismatchAlpha = _ref10.mismatchAlpha,
781
- charWidth = _ref10.charWidth,
782
- charHeight = _ref10.charHeight,
783
- colorForBase = _ref10.colorForBase,
784
- contrastForBase = _ref10.contrastForBase,
785
- canvasWidth = _ref10.canvasWidth,
786
- _ref10$drawSNPs = _ref10.drawSNPs,
787
- drawSNPs = _ref10$drawSNPs === void 0 ? true : _ref10$drawSNPs,
788
- _ref10$drawIndels = _ref10.drawIndels,
789
- drawIndels = _ref10$drawIndels === void 0 ? true : _ref10$drawIndels;
790
- var bpPerPx = renderArgs.bpPerPx,
791
- regions = renderArgs.regions;
792
- var heightPx = feat.heightPx,
793
- topPx = feat.topPx,
794
- feature = feat.feature;
795
-
796
- var _regions2 = (0, _slicedToArray2.default)(regions, 1),
797
- region = _regions2[0];
798
-
799
- var start = feature.get('start');
800
- var pxPerBp = Math.min(1 / bpPerPx, 2);
801
- var w = Math.max(minSubfeatureWidth, pxPerBp);
802
- var mismatches = feature.get('mismatches');
803
- var heightLim = charHeight - 2; // extraHorizontallyFlippedOffset is used to draw interbase items, which
804
- // are located to the left when forward and right when reversed
805
-
806
- var extraHorizontallyFlippedOffset = region.reversed ? 1 / bpPerPx + 1 : -1; // two pass rendering: first pass, draw all the mismatches except wide
807
- // insertion markers
808
-
809
- for (var i = 0; i < mismatches.length; i += 1) {
810
- var mismatch = mismatches[i];
811
- var mstart = start + mismatch.start;
812
- var mlen = mismatch.length;
813
- var mbase = mismatch.base;
814
-
815
- var _bpSpanPx17 = (0, _util.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx),
816
- _bpSpanPx18 = (0, _slicedToArray2.default)(_bpSpanPx17, 2),
817
- leftPx = _bpSpanPx18[0],
818
- rightPx = _bpSpanPx18[1];
819
-
820
- var widthPx = Math.max(minSubfeatureWidth, Math.abs(leftPx - rightPx));
821
-
822
- if (mismatch.type === 'mismatch' && drawSNPs) {
823
- var baseColor = colorForBase[mismatch.base] || '#888';
824
- fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth, !mismatchAlpha ? baseColor : mismatch.qual !== undefined ? (0, _color.default)(baseColor).alpha(Math.min(1, mismatch.qual / 50)).hsl().string() : baseColor);
825
-
826
- if (widthPx >= charWidth && heightPx >= heightLim) {
827
- // normal SNP coloring
828
- var contrastColor = contrastForBase[mismatch.base] || 'black';
829
- ctx.fillStyle = !mismatchAlpha ? contrastColor : mismatch.qual !== undefined ? (0, _color.default)(contrastColor).alpha(Math.min(1, mismatch.qual / 50)).hsl().string() : contrastColor;
830
- ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
831
- }
832
- } else if (mismatch.type === 'deletion' && drawIndels) {
833
- fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth, colorForBase.deletion);
834
- var txt = "".concat(mismatch.length);
835
- var rwidth = (0, _util.measureText)(txt, 10);
836
-
837
- if (widthPx >= rwidth && heightPx >= heightLim) {
838
- ctx.fillStyle = contrastForBase.deletion;
839
- ctx.fillText(txt, (leftPx + rightPx) / 2 - rwidth / 2, topPx + heightPx);
840
- }
841
- } else if (mismatch.type === 'insertion' && drawIndels) {
842
- ctx.fillStyle = 'purple';
843
- var pos = leftPx + extraHorizontallyFlippedOffset;
844
- var len = +mismatch.base || mismatch.length;
845
- var insW = Math.max(minSubfeatureWidth / 2, Math.min(1.2, 1 / bpPerPx));
846
-
847
- if (len < 10) {
848
- fillRect(ctx, pos, topPx, insW, heightPx, canvasWidth, 'purple');
849
-
850
- if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
851
- fillRect(ctx, pos - insW, topPx, insW * 3, 1, canvasWidth);
852
- fillRect(ctx, pos - insW, topPx + heightPx - 1, insW * 3, 1, canvasWidth);
853
- ctx.fillText("(".concat(mismatch.base, ")"), pos + 3, topPx + heightPx);
507
+ else {
508
+ ctx.beginPath();
509
+ ctx.moveTo(leftPx, topPx);
510
+ ctx.lineTo(leftPx, topPx + heightPx);
511
+ ctx.lineTo(rightPx, topPx + heightPx);
512
+ ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
513
+ ctx.lineTo(rightPx, topPx);
514
+ ctx.closePath();
515
+ ctx.fill();
854
516
  }
855
- }
856
- } else if (mismatch.type === 'hardclip' || mismatch.type === 'softclip') {
857
- var _pos = leftPx + extraHorizontallyFlippedOffset;
858
-
859
- fillRect(ctx, _pos, topPx, w, heightPx, canvasWidth, mismatch.type === 'hardclip' ? 'red' : 'blue');
860
-
861
- if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
862
- fillRect(ctx, _pos - w, topPx, w * 3, 1, canvasWidth);
863
- fillRect(ctx, _pos - w, topPx + heightPx - 1, w * 3, 1, canvasWidth);
864
- ctx.fillText("(".concat(mismatch.base, ")"), _pos + 3, topPx + heightPx);
865
- }
866
- } else if (mismatch.type === 'skip') {
867
- // fix to avoid bad rendering note that this was also related to chrome
868
- // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1131528
869
- // also affected firefox ref #1236 #2750
870
- if (leftPx + widthPx > 0) {
871
- // make small exons more visible when zoomed far out
872
- var adjustPx = widthPx - (bpPerPx > 10 ? 1.5 : 0);
873
- ctx.clearRect(leftPx, topPx, adjustPx, heightPx);
874
- fillRect(ctx, Math.max(0, leftPx), topPx + heightPx / 2 - 1, adjustPx + (leftPx < 0 ? leftPx : 0), 2, canvasWidth, '#333');
875
- }
876
517
  }
877
- } // second pass, draw wide insertion markers on top
878
-
879
-
880
- if (drawIndels) {
881
- for (var _i2 = 0; _i2 < mismatches.length; _i2 += 1) {
882
- var _mismatch = mismatches[_i2];
883
-
884
- var _mstart = start + _mismatch.start;
885
-
886
- var _mlen = _mismatch.length;
887
-
888
- var _bpSpanPx19 = (0, _util.bpSpanPx)(_mstart, _mstart + _mlen, region, bpPerPx),
889
- _bpSpanPx20 = (0, _slicedToArray2.default)(_bpSpanPx19, 1),
890
- _leftPx2 = _bpSpanPx20[0];
891
-
892
- var _len2 = +_mismatch.base || _mismatch.length;
893
-
894
- var _txt = "".concat(_len2);
895
-
896
- if (_mismatch.type === 'insertion' && _len2 >= 10) {
897
- if (bpPerPx > largeInsertionIndicatorScale) {
898
- fillRect(ctx, _leftPx2 - 1, topPx, 2, heightPx, canvasWidth, 'purple');
899
- } else if (heightPx > charHeight) {
900
- var _rwidth = (0, _util.measureText)(_txt);
901
-
902
- var padding = 5;
903
- fillRect(ctx, _leftPx2 - _rwidth / 2 - padding, topPx, _rwidth + 2 * padding, heightPx, canvasWidth, 'purple');
904
- ctx.fillStyle = 'white';
905
- ctx.fillText(_txt, _leftPx2 - _rwidth / 2, topPx + heightPx);
906
- } else {
907
- var _padding = 2;
908
- fillRect(ctx, _leftPx2 - _padding, topPx, 2 * _padding, heightPx, canvasWidth, 'purple');
518
+ else {
519
+ ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
520
+ }
521
+ };
522
+ PileupRenderer.prototype.drawAlignmentRect = function (_a) {
523
+ var ctx = _a.ctx, feat = _a.feat, renderArgs = _a.renderArgs, colorForBase = _a.colorForBase, contrastForBase = _a.contrastForBase, charWidth = _a.charWidth, charHeight = _a.charHeight, defaultColor = _a.defaultColor, canvasWidth = _a.canvasWidth;
524
+ var config = renderArgs.config, bpPerPx = renderArgs.bpPerPx, regions = renderArgs.regions, colorBy = renderArgs.colorBy, _b = renderArgs.colorTagMap, colorTagMap = _b === void 0 ? {} : _b;
525
+ var _c = colorBy || {}, _d = _c.tag, tag = _d === void 0 ? '' : _d, _e = _c.type, colorType = _e === void 0 ? '' : _e;
526
+ var feature = feat.feature;
527
+ var region = regions[0];
528
+ // first pass for simple color changes that change the color of the
529
+ // alignment
530
+ switch (colorType) {
531
+ case 'insertSize':
532
+ ctx.fillStyle = this.colorByInsertSize(feature, config);
533
+ break;
534
+ case 'strand':
535
+ ctx.fillStyle = feature.get('strand') === -1 ? '#8F8FD8' : '#EC8B8B';
536
+ break;
537
+ case 'mappingQuality':
538
+ ctx.fillStyle = "hsl(".concat(feature.get('mq'), ",50%,50%)");
539
+ break;
540
+ case 'pairOrientation':
541
+ ctx.fillStyle = this.colorByOrientation(feature, config);
542
+ break;
543
+ case 'stranded':
544
+ ctx.fillStyle = alignmentColoring[this.colorByStranded(feature, config)];
545
+ break;
546
+ case 'xs':
547
+ case 'tag': {
548
+ var tags = feature.get('tags');
549
+ var val = tags ? tags[tag] : feature.get(tag);
550
+ // special for for XS/TS tag
551
+ if (tag === 'XS' || tag === 'TS') {
552
+ var map = {
553
+ '-': 'color_rev_strand',
554
+ '+': 'color_fwd_strand',
555
+ };
556
+ ctx.fillStyle = alignmentColoring[map[val] || 'color_nostrand'];
557
+ }
558
+ // lower case 'ts' from minimap2 is flipped from xs
559
+ if (tag === 'ts') {
560
+ var map = {
561
+ '-': feature.get('strand') === -1
562
+ ? 'color_fwd_strand'
563
+ : 'color_rev_strand',
564
+ '+': feature.get('strand') === -1
565
+ ? 'color_rev_strand'
566
+ : 'color_fwd_strand',
567
+ };
568
+ ctx.fillStyle = alignmentColoring[map[val] || 'color_nostrand'];
569
+ }
570
+ // tag is not one of the autofilled tags, has color-value pairs from
571
+ // fetchValues
572
+ else {
573
+ var foundValue = colorTagMap[val];
574
+ ctx.fillStyle = foundValue || alignmentColoring['color_nostrand'];
575
+ }
576
+ break;
909
577
  }
910
- }
578
+ case 'insertSizeAndPairOrientation':
579
+ break;
580
+ case 'modifications':
581
+ case 'methylation':
582
+ // this coloring is similar to igv.js, and is helpful to color negative
583
+ // strand reads differently because their c-g will be flipped (e.g. g-c
584
+ // read right to left)
585
+ if (feature.get('flags') & 16) {
586
+ ctx.fillStyle = '#c8dcc8';
587
+ }
588
+ else {
589
+ ctx.fillStyle = '#c8c8c8';
590
+ }
591
+ break;
592
+ case 'normal':
593
+ default:
594
+ if (defaultColor) {
595
+ // avoid a readConfObject call here
596
+ ctx.fillStyle = '#c8c8c8';
597
+ }
598
+ else {
599
+ ctx.fillStyle = (0, configuration_1.readConfObject)(config, 'color', { feature: feature });
600
+ }
601
+ break;
911
602
  }
912
- }
913
- }
914
- }, {
915
- key: "drawSoftClipping",
916
- value: function drawSoftClipping(_ref11) {
917
- var ctx = _ref11.ctx,
918
- feat = _ref11.feat,
919
- renderArgs = _ref11.renderArgs,
920
- config = _ref11.config,
921
- theme = _ref11.theme,
922
- canvasWidth = _ref11.canvasWidth;
923
- var feature = feat.feature,
924
- topPx = feat.topPx,
925
- heightPx = feat.heightPx;
926
- var regions = renderArgs.regions,
927
- bpPerPx = renderArgs.bpPerPx;
928
-
929
- var _regions3 = (0, _slicedToArray2.default)(regions, 1),
930
- region = _regions3[0];
931
-
932
- var minFeatWidth = (0, _configuration.readConfObject)(config, 'minSubfeatureWidth');
933
- var mismatches = feature.get('mismatches');
934
- var seq = feature.get('seq');
935
-
936
- var _this$getCharWidthHei = this.getCharWidthHeight(ctx),
937
- charWidth = _this$getCharWidthHei.charWidth,
938
- charHeight = _this$getCharWidthHei.charHeight;
939
-
940
- var colorForBase = {
941
- A: theme.palette.bases.A.main,
942
- C: theme.palette.bases.C.main,
943
- G: theme.palette.bases.G.main,
944
- T: theme.palette.bases.T.main,
945
- deletion: '#808080' // gray
946
-
947
- }; // Display all bases softclipped off in lightened colors
948
-
949
- if (seq) {
950
- mismatches.filter(function (mismatch) {
951
- return mismatch.type === 'softclip';
952
- }).forEach(function (mismatch) {
953
- var softClipLength = mismatch.cliplen || 0;
954
- var s = feature.get('start');
955
- var softClipStart = mismatch.start === 0 ? s - softClipLength : s + mismatch.start;
956
-
957
- for (var k = 0; k < softClipLength; k += 1) {
958
- var base = seq.charAt(k + mismatch.start); // If softclip length+start is longer than sequence, no need to
959
- // continue showing base
960
-
961
- if (!base) {
962
- return;
603
+ this.drawRect(ctx, feat, renderArgs);
604
+ // second pass for color types that render per-base things that go over the
605
+ // existing drawing
606
+ switch (colorType) {
607
+ case 'perBaseQuality':
608
+ this.colorByPerBaseQuality({
609
+ ctx: ctx,
610
+ feat: feat,
611
+ region: region,
612
+ bpPerPx: bpPerPx,
613
+ canvasWidth: canvasWidth,
614
+ });
615
+ break;
616
+ case 'perBaseLettering':
617
+ this.colorByPerBaseLettering({
618
+ ctx: ctx,
619
+ feat: feat,
620
+ region: region,
621
+ bpPerPx: bpPerPx,
622
+ colorForBase: colorForBase,
623
+ contrastForBase: contrastForBase,
624
+ charWidth: charWidth,
625
+ charHeight: charHeight,
626
+ canvasWidth: canvasWidth,
627
+ });
628
+ break;
629
+ case 'modifications':
630
+ this.colorByModifications({
631
+ ctx: ctx,
632
+ feat: feat,
633
+ region: region,
634
+ bpPerPx: bpPerPx,
635
+ renderArgs: renderArgs,
636
+ canvasWidth: canvasWidth,
637
+ });
638
+ break;
639
+ case 'methylation':
640
+ this.colorByMethylation({
641
+ ctx: ctx,
642
+ feat: feat,
643
+ region: region,
644
+ bpPerPx: bpPerPx,
645
+ renderArgs: renderArgs,
646
+ canvasWidth: canvasWidth,
647
+ });
648
+ break;
649
+ }
650
+ };
651
+ PileupRenderer.prototype.drawMismatches = function (_a) {
652
+ var ctx = _a.ctx, feat = _a.feat, renderArgs = _a.renderArgs, minSubfeatureWidth = _a.minSubfeatureWidth, largeInsertionIndicatorScale = _a.largeInsertionIndicatorScale, mismatchAlpha = _a.mismatchAlpha, charWidth = _a.charWidth, charHeight = _a.charHeight, colorForBase = _a.colorForBase, contrastForBase = _a.contrastForBase, canvasWidth = _a.canvasWidth, drawSNPsMuted = _a.drawSNPsMuted, _b = _a.drawIndels, drawIndels = _b === void 0 ? true : _b;
653
+ var Color = renderArgs.Color, bpPerPx = renderArgs.bpPerPx, regions = renderArgs.regions;
654
+ var heightPx = feat.heightPx, topPx = feat.topPx, feature = feat.feature;
655
+ var _c = __read(regions, 1), region = _c[0];
656
+ var start = feature.get('start');
657
+ var pxPerBp = Math.min(1 / bpPerPx, 2);
658
+ var w = Math.max(minSubfeatureWidth, pxPerBp);
659
+ var mismatches = feature.get('mismatches');
660
+ var heightLim = charHeight - 2;
661
+ // extraHorizontallyFlippedOffset is used to draw interbase items, which
662
+ // are located to the left when forward and right when reversed
663
+ var extraHorizontallyFlippedOffset = region.reversed
664
+ ? 1 / bpPerPx + 1
665
+ : -1;
666
+ // two pass rendering: first pass, draw all the mismatches except wide
667
+ // insertion markers
668
+ for (var i = 0; i < mismatches.length; i += 1) {
669
+ var mismatch = mismatches[i];
670
+ var mstart = start + mismatch.start;
671
+ var mlen = mismatch.length;
672
+ var mbase = mismatch.base;
673
+ var _d = __read((0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx), 2), leftPx = _d[0], rightPx = _d[1];
674
+ var widthPx = Math.max(minSubfeatureWidth, Math.abs(leftPx - rightPx));
675
+ if (mismatch.type === 'mismatch') {
676
+ if (!drawSNPsMuted) {
677
+ var baseColor = colorForBase[mismatch.base] || '#888';
678
+ fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth, !mismatchAlpha
679
+ ? baseColor
680
+ : mismatch.qual !== undefined
681
+ ? // @ts-ignore
682
+ Color(baseColor)
683
+ .alpha(Math.min(1, mismatch.qual / 50))
684
+ .hsl()
685
+ .string()
686
+ : baseColor);
687
+ }
688
+ if (widthPx >= charWidth && heightPx >= heightLim) {
689
+ // normal SNP coloring
690
+ var contrastColor = drawSNPsMuted
691
+ ? 'black'
692
+ : contrastForBase[mismatch.base] || 'black';
693
+ ctx.fillStyle = !mismatchAlpha
694
+ ? contrastColor
695
+ : mismatch.qual !== undefined
696
+ ? // @ts-ignore
697
+ Color(contrastColor)
698
+ .alpha(Math.min(1, mismatch.qual / 50))
699
+ .hsl()
700
+ .string()
701
+ : contrastColor;
702
+ ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
703
+ }
963
704
  }
964
-
965
- var _bpSpanPx21 = (0, _util.bpSpanPx)(softClipStart + k, softClipStart + k + 1, region, bpPerPx),
966
- _bpSpanPx22 = (0, _slicedToArray2.default)(_bpSpanPx21, 2),
967
- softClipLeftPx = _bpSpanPx22[0],
968
- softClipRightPx = _bpSpanPx22[1];
969
-
970
- var softClipWidthPx = Math.max(minFeatWidth, Math.abs(softClipLeftPx - softClipRightPx)); // Black accounts for IUPAC ambiguity code bases such as N that
971
- // show in soft clipping
972
-
973
- var baseColor = colorForBase[base] || '#000000';
974
- ctx.fillStyle = baseColor;
975
- fillRect(ctx, softClipLeftPx, topPx, softClipWidthPx, heightPx, canvasWidth);
976
-
977
- if (softClipWidthPx >= charWidth && heightPx >= charHeight - 5) {
978
- ctx.fillStyle = theme.palette.getContrastText(baseColor);
979
- ctx.fillText(base, softClipLeftPx + (softClipWidthPx - charWidth) / 2 + 1, topPx + heightPx);
705
+ else if (mismatch.type === 'deletion' && drawIndels) {
706
+ fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth, colorForBase.deletion);
707
+ var txt = "".concat(mismatch.length);
708
+ var rwidth = (0, util_1.measureText)(txt, 10);
709
+ if (widthPx >= rwidth && heightPx >= heightLim) {
710
+ ctx.fillStyle = contrastForBase.deletion;
711
+ ctx.fillText(txt, (leftPx + rightPx) / 2 - rwidth / 2, topPx + heightPx);
712
+ }
713
+ }
714
+ else if (mismatch.type === 'insertion' && drawIndels) {
715
+ ctx.fillStyle = 'purple';
716
+ var pos = leftPx + extraHorizontallyFlippedOffset;
717
+ var len = +mismatch.base || mismatch.length;
718
+ var insW = Math.max(minSubfeatureWidth / 2, Math.min(1.2, 1 / bpPerPx));
719
+ if (len < 10) {
720
+ fillRect(ctx, pos, topPx, insW, heightPx, canvasWidth, 'purple');
721
+ if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
722
+ fillRect(ctx, pos - insW, topPx, insW * 3, 1, canvasWidth);
723
+ fillRect(ctx, pos - insW, topPx + heightPx - 1, insW * 3, 1, canvasWidth);
724
+ ctx.fillText("(".concat(mismatch.base, ")"), pos + 3, topPx + heightPx);
725
+ }
726
+ }
727
+ }
728
+ else if (mismatch.type === 'hardclip' || mismatch.type === 'softclip') {
729
+ var pos = leftPx + extraHorizontallyFlippedOffset;
730
+ fillRect(ctx, pos, topPx, w, heightPx, canvasWidth, mismatch.type === 'hardclip' ? 'red' : 'blue');
731
+ if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
732
+ fillRect(ctx, pos - w, topPx, w * 3, 1, canvasWidth);
733
+ fillRect(ctx, pos - w, topPx + heightPx - 1, w * 3, 1, canvasWidth);
734
+ ctx.fillText("(".concat(mismatch.base, ")"), pos + 3, topPx + heightPx);
735
+ }
736
+ }
737
+ else if (mismatch.type === 'skip') {
738
+ // fix to avoid bad rendering note that this was also related to chrome
739
+ // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1131528
740
+ // also affected firefox ref #1236 #2750
741
+ if (leftPx + widthPx > 0) {
742
+ // make small exons more visible when zoomed far out
743
+ var adjustPx = widthPx - (bpPerPx > 10 ? 1.5 : 0);
744
+ ctx.clearRect(leftPx, topPx, adjustPx, heightPx);
745
+ fillRect(ctx, Math.max(0, leftPx), topPx + heightPx / 2 - 1, adjustPx + (leftPx < 0 ? leftPx : 0), 2, canvasWidth, '#333');
746
+ }
980
747
  }
981
- }
982
- });
983
- }
984
- }
985
- }, {
986
- key: "makeImageData",
987
- value: function makeImageData(_ref12) {
988
- var ctx = _ref12.ctx,
989
- layoutRecords = _ref12.layoutRecords,
990
- canvasWidth = _ref12.canvasWidth,
991
- renderArgs = _ref12.renderArgs;
992
- var layout = renderArgs.layout,
993
- config = renderArgs.config,
994
- showSoftClip = renderArgs.showSoftClip,
995
- colorBy = renderArgs.colorBy,
996
- configTheme = renderArgs.theme;
997
- var mismatchAlpha = (0, _configuration.readConfObject)(config, 'mismatchAlpha');
998
- var minSubfeatureWidth = (0, _configuration.readConfObject)(config, 'minSubfeatureWidth');
999
- var largeInsertionIndicatorScale = (0, _configuration.readConfObject)(config, 'largeInsertionIndicatorScale');
1000
- var defaultColor = (0, _configuration.readConfObject)(config, 'color') === '#f0f';
1001
- var theme = (0, _ui.createJBrowseTheme)(configTheme);
1002
- var colorForBase = getColorBaseMap(theme);
1003
- var contrastForBase = getContrastBaseMap(theme);
1004
-
1005
- if (!layout) {
1006
- throw new Error("layout required");
1007
- }
1008
-
1009
- if (!layout.addRect) {
1010
- throw new Error('invalid layout object');
1011
- }
1012
-
1013
- ctx.font = 'bold 10px Courier New,monospace';
1014
-
1015
- var _this$getCharWidthHei2 = this.getCharWidthHeight(ctx),
1016
- charWidth = _this$getCharWidthHei2.charWidth,
1017
- charHeight = _this$getCharWidthHei2.charHeight;
1018
-
1019
- var drawSNPs = shouldDrawSNPs(colorBy === null || colorBy === void 0 ? void 0 : colorBy.type);
1020
- var drawIndels = shouldDrawIndels(colorBy === null || colorBy === void 0 ? void 0 : colorBy.type);
1021
-
1022
- for (var i = 0; i < layoutRecords.length; i++) {
1023
- var feat = layoutRecords[i];
1024
-
1025
- if (feat === null) {
1026
- continue;
1027
- }
1028
-
1029
- this.drawAlignmentRect({
1030
- ctx: ctx,
1031
- feat: feat,
1032
- renderArgs: renderArgs,
1033
- defaultColor: defaultColor,
1034
- colorForBase: colorForBase,
1035
- contrastForBase: contrastForBase,
1036
- charWidth: charWidth,
1037
- charHeight: charHeight,
1038
- canvasWidth: canvasWidth
1039
- });
1040
- this.drawMismatches({
1041
- ctx: ctx,
1042
- feat: feat,
1043
- renderArgs: renderArgs,
1044
- mismatchAlpha: mismatchAlpha,
1045
- drawSNPs: drawSNPs,
1046
- drawIndels: drawIndels,
1047
- largeInsertionIndicatorScale: largeInsertionIndicatorScale,
1048
- minSubfeatureWidth: minSubfeatureWidth,
1049
- charWidth: charWidth,
1050
- charHeight: charHeight,
1051
- colorForBase: colorForBase,
1052
- contrastForBase: contrastForBase,
1053
- canvasWidth: canvasWidth
1054
- });
1055
-
1056
- if (showSoftClip) {
1057
- this.drawSoftClipping({
1058
- ctx: ctx,
1059
- feat: feat,
1060
- renderArgs: renderArgs,
1061
- config: config,
1062
- theme: theme,
1063
- canvasWidth: canvasWidth
1064
- });
1065
748
  }
1066
- }
1067
- } // we perform a full layout before render as a separate method because the
1068
- // layout determines the height of the canvas that we use to render
1069
-
1070
- }, {
1071
- key: "layoutFeats",
1072
- value: function layoutFeats(props) {
1073
- var _this2 = this;
1074
-
1075
- var layout = props.layout,
1076
- features = props.features,
1077
- sortedBy = props.sortedBy,
1078
- config = props.config,
1079
- bpPerPx = props.bpPerPx,
1080
- showSoftClip = props.showSoftClip,
1081
- regions = props.regions;
1082
-
1083
- var _regions4 = (0, _slicedToArray2.default)(regions, 1),
1084
- region = _regions4[0];
1085
-
1086
- if (!layout) {
1087
- throw new Error("layout required");
1088
- }
1089
-
1090
- if (!layout.addRect) {
1091
- throw new Error('invalid layout object');
1092
- }
1093
-
1094
- var featureMap = sortedBy !== null && sortedBy !== void 0 && sortedBy.type && region.start === sortedBy.pos ? (0, _sortUtil.sortFeature)(features, sortedBy) : features;
1095
- var heightPx = (0, _configuration.readConfObject)(config, 'height');
1096
- var displayMode = (0, _configuration.readConfObject)(config, 'displayMode');
1097
- return (0, _util.iterMap)(featureMap.values(), function (feature) {
1098
- return _this2.layoutFeature({
1099
- feature: feature,
1100
- layout: layout,
1101
- bpPerPx: bpPerPx,
1102
- region: region,
1103
- showSoftClip: showSoftClip,
1104
- heightPx: heightPx,
1105
- displayMode: displayMode
1106
- });
1107
- }, featureMap.size);
1108
- }
1109
- }, {
1110
- key: "fetchSequence",
1111
- value: function () {
1112
- var _fetchSequence2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(renderProps) {
1113
- var sessionId, regions, adapterConfig, sequenceAdapter, _yield$getAdapter, dataAdapter, _regions5, region;
1114
-
1115
- return _regenerator.default.wrap(function _callee$(_context) {
1116
- while (1) {
1117
- switch (_context.prev = _context.next) {
1118
- case 0:
1119
- sessionId = renderProps.sessionId, regions = renderProps.regions, adapterConfig = renderProps.adapterConfig;
1120
- sequenceAdapter = adapterConfig.sequenceAdapter;
1121
-
1122
- if (sequenceAdapter) {
1123
- _context.next = 4;
1124
- break;
749
+ // second pass, draw wide insertion markers on top
750
+ if (drawIndels) {
751
+ for (var i = 0; i < mismatches.length; i += 1) {
752
+ var mismatch = mismatches[i];
753
+ var mstart = start + mismatch.start;
754
+ var mlen = mismatch.length;
755
+ var _e = __read((0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx), 1), leftPx = _e[0];
756
+ var len = +mismatch.base || mismatch.length;
757
+ var txt = "".concat(len);
758
+ if (mismatch.type === 'insertion' && len >= 10) {
759
+ if (bpPerPx > largeInsertionIndicatorScale) {
760
+ fillRect(ctx, leftPx - 1, topPx, 2, heightPx, canvasWidth, 'purple');
761
+ }
762
+ else if (heightPx > charHeight) {
763
+ var rwidth = (0, util_1.measureText)(txt);
764
+ var padding = 5;
765
+ fillRect(ctx, leftPx - rwidth / 2 - padding, topPx, rwidth + 2 * padding, heightPx, canvasWidth, 'purple');
766
+ ctx.fillStyle = 'white';
767
+ ctx.fillText(txt, leftPx - rwidth / 2, topPx + heightPx);
768
+ }
769
+ else {
770
+ var padding = 2;
771
+ fillRect(ctx, leftPx - padding, topPx, 2 * padding, heightPx, canvasWidth, 'purple');
772
+ }
1125
773
  }
1126
-
1127
- return _context.abrupt("return", undefined);
1128
-
1129
- case 4:
1130
- _context.next = 6;
1131
- return (0, _dataAdapterCache.getAdapter)(this.pluginManager, sessionId, sequenceAdapter);
1132
-
1133
- case 6:
1134
- _yield$getAdapter = _context.sent;
1135
- dataAdapter = _yield$getAdapter.dataAdapter;
1136
- _regions5 = (0, _slicedToArray2.default)(regions, 1), region = _regions5[0];
1137
- return _context.abrupt("return", (0, _util2.fetchSequence)(region, dataAdapter));
1138
-
1139
- case 10:
1140
- case "end":
1141
- return _context.stop();
1142
774
  }
1143
- }
1144
- }, _callee, this);
1145
- }));
1146
-
1147
- function fetchSequence(_x) {
1148
- return _fetchSequence2.apply(this, arguments);
1149
- }
1150
-
1151
- return fetchSequence;
1152
- }()
1153
- }, {
1154
- key: "render",
1155
- value: function () {
1156
- var _render = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(renderProps) {
1157
- var _renderProps$colorBy,
1158
- _this3 = this;
1159
-
1160
- var features, layout, regions, bpPerPx, layoutRecords, _regions6, region, regionSequence, end, start, width, height, res, results;
1161
-
1162
- return _regenerator.default.wrap(function _callee2$(_context2) {
1163
- while (1) {
1164
- switch (_context2.prev = _context2.next) {
1165
- case 0:
1166
- _context2.next = 2;
1167
- return this.getFeatures(renderProps);
1168
-
1169
- case 2:
1170
- features = _context2.sent;
1171
- layout = this.createLayoutInWorker(renderProps);
1172
- regions = renderProps.regions, bpPerPx = renderProps.bpPerPx;
1173
- layoutRecords = this.layoutFeats(_objectSpread(_objectSpread({}, renderProps), {}, {
1174
- features: features,
1175
- layout: layout
1176
- }));
1177
- _regions6 = (0, _slicedToArray2.default)(regions, 1), region = _regions6[0]; // only need reference sequence if there are features and only for some
1178
- // cases
1179
-
1180
- if (!(features.size && (0, _util2.shouldFetchReferenceSequence)((_renderProps$colorBy = renderProps.colorBy) === null || _renderProps$colorBy === void 0 ? void 0 : _renderProps$colorBy.type))) {
1181
- _context2.next = 13;
1182
- break;
775
+ }
776
+ };
777
+ PileupRenderer.prototype.drawSoftClipping = function (_a) {
778
+ var ctx = _a.ctx, feat = _a.feat, renderArgs = _a.renderArgs, config = _a.config, theme = _a.theme, canvasWidth = _a.canvasWidth;
779
+ var feature = feat.feature, topPx = feat.topPx, heightPx = feat.heightPx;
780
+ var regions = renderArgs.regions, bpPerPx = renderArgs.bpPerPx;
781
+ var _b = __read(regions, 1), region = _b[0];
782
+ var minFeatWidth = (0, configuration_1.readConfObject)(config, 'minSubfeatureWidth');
783
+ var mismatches = feature.get('mismatches');
784
+ var seq = feature.get('seq');
785
+ var _c = this.getCharWidthHeight(ctx), charWidth = _c.charWidth, charHeight = _c.charHeight;
786
+ // @ts-ignore
787
+ var bases = theme.palette.bases;
788
+ var colorForBase = {
789
+ A: bases.A.main,
790
+ C: bases.C.main,
791
+ G: bases.G.main,
792
+ T: bases.T.main,
793
+ deletion: '#808080', // gray
794
+ };
795
+ // Display all bases softclipped off in lightened colors
796
+ if (seq) {
797
+ mismatches
798
+ .filter(function (mismatch) { return mismatch.type === 'softclip'; })
799
+ .forEach(function (mismatch) {
800
+ var softClipLength = mismatch.cliplen || 0;
801
+ var s = feature.get('start');
802
+ var softClipStart = mismatch.start === 0 ? s - softClipLength : s + mismatch.start;
803
+ for (var k = 0; k < softClipLength; k += 1) {
804
+ var base = seq.charAt(k + mismatch.start);
805
+ // If softclip length+start is longer than sequence, no need to
806
+ // continue showing base
807
+ if (!base) {
808
+ return;
809
+ }
810
+ var _a = __read((0, util_1.bpSpanPx)(softClipStart + k, softClipStart + k + 1, region, bpPerPx), 2), softClipLeftPx = _a[0], softClipRightPx = _a[1];
811
+ var softClipWidthPx = Math.max(minFeatWidth, Math.abs(softClipLeftPx - softClipRightPx));
812
+ // Black accounts for IUPAC ambiguity code bases such as N that
813
+ // show in soft clipping
814
+ var baseColor = colorForBase[base] || '#000000';
815
+ ctx.fillStyle = baseColor;
816
+ fillRect(ctx, softClipLeftPx, topPx, softClipWidthPx, heightPx, canvasWidth);
817
+ if (softClipWidthPx >= charWidth && heightPx >= charHeight - 5) {
818
+ ctx.fillStyle = theme.palette.getContrastText(baseColor);
819
+ ctx.fillText(base, softClipLeftPx + (softClipWidthPx - charWidth) / 2 + 1, topPx + heightPx);
820
+ }
1183
821
  }
1184
-
1185
- _context2.next = 10;
1186
- return this.fetchSequence(renderProps);
1187
-
1188
- case 10:
1189
- _context2.t0 = _context2.sent;
1190
- _context2.next = 14;
1191
- break;
1192
-
1193
- case 13:
1194
- _context2.t0 = undefined;
1195
-
1196
- case 14:
1197
- regionSequence = _context2.t0;
1198
- end = region.end, start = region.start;
1199
- width = (end - start) / bpPerPx;
1200
- height = Math.max(layout.getTotalHeight(), 1);
1201
- _context2.next = 20;
1202
- return (0, _offscreenCanvasUtils.renderToAbstractCanvas)(width, height, renderProps, function (ctx) {
1203
- return _this3.makeImageData({
822
+ });
823
+ }
824
+ };
825
+ PileupRenderer.prototype.makeImageData = function (_a) {
826
+ var ctx = _a.ctx, layoutRecords = _a.layoutRecords, canvasWidth = _a.canvasWidth, renderArgs = _a.renderArgs;
827
+ var layout = renderArgs.layout, config = renderArgs.config, showSoftClip = renderArgs.showSoftClip, colorBy = renderArgs.colorBy, configTheme = renderArgs.theme;
828
+ var mismatchAlpha = (0, configuration_1.readConfObject)(config, 'mismatchAlpha');
829
+ var minSubfeatureWidth = (0, configuration_1.readConfObject)(config, 'minSubfeatureWidth');
830
+ var largeInsertionIndicatorScale = (0, configuration_1.readConfObject)(config, 'largeInsertionIndicatorScale');
831
+ var defaultColor = (0, configuration_1.readConfObject)(config, 'color') === '#f0f';
832
+ var theme = (0, ui_1.createJBrowseTheme)(configTheme);
833
+ var colorForBase = getColorBaseMap(theme);
834
+ var contrastForBase = getContrastBaseMap(theme);
835
+ if (!layout) {
836
+ throw new Error("layout required");
837
+ }
838
+ if (!layout.addRect) {
839
+ throw new Error('invalid layout object');
840
+ }
841
+ ctx.font = 'bold 10px Courier New,monospace';
842
+ var _b = this.getCharWidthHeight(ctx), charWidth = _b.charWidth, charHeight = _b.charHeight;
843
+ var drawSNPsMuted = shouldDrawSNPsMuted(colorBy === null || colorBy === void 0 ? void 0 : colorBy.type);
844
+ var drawIndels = shouldDrawIndels(colorBy === null || colorBy === void 0 ? void 0 : colorBy.type);
845
+ for (var i = 0; i < layoutRecords.length; i++) {
846
+ var feat = layoutRecords[i];
847
+ if (feat === null) {
848
+ continue;
849
+ }
850
+ this.drawAlignmentRect({
851
+ ctx: ctx,
852
+ feat: feat,
853
+ renderArgs: renderArgs,
854
+ defaultColor: defaultColor,
855
+ colorForBase: colorForBase,
856
+ contrastForBase: contrastForBase,
857
+ charWidth: charWidth,
858
+ charHeight: charHeight,
859
+ canvasWidth: canvasWidth,
860
+ });
861
+ this.drawMismatches({
862
+ ctx: ctx,
863
+ feat: feat,
864
+ renderArgs: renderArgs,
865
+ mismatchAlpha: mismatchAlpha,
866
+ drawSNPsMuted: drawSNPsMuted,
867
+ drawIndels: drawIndels,
868
+ largeInsertionIndicatorScale: largeInsertionIndicatorScale,
869
+ minSubfeatureWidth: minSubfeatureWidth,
870
+ charWidth: charWidth,
871
+ charHeight: charHeight,
872
+ colorForBase: colorForBase,
873
+ contrastForBase: contrastForBase,
874
+ canvasWidth: canvasWidth,
875
+ });
876
+ if (showSoftClip) {
877
+ this.drawSoftClipping({
1204
878
  ctx: ctx,
1205
- layoutRecords: layoutRecords,
1206
- canvasWidth: width,
1207
- renderArgs: _objectSpread(_objectSpread({}, renderProps), {}, {
1208
- layout: layout,
1209
- features: features,
1210
- regionSequence: regionSequence
1211
- })
1212
- });
879
+ feat: feat,
880
+ renderArgs: renderArgs,
881
+ config: config,
882
+ theme: theme,
883
+ canvasWidth: canvasWidth,
1213
884
  });
1214
-
1215
- case 20:
1216
- res = _context2.sent;
1217
- _context2.next = 23;
1218
- return (0, _get2.default)((0, _getPrototypeOf2.default)(PileupRenderer.prototype), "render", this).call(this, _objectSpread(_objectSpread(_objectSpread({}, renderProps), res), {}, {
1219
- features: features,
1220
- layout: layout,
1221
- height: height,
1222
- width: width
1223
- }));
1224
-
1225
- case 23:
1226
- results = _context2.sent;
1227
- return _context2.abrupt("return", _objectSpread(_objectSpread(_objectSpread({}, results), res), {}, {
1228
- features: new Map(),
1229
- layout: layout,
1230
- height: height,
1231
- width: width,
1232
- maxHeightReached: layout.maxHeightReached
1233
- }));
1234
-
1235
- case 25:
1236
- case "end":
1237
- return _context2.stop();
1238
885
  }
1239
- }
1240
- }, _callee2, this);
1241
- }));
1242
-
1243
- function render(_x2) {
1244
- return _render.apply(this, arguments);
1245
- }
1246
-
1247
- return render;
1248
- }()
1249
- }, {
1250
- key: "createSession",
1251
- value: function createSession(args) {
1252
- return new _PileupLayoutSession.PileupLayoutSession(args);
1253
- }
1254
- }]);
1255
- return PileupRenderer;
1256
- }(_BoxRendererType2.default);
1257
-
1258
- exports.default = PileupRenderer;
886
+ }
887
+ };
888
+ // we perform a full layout before render as a separate method because the
889
+ // layout determines the height of the canvas that we use to render
890
+ PileupRenderer.prototype.layoutFeats = function (props) {
891
+ var _this = this;
892
+ var layout = props.layout, features = props.features, sortedBy = props.sortedBy, config = props.config, bpPerPx = props.bpPerPx, showSoftClip = props.showSoftClip, regions = props.regions;
893
+ var _a = __read(regions, 1), region = _a[0];
894
+ if (!layout) {
895
+ throw new Error("layout required");
896
+ }
897
+ if (!layout.addRect) {
898
+ throw new Error('invalid layout object');
899
+ }
900
+ var featureMap = (sortedBy === null || sortedBy === void 0 ? void 0 : sortedBy.type) && region.start === sortedBy.pos
901
+ ? (0, sortUtil_1.sortFeature)(features, sortedBy)
902
+ : features;
903
+ var heightPx = (0, configuration_1.readConfObject)(config, 'height');
904
+ var displayMode = (0, configuration_1.readConfObject)(config, 'displayMode');
905
+ return (0, util_1.iterMap)(featureMap.values(), function (feature) {
906
+ return _this.layoutFeature({
907
+ feature: feature,
908
+ layout: layout,
909
+ bpPerPx: bpPerPx,
910
+ region: region,
911
+ showSoftClip: showSoftClip,
912
+ heightPx: heightPx,
913
+ displayMode: displayMode,
914
+ });
915
+ }, featureMap.size);
916
+ };
917
+ PileupRenderer.prototype.fetchSequence = function (renderProps) {
918
+ return __awaiter(this, void 0, void 0, function () {
919
+ var sessionId, regions, adapterConfig, sequenceAdapter, dataAdapter, _a, region;
920
+ return __generator(this, function (_b) {
921
+ switch (_b.label) {
922
+ case 0:
923
+ sessionId = renderProps.sessionId, regions = renderProps.regions, adapterConfig = renderProps.adapterConfig;
924
+ sequenceAdapter = adapterConfig.sequenceAdapter;
925
+ if (!sequenceAdapter) {
926
+ return [2 /*return*/, undefined];
927
+ }
928
+ return [4 /*yield*/, (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, sequenceAdapter)];
929
+ case 1:
930
+ dataAdapter = (_b.sent()).dataAdapter;
931
+ _a = __read(regions, 1), region = _a[0];
932
+ return [2 /*return*/, (0, util_2.fetchSequence)(region, dataAdapter)];
933
+ }
934
+ });
935
+ });
936
+ };
937
+ PileupRenderer.prototype.render = function (renderProps) {
938
+ var _a;
939
+ return __awaiter(this, void 0, void 0, function () {
940
+ var features, layout, regions, bpPerPx, layoutRecords, _b, region, regionSequence, _c, end, start, width, height, Color, res, results;
941
+ var _this = this;
942
+ return __generator(this, function (_d) {
943
+ switch (_d.label) {
944
+ case 0: return [4 /*yield*/, this.getFeatures(renderProps)];
945
+ case 1:
946
+ features = _d.sent();
947
+ layout = this.createLayoutInWorker(renderProps);
948
+ regions = renderProps.regions, bpPerPx = renderProps.bpPerPx;
949
+ layoutRecords = this.layoutFeats(__assign(__assign({}, renderProps), { features: features, layout: layout }));
950
+ _b = __read(regions, 1), region = _b[0];
951
+ if (!(features.size && (0, util_2.shouldFetchReferenceSequence)((_a = renderProps.colorBy) === null || _a === void 0 ? void 0 : _a.type))) return [3 /*break*/, 3];
952
+ return [4 /*yield*/, this.fetchSequence(renderProps)];
953
+ case 2:
954
+ _c = _d.sent();
955
+ return [3 /*break*/, 4];
956
+ case 3:
957
+ _c = undefined;
958
+ _d.label = 4;
959
+ case 4:
960
+ regionSequence = _c;
961
+ end = region.end, start = region.start;
962
+ width = (end - start) / bpPerPx;
963
+ height = Math.max(layout.getTotalHeight(), 1);
964
+ return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('color')); }).then(function (f) { return f.default; })];
965
+ case 5:
966
+ Color = _d.sent();
967
+ return [4 /*yield*/, (0, offscreenCanvasUtils_1.renderToAbstractCanvas)(width, height, renderProps, function (ctx) {
968
+ return _this.makeImageData({
969
+ ctx: ctx,
970
+ layoutRecords: layoutRecords,
971
+ canvasWidth: width,
972
+ renderArgs: __assign(__assign({}, renderProps), { layout: layout, features: features, regionSequence: regionSequence, Color: Color }),
973
+ });
974
+ })];
975
+ case 6:
976
+ res = _d.sent();
977
+ return [4 /*yield*/, _super.prototype.render.call(this, __assign(__assign(__assign({}, renderProps), res), { features: features, layout: layout, height: height, width: width }))];
978
+ case 7:
979
+ results = _d.sent();
980
+ return [2 /*return*/, __assign(__assign(__assign({}, results), res), { features: new Map(), layout: layout, height: height, width: width, maxHeightReached: layout.maxHeightReached })];
981
+ }
982
+ });
983
+ });
984
+ };
985
+ PileupRenderer.prototype.createSession = function (args) {
986
+ return new PileupLayoutSession_1.PileupLayoutSession(args);
987
+ };
988
+ return PileupRenderer;
989
+ }(BoxRendererType_1.default));
990
+ exports.default = PileupRenderer;
991
+ //# sourceMappingURL=PileupRenderer.js.map