@jbrowse/plugin-alignments 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +2 -1
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.d.ts +2 -1
  3. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js +2 -1
  4. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js.map +1 -1
  5. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.d.ts +2 -1
  6. package/dist/BamAdapter/BamAdapter.d.ts +1 -1
  7. package/dist/BamAdapter/BamAdapter.js +25 -30
  8. package/dist/BamAdapter/BamAdapter.js.map +1 -1
  9. package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +1 -1
  10. package/dist/CramAdapter/CramAdapter.js +48 -46
  11. package/dist/CramAdapter/CramAdapter.js.map +1 -1
  12. package/dist/CramAdapter/CramSlightlyLazyFeature.js +3 -5
  13. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  14. package/dist/CramAdapter/CramTestAdapters.js +1 -1
  15. package/dist/CramAdapter/CramTestAdapters.js.map +1 -1
  16. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +2 -1
  17. package/dist/LinearAlignmentsDisplay/models/model.d.ts +16 -6
  18. package/dist/LinearAlignmentsDisplay/models/model.js +2 -1
  19. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
  20. package/dist/LinearPileupDisplay/components/ColorByModifications.d.ts +2 -1
  21. package/dist/LinearPileupDisplay/components/ColorByModifications.js +3 -23
  22. package/dist/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
  23. package/dist/LinearPileupDisplay/components/ColorByTag.d.ts +2 -1
  24. package/dist/LinearPileupDisplay/components/ColorByTag.js +2 -6
  25. package/dist/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
  26. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +3 -2
  27. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +6 -6
  28. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js.map +1 -1
  29. package/dist/LinearPileupDisplay/components/ModificationsTable.d.ts +4 -0
  30. package/dist/LinearPileupDisplay/components/ModificationsTable.js +29 -0
  31. package/dist/LinearPileupDisplay/components/ModificationsTable.js.map +1 -0
  32. package/dist/LinearPileupDisplay/components/SetFeatureHeight.d.ts +2 -1
  33. package/dist/LinearPileupDisplay/components/SetMaxHeight.d.ts +2 -1
  34. package/dist/LinearPileupDisplay/components/SortByTag.d.ts +2 -1
  35. package/dist/LinearPileupDisplay/model.d.ts +101 -78
  36. package/dist/LinearPileupDisplay/model.js +161 -115
  37. package/dist/LinearPileupDisplay/model.js.map +1 -1
  38. package/dist/LinearReadArcsDisplay/components/ReactComponent.d.ts +2 -1
  39. package/dist/LinearReadArcsDisplay/components/ReactComponent.js +36 -39
  40. package/dist/LinearReadArcsDisplay/components/ReactComponent.js.map +1 -1
  41. package/dist/LinearReadArcsDisplay/configSchema.d.ts +0 -3
  42. package/dist/LinearReadArcsDisplay/drawFeats.d.ts +2 -15
  43. package/dist/LinearReadArcsDisplay/drawFeats.js +56 -64
  44. package/dist/LinearReadArcsDisplay/drawFeats.js.map +1 -1
  45. package/dist/LinearReadArcsDisplay/model.d.ts +52 -244
  46. package/dist/LinearReadArcsDisplay/model.js +65 -115
  47. package/dist/LinearReadArcsDisplay/model.js.map +1 -1
  48. package/dist/LinearReadArcsDisplay/util.d.ts +2 -0
  49. package/dist/LinearReadArcsDisplay/util.js +13 -0
  50. package/dist/LinearReadArcsDisplay/util.js.map +1 -0
  51. package/dist/LinearReadCloudDisplay/components/ReactComponent.d.ts +2 -1
  52. package/dist/LinearReadCloudDisplay/components/ReactComponent.js +34 -36
  53. package/dist/LinearReadCloudDisplay/components/ReactComponent.js.map +1 -1
  54. package/dist/LinearReadCloudDisplay/configSchema.d.ts +3 -1
  55. package/dist/LinearReadCloudDisplay/drawFeats.d.ts +2 -12
  56. package/dist/LinearReadCloudDisplay/drawFeats.js +11 -127
  57. package/dist/LinearReadCloudDisplay/drawFeats.js.map +1 -1
  58. package/dist/LinearReadCloudDisplay/drawLongReadChains.d.ts +11 -0
  59. package/dist/LinearReadCloudDisplay/drawLongReadChains.js +69 -0
  60. package/dist/LinearReadCloudDisplay/drawLongReadChains.js.map +1 -0
  61. package/dist/LinearReadCloudDisplay/drawPairChains.d.ts +17 -0
  62. package/dist/LinearReadCloudDisplay/drawPairChains.js +100 -0
  63. package/dist/LinearReadCloudDisplay/drawPairChains.js.map +1 -0
  64. package/dist/LinearReadCloudDisplay/model.d.ts +60 -238
  65. package/dist/LinearReadCloudDisplay/model.js +55 -92
  66. package/dist/LinearReadCloudDisplay/model.js.map +1 -1
  67. package/dist/LinearReadCloudDisplay/util.d.ts +2 -0
  68. package/dist/LinearReadCloudDisplay/util.js +35 -0
  69. package/dist/LinearReadCloudDisplay/util.js.map +1 -0
  70. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +2 -1
  71. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +134 -74
  72. package/dist/LinearSNPCoverageDisplay/models/model.js +46 -33
  73. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  74. package/dist/MismatchParser/index.d.ts +7 -2
  75. package/dist/MismatchParser/index.js +44 -5
  76. package/dist/MismatchParser/index.js.map +1 -1
  77. package/dist/PileupRPC/methods/GetReducedFeatures.d.ts +15 -2
  78. package/dist/PileupRPC/methods/GetReducedFeatures.js +1 -8
  79. package/dist/PileupRPC/methods/GetReducedFeatures.js.map +1 -1
  80. package/dist/PileupRenderer/PileupRenderer.d.ts +4 -117
  81. package/dist/PileupRenderer/PileupRenderer.js +18 -761
  82. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  83. package/dist/PileupRenderer/colorBy.d.ts +7 -0
  84. package/dist/PileupRenderer/colorBy.js +69 -0
  85. package/dist/PileupRenderer/colorBy.js.map +1 -0
  86. package/dist/PileupRenderer/components/PileupRendering.d.ts +7 -2
  87. package/dist/PileupRenderer/components/PileupRendering.js +17 -18
  88. package/dist/PileupRenderer/components/PileupRendering.js.map +1 -1
  89. package/dist/PileupRenderer/getAlignmentShapeColor.d.ts +10 -0
  90. package/dist/PileupRenderer/getAlignmentShapeColor.js +60 -0
  91. package/dist/PileupRenderer/getAlignmentShapeColor.js.map +1 -0
  92. package/dist/PileupRenderer/index.js +1 -1
  93. package/dist/PileupRenderer/index.js.map +1 -1
  94. package/dist/PileupRenderer/layoutFeature.d.ts +18 -0
  95. package/dist/PileupRenderer/layoutFeature.js +41 -0
  96. package/dist/PileupRenderer/layoutFeature.js.map +1 -0
  97. package/dist/PileupRenderer/layoutFeatures.d.ts +2 -0
  98. package/dist/PileupRenderer/layoutFeatures.js +35 -0
  99. package/dist/PileupRenderer/layoutFeatures.js.map +1 -0
  100. package/dist/PileupRenderer/makeImageData.d.ts +17 -0
  101. package/dist/PileupRenderer/makeImageData.js +64 -0
  102. package/dist/PileupRenderer/makeImageData.js.map +1 -0
  103. package/dist/PileupRenderer/renderAlignment.d.ts +13 -0
  104. package/dist/PileupRenderer/renderAlignment.js +72 -0
  105. package/dist/PileupRenderer/renderAlignment.js.map +1 -0
  106. package/dist/PileupRenderer/renderAlignmentShape.d.ts +7 -0
  107. package/dist/PileupRenderer/renderAlignmentShape.js +41 -0
  108. package/dist/PileupRenderer/renderAlignmentShape.js.map +1 -0
  109. package/dist/PileupRenderer/renderMethylation.d.ts +11 -0
  110. package/dist/PileupRenderer/renderMethylation.js +63 -0
  111. package/dist/PileupRenderer/renderMethylation.js.map +1 -0
  112. package/dist/PileupRenderer/renderMismatches.d.ts +21 -0
  113. package/dist/PileupRenderer/renderMismatches.js +135 -0
  114. package/dist/PileupRenderer/renderMismatches.js.map +1 -0
  115. package/dist/PileupRenderer/renderModifications.d.ts +11 -0
  116. package/dist/PileupRenderer/renderModifications.js +54 -0
  117. package/dist/PileupRenderer/renderModifications.js.map +1 -0
  118. package/dist/PileupRenderer/renderPerBaseLettering.d.ts +13 -0
  119. package/dist/PileupRenderer/renderPerBaseLettering.js +47 -0
  120. package/dist/PileupRenderer/renderPerBaseLettering.js.map +1 -0
  121. package/dist/PileupRenderer/renderPerBaseQuality.d.ts +9 -0
  122. package/dist/PileupRenderer/renderPerBaseQuality.js +39 -0
  123. package/dist/PileupRenderer/renderPerBaseQuality.js.map +1 -0
  124. package/dist/PileupRenderer/renderSoftClipping.d.ts +13 -0
  125. package/dist/PileupRenderer/renderSoftClipping.js +48 -0
  126. package/dist/PileupRenderer/renderSoftClipping.js.map +1 -0
  127. package/dist/PileupRenderer/sortUtil.js +1 -2
  128. package/dist/PileupRenderer/sortUtil.js.map +1 -1
  129. package/dist/PileupRenderer/util.d.ts +24 -0
  130. package/dist/PileupRenderer/util.js +51 -0
  131. package/dist/PileupRenderer/util.js.map +1 -0
  132. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +0 -2
  133. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +0 -3
  134. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  135. package/dist/SNPCoverageAdapter/generateCoverageBins.d.ts +3 -43
  136. package/dist/SNPCoverageAdapter/generateCoverageBins.js +72 -49
  137. package/dist/SNPCoverageAdapter/generateCoverageBins.js.map +1 -1
  138. package/dist/SNPCoverageAdapter/index.js +0 -2
  139. package/dist/SNPCoverageAdapter/index.js.map +1 -1
  140. package/dist/SNPCoverageAdapter/util.d.ts +29 -0
  141. package/dist/SNPCoverageAdapter/util.js +3 -0
  142. package/dist/SNPCoverageAdapter/util.js.map +1 -0
  143. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +1 -1
  144. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +2 -2
  145. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -1
  146. package/dist/SNPCoverageRenderer/configSchema.d.ts +5 -0
  147. package/dist/SNPCoverageRenderer/configSchema.js +5 -0
  148. package/dist/SNPCoverageRenderer/configSchema.js.map +1 -1
  149. package/dist/shared/BaseDisplayComponent.d.ts +8 -0
  150. package/dist/shared/BaseDisplayComponent.js +49 -0
  151. package/dist/shared/BaseDisplayComponent.js.map +1 -0
  152. package/dist/shared/FilterByTag.d.ts +13 -11
  153. package/dist/shared/FilterByTag.js +8 -13
  154. package/dist/shared/FilterByTag.js.map +1 -1
  155. package/dist/shared/afterAttach.d.ts +2 -0
  156. package/dist/shared/afterAttach.js +44 -0
  157. package/dist/shared/afterAttach.js.map +1 -0
  158. package/dist/shared/color.d.ts +44 -6
  159. package/dist/shared/color.js +57 -23
  160. package/dist/shared/color.js.map +1 -1
  161. package/dist/shared/fetchChains.d.ts +3 -2
  162. package/dist/shared/fetchChains.js +14 -20
  163. package/dist/shared/fetchChains.js.map +1 -1
  164. package/dist/shared/renderSvg.d.ts +7 -0
  165. package/dist/shared/renderSvg.js +69 -0
  166. package/dist/shared/renderSvg.js.map +1 -0
  167. package/dist/shared/util.d.ts +2 -0
  168. package/dist/shared/util.js +13 -0
  169. package/dist/shared/util.js.map +1 -0
  170. package/dist/util.d.ts +16 -2
  171. package/dist/util.js +45 -4
  172. package/dist/util.js.map +1 -1
  173. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +2 -1
  174. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.d.ts +2 -1
  175. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js +3 -2
  176. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureFlags.js.map +1 -1
  177. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureSuppAligns.d.ts +2 -1
  178. package/esm/BamAdapter/BamAdapter.d.ts +1 -1
  179. package/esm/BamAdapter/BamAdapter.js +25 -30
  180. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  181. package/esm/BamAdapter/BamSlightlyLazyFeature.d.ts +1 -1
  182. package/esm/CramAdapter/CramAdapter.js +49 -47
  183. package/esm/CramAdapter/CramAdapter.js.map +1 -1
  184. package/esm/CramAdapter/CramSlightlyLazyFeature.js +3 -5
  185. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  186. package/esm/CramAdapter/CramTestAdapters.js +1 -1
  187. package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
  188. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +2 -1
  189. package/esm/LinearAlignmentsDisplay/models/model.d.ts +16 -6
  190. package/esm/LinearAlignmentsDisplay/models/model.js +2 -1
  191. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  192. package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +2 -1
  193. package/esm/LinearPileupDisplay/components/ColorByModifications.js +2 -22
  194. package/esm/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
  195. package/esm/LinearPileupDisplay/components/ColorByTag.d.ts +2 -1
  196. package/esm/LinearPileupDisplay/components/ColorByTag.js +2 -6
  197. package/esm/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
  198. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +3 -2
  199. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +6 -6
  200. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js.map +1 -1
  201. package/esm/LinearPileupDisplay/components/ModificationsTable.d.ts +4 -0
  202. package/esm/LinearPileupDisplay/components/ModificationsTable.js +23 -0
  203. package/esm/LinearPileupDisplay/components/ModificationsTable.js.map +1 -0
  204. package/esm/LinearPileupDisplay/components/SetFeatureHeight.d.ts +2 -1
  205. package/esm/LinearPileupDisplay/components/SetMaxHeight.d.ts +2 -1
  206. package/esm/LinearPileupDisplay/components/SortByTag.d.ts +2 -1
  207. package/esm/LinearPileupDisplay/model.d.ts +101 -78
  208. package/esm/LinearPileupDisplay/model.js +162 -116
  209. package/esm/LinearPileupDisplay/model.js.map +1 -1
  210. package/esm/LinearReadArcsDisplay/components/ReactComponent.d.ts +2 -1
  211. package/esm/LinearReadArcsDisplay/components/ReactComponent.js +13 -39
  212. package/esm/LinearReadArcsDisplay/components/ReactComponent.js.map +1 -1
  213. package/esm/LinearReadArcsDisplay/configSchema.d.ts +0 -3
  214. package/esm/LinearReadArcsDisplay/drawFeats.d.ts +2 -15
  215. package/esm/LinearReadArcsDisplay/drawFeats.js +54 -61
  216. package/esm/LinearReadArcsDisplay/drawFeats.js.map +1 -1
  217. package/esm/LinearReadArcsDisplay/model.d.ts +52 -244
  218. package/esm/LinearReadArcsDisplay/model.js +69 -119
  219. package/esm/LinearReadArcsDisplay/model.js.map +1 -1
  220. package/esm/LinearReadArcsDisplay/util.d.ts +2 -0
  221. package/esm/LinearReadArcsDisplay/util.js +9 -0
  222. package/esm/LinearReadArcsDisplay/util.js.map +1 -0
  223. package/esm/LinearReadCloudDisplay/components/ReactComponent.d.ts +2 -1
  224. package/esm/LinearReadCloudDisplay/components/ReactComponent.js +11 -36
  225. package/esm/LinearReadCloudDisplay/components/ReactComponent.js.map +1 -1
  226. package/esm/LinearReadCloudDisplay/configSchema.d.ts +3 -1
  227. package/esm/LinearReadCloudDisplay/drawFeats.d.ts +2 -12
  228. package/esm/LinearReadCloudDisplay/drawFeats.js +9 -126
  229. package/esm/LinearReadCloudDisplay/drawFeats.js.map +1 -1
  230. package/esm/LinearReadCloudDisplay/drawLongReadChains.d.ts +11 -0
  231. package/esm/LinearReadCloudDisplay/drawLongReadChains.js +65 -0
  232. package/esm/LinearReadCloudDisplay/drawLongReadChains.js.map +1 -0
  233. package/esm/LinearReadCloudDisplay/drawPairChains.d.ts +17 -0
  234. package/esm/LinearReadCloudDisplay/drawPairChains.js +95 -0
  235. package/esm/LinearReadCloudDisplay/drawPairChains.js.map +1 -0
  236. package/esm/LinearReadCloudDisplay/model.d.ts +60 -238
  237. package/esm/LinearReadCloudDisplay/model.js +59 -96
  238. package/esm/LinearReadCloudDisplay/model.js.map +1 -1
  239. package/esm/LinearReadCloudDisplay/util.d.ts +2 -0
  240. package/esm/LinearReadCloudDisplay/util.js +30 -0
  241. package/esm/LinearReadCloudDisplay/util.js.map +1 -0
  242. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +2 -1
  243. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +134 -74
  244. package/esm/LinearSNPCoverageDisplay/models/model.js +48 -35
  245. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  246. package/esm/MismatchParser/index.d.ts +7 -2
  247. package/esm/MismatchParser/index.js +41 -4
  248. package/esm/MismatchParser/index.js.map +1 -1
  249. package/esm/PileupRPC/methods/GetReducedFeatures.d.ts +15 -2
  250. package/esm/PileupRPC/methods/GetReducedFeatures.js +2 -9
  251. package/esm/PileupRPC/methods/GetReducedFeatures.js.map +1 -1
  252. package/esm/PileupRenderer/PileupRenderer.d.ts +4 -117
  253. package/esm/PileupRenderer/PileupRenderer.js +20 -763
  254. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  255. package/esm/PileupRenderer/colorBy.d.ts +7 -0
  256. package/esm/PileupRenderer/colorBy.js +61 -0
  257. package/esm/PileupRenderer/colorBy.js.map +1 -0
  258. package/esm/PileupRenderer/components/PileupRendering.d.ts +7 -2
  259. package/esm/PileupRenderer/components/PileupRendering.js +17 -18
  260. package/esm/PileupRenderer/components/PileupRendering.js.map +1 -1
  261. package/esm/PileupRenderer/getAlignmentShapeColor.d.ts +10 -0
  262. package/esm/PileupRenderer/getAlignmentShapeColor.js +56 -0
  263. package/esm/PileupRenderer/getAlignmentShapeColor.js.map +1 -0
  264. package/esm/PileupRenderer/index.js +1 -1
  265. package/esm/PileupRenderer/index.js.map +1 -1
  266. package/esm/PileupRenderer/layoutFeature.d.ts +18 -0
  267. package/esm/PileupRenderer/layoutFeature.js +37 -0
  268. package/esm/PileupRenderer/layoutFeature.js.map +1 -0
  269. package/esm/PileupRenderer/layoutFeatures.d.ts +2 -0
  270. package/esm/PileupRenderer/layoutFeatures.js +31 -0
  271. package/esm/PileupRenderer/layoutFeatures.js.map +1 -0
  272. package/esm/PileupRenderer/makeImageData.d.ts +17 -0
  273. package/esm/PileupRenderer/makeImageData.js +60 -0
  274. package/esm/PileupRenderer/makeImageData.js.map +1 -0
  275. package/esm/PileupRenderer/renderAlignment.d.ts +13 -0
  276. package/esm/PileupRenderer/renderAlignment.js +68 -0
  277. package/esm/PileupRenderer/renderAlignment.js.map +1 -0
  278. package/esm/PileupRenderer/renderAlignmentShape.d.ts +7 -0
  279. package/esm/PileupRenderer/renderAlignmentShape.js +37 -0
  280. package/esm/PileupRenderer/renderAlignmentShape.js.map +1 -0
  281. package/esm/PileupRenderer/renderMethylation.d.ts +11 -0
  282. package/esm/PileupRenderer/renderMethylation.js +59 -0
  283. package/esm/PileupRenderer/renderMethylation.js.map +1 -0
  284. package/esm/PileupRenderer/renderMismatches.d.ts +21 -0
  285. package/esm/PileupRenderer/renderMismatches.js +131 -0
  286. package/esm/PileupRenderer/renderMismatches.js.map +1 -0
  287. package/esm/PileupRenderer/renderModifications.d.ts +11 -0
  288. package/esm/PileupRenderer/renderModifications.js +50 -0
  289. package/esm/PileupRenderer/renderModifications.js.map +1 -0
  290. package/esm/PileupRenderer/renderPerBaseLettering.d.ts +13 -0
  291. package/esm/PileupRenderer/renderPerBaseLettering.js +43 -0
  292. package/esm/PileupRenderer/renderPerBaseLettering.js.map +1 -0
  293. package/esm/PileupRenderer/renderPerBaseQuality.d.ts +9 -0
  294. package/esm/PileupRenderer/renderPerBaseQuality.js +35 -0
  295. package/esm/PileupRenderer/renderPerBaseQuality.js.map +1 -0
  296. package/esm/PileupRenderer/renderSoftClipping.d.ts +13 -0
  297. package/esm/PileupRenderer/renderSoftClipping.js +44 -0
  298. package/esm/PileupRenderer/renderSoftClipping.js.map +1 -0
  299. package/esm/PileupRenderer/sortUtil.js +1 -2
  300. package/esm/PileupRenderer/sortUtil.js.map +1 -1
  301. package/esm/PileupRenderer/util.d.ts +24 -0
  302. package/esm/PileupRenderer/util.js +42 -0
  303. package/esm/PileupRenderer/util.js.map +1 -0
  304. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +0 -2
  305. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +0 -2
  306. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  307. package/esm/SNPCoverageAdapter/generateCoverageBins.d.ts +3 -43
  308. package/esm/SNPCoverageAdapter/generateCoverageBins.js +73 -50
  309. package/esm/SNPCoverageAdapter/generateCoverageBins.js.map +1 -1
  310. package/esm/SNPCoverageAdapter/index.js +0 -2
  311. package/esm/SNPCoverageAdapter/index.js.map +1 -1
  312. package/esm/SNPCoverageAdapter/util.d.ts +29 -0
  313. package/esm/SNPCoverageAdapter/util.js +2 -0
  314. package/esm/SNPCoverageAdapter/util.js.map +1 -0
  315. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +1 -1
  316. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +2 -2
  317. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -1
  318. package/esm/SNPCoverageRenderer/configSchema.d.ts +5 -0
  319. package/esm/SNPCoverageRenderer/configSchema.js +5 -0
  320. package/esm/SNPCoverageRenderer/configSchema.js.map +1 -1
  321. package/esm/shared/BaseDisplayComponent.d.ts +8 -0
  322. package/esm/shared/BaseDisplayComponent.js +44 -0
  323. package/esm/shared/BaseDisplayComponent.js.map +1 -0
  324. package/esm/shared/FilterByTag.d.ts +13 -11
  325. package/esm/shared/FilterByTag.js +8 -13
  326. package/esm/shared/FilterByTag.js.map +1 -1
  327. package/esm/shared/afterAttach.d.ts +2 -0
  328. package/esm/shared/afterAttach.js +40 -0
  329. package/esm/shared/afterAttach.js.map +1 -0
  330. package/esm/shared/color.d.ts +44 -6
  331. package/esm/shared/color.js +54 -20
  332. package/esm/shared/color.js.map +1 -1
  333. package/esm/shared/fetchChains.d.ts +3 -2
  334. package/esm/shared/fetchChains.js +14 -20
  335. package/esm/shared/fetchChains.js.map +1 -1
  336. package/esm/shared/renderSvg.d.ts +7 -0
  337. package/esm/shared/renderSvg.js +39 -0
  338. package/esm/shared/renderSvg.js.map +1 -0
  339. package/esm/shared/util.d.ts +2 -0
  340. package/esm/shared/util.js +9 -0
  341. package/esm/shared/util.js.map +1 -0
  342. package/esm/util.d.ts +16 -2
  343. package/esm/util.js +42 -3
  344. package/esm/util.js.map +1 -1
  345. package/package.json +3 -3
  346. package/src/AlignmentsFeatureDetail/AlignmentsFeatureFlags.tsx +3 -5
  347. package/src/BamAdapter/BamAdapter.ts +41 -42
  348. package/src/CombinationTest.test.ts +2 -2
  349. package/src/CramAdapter/CramAdapter.ts +66 -55
  350. package/src/CramAdapter/CramSlightlyLazyFeature.ts +2 -5
  351. package/src/CramAdapter/CramTestAdapters.ts +1 -1
  352. package/src/LinearAlignmentsDisplay/models/model.tsx +5 -1
  353. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +3 -39
  354. package/src/LinearPileupDisplay/components/ColorByTag.tsx +1 -6
  355. package/src/LinearPileupDisplay/components/LinearPileupDisplayBlurb.tsx +10 -11
  356. package/src/LinearPileupDisplay/components/ModificationsTable.tsx +38 -0
  357. package/src/LinearPileupDisplay/model.ts +199 -152
  358. package/src/LinearReadArcsDisplay/components/ReactComponent.tsx +23 -61
  359. package/src/LinearReadArcsDisplay/drawFeats.ts +77 -85
  360. package/src/LinearReadArcsDisplay/model.tsx +77 -155
  361. package/src/LinearReadArcsDisplay/util.ts +10 -0
  362. package/src/LinearReadCloudDisplay/components/ReactComponent.tsx +21 -59
  363. package/src/LinearReadCloudDisplay/drawFeats.ts +12 -167
  364. package/src/LinearReadCloudDisplay/drawLongReadChains.ts +85 -0
  365. package/src/LinearReadCloudDisplay/drawPairChains.ts +139 -0
  366. package/src/LinearReadCloudDisplay/model.tsx +72 -131
  367. package/src/LinearReadCloudDisplay/util.ts +47 -0
  368. package/src/LinearSNPCoverageDisplay/models/model.ts +63 -50
  369. package/src/MismatchParser/index.ts +46 -4
  370. package/src/PileupRPC/methods/GetReducedFeatures.ts +2 -10
  371. package/src/PileupRenderer/PileupRenderer.ts +23 -1200
  372. package/src/PileupRenderer/colorBy.ts +74 -0
  373. package/src/PileupRenderer/components/PileupRendering.tsx +20 -25
  374. package/src/PileupRenderer/getAlignmentShapeColor.ts +87 -0
  375. package/src/PileupRenderer/index.ts +1 -1
  376. package/src/PileupRenderer/layoutFeature.ts +83 -0
  377. package/src/PileupRenderer/layoutFeatures.ts +44 -0
  378. package/src/PileupRenderer/makeImageData.ts +93 -0
  379. package/src/PileupRenderer/renderAlignment.ts +97 -0
  380. package/src/PileupRenderer/renderAlignmentShape.ts +45 -0
  381. package/src/PileupRenderer/renderMethylation.ts +75 -0
  382. package/src/PileupRenderer/renderMismatches.ts +206 -0
  383. package/src/PileupRenderer/renderModifications.ts +74 -0
  384. package/src/PileupRenderer/renderPerBaseLettering.ts +67 -0
  385. package/src/PileupRenderer/renderPerBaseQuality.ts +46 -0
  386. package/src/PileupRenderer/renderSoftClipping.ts +78 -0
  387. package/src/PileupRenderer/sortUtil.ts +1 -3
  388. package/src/PileupRenderer/util.ts +63 -0
  389. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +0 -3
  390. package/src/SNPCoverageAdapter/generateCoverageBins.ts +111 -100
  391. package/src/SNPCoverageAdapter/index.ts +0 -2
  392. package/src/SNPCoverageAdapter/util.ts +33 -0
  393. package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +3 -3
  394. package/src/SNPCoverageRenderer/configSchema.ts +6 -0
  395. package/src/shared/BaseDisplayComponent.tsx +83 -0
  396. package/src/shared/FilterByTag.tsx +13 -23
  397. package/src/shared/afterAttach.tsx +66 -0
  398. package/src/shared/color.ts +59 -20
  399. package/src/shared/fetchChains.ts +23 -24
  400. package/src/shared/renderSvg.tsx +64 -0
  401. package/src/shared/util.ts +10 -0
  402. package/src/util.ts +54 -5
@@ -27,123 +27,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const BoxRendererType_1 = __importDefault(require("@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType"));
30
- const ui_1 = require("@jbrowse/core/ui");
31
30
  const util_1 = require("@jbrowse/core/util");
32
- const offscreenCanvasUtils_1 = require("@jbrowse/core/util/offscreenCanvasUtils");
33
31
  const dataAdapterCache_1 = require("@jbrowse/core/data_adapters/dataAdapterCache");
34
- const configuration_1 = require("@jbrowse/core/configuration");
32
+ const PileupLayoutSession_1 = require("./PileupLayoutSession");
35
33
  // locals
36
- const MismatchParser_1 = require("../MismatchParser");
37
- const sortUtil_1 = require("./sortUtil");
38
34
  const util_2 = require("../util");
39
- const PileupLayoutSession_1 = require("./PileupLayoutSession");
40
- function fillRect(ctx, l, t, w, h, cw, color) {
41
- if (l + w < 0 || l > cw) {
42
- return;
43
- }
44
- else {
45
- if (color) {
46
- ctx.fillStyle = color;
47
- }
48
- ctx.fillRect(l, t, w, h);
49
- }
50
- }
51
- function getColorBaseMap(theme) {
52
- const { bases } = theme.palette;
53
- return {
54
- A: bases.A.main,
55
- C: bases.C.main,
56
- G: bases.G.main,
57
- T: bases.T.main,
58
- deletion: '#808080', // gray
59
- };
60
- }
61
- function getContrastBaseMap(theme) {
62
- const map = getColorBaseMap(theme);
63
- return Object.fromEntries(Object.entries(map).map(([k, v]) => [k, theme.palette.getContrastText(v)]));
64
- }
65
- const alignmentColoring = {
66
- color_fwd_strand_not_proper: '#ECC8C8',
67
- color_rev_strand_not_proper: '#BEBED8',
68
- color_fwd_strand: '#EC8B8B',
69
- color_rev_strand: '#8F8FD8',
70
- color_fwd_missing_mate: '#D11919',
71
- color_rev_missing_mate: '#1919D1',
72
- color_fwd_diff_chr: '#000',
73
- color_rev_diff_chr: '#969696',
74
- color_pair_lr: '#c8c8c8',
75
- color_pair_rr: 'navy',
76
- color_pair_rl: 'teal',
77
- color_pair_ll: 'green',
78
- color_nostrand: '#c8c8c8',
79
- color_interchrom: 'orange',
80
- color_longinsert: 'red',
81
- color_shortinsert: 'pink',
82
- };
83
- function shouldDrawSNPsMuted(type) {
84
- return ['methylation', 'modifications'].includes(type || '');
85
- }
86
- function shouldDrawIndels(type) {
87
- return true;
88
- }
35
+ const layoutFeatures_1 = require("./layoutFeatures");
36
+ const makeImageData_1 = require("./makeImageData");
37
+ const configuration_1 = require("@jbrowse/core/configuration");
89
38
  class PileupRenderer extends BoxRendererType_1.default {
90
39
  constructor() {
91
40
  super(...arguments);
92
41
  this.supportsSVG = true;
93
42
  }
94
- // get width and height of chars the height is an approximation: width
95
- // letter M is approximately the height
96
- getCharWidthHeight() {
97
- const charWidth = (0, util_1.measureText)('A');
98
- const charHeight = (0, util_1.measureText)('M') - 2;
99
- return { charWidth, charHeight };
100
- }
101
- layoutFeature({ feature, layout, bpPerPx, region, showSoftClip, heightPx, displayMode, }) {
102
- let expansionBefore = 0;
103
- let expansionAfter = 0;
104
- // Expand the start and end of feature when softclipping enabled
105
- if (showSoftClip) {
106
- const mismatches = feature.get('mismatches');
107
- const seq = feature.get('seq');
108
- if (seq && mismatches) {
109
- for (let i = 0; i < mismatches.length; i += 1) {
110
- const { type, start, cliplen = 0 } = mismatches[i];
111
- if (type === 'softclip') {
112
- start === 0
113
- ? (expansionBefore = cliplen)
114
- : (expansionAfter = cliplen);
115
- }
116
- }
117
- }
118
- }
119
- const s = feature.get('start') - expansionBefore;
120
- const e = feature.get('end') + expansionAfter;
121
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s, e, region, bpPerPx);
122
- if (displayMode === 'compact') {
123
- heightPx /= 3;
124
- }
125
- if (feature.get('refName') !== region.refName) {
126
- throw new Error(`feature ${feature.id()} is not on the current region's reference sequence ${region.refName}`);
127
- }
128
- const topPx = layout.addRect(feature.id(), s, e, heightPx, feature);
129
- if (topPx === null) {
130
- return null;
43
+ async fetchSequence(renderProps) {
44
+ const { sessionId, regions, adapterConfig } = renderProps;
45
+ const { sequenceAdapter } = adapterConfig;
46
+ if (!sequenceAdapter) {
47
+ return undefined;
131
48
  }
132
- return {
133
- feature,
134
- leftPx,
135
- rightPx,
136
- topPx: displayMode === 'collapse' ? 0 : topPx,
137
- heightPx,
138
- };
49
+ const pm = this.pluginManager;
50
+ const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(pm, sessionId, sequenceAdapter);
51
+ const [region] = regions;
52
+ return (0, util_2.fetchSequence)(region, dataAdapter);
139
53
  }
140
- // expands region for clipping to use. possible improvement: use average read
141
- // size to set the heuristic maxClippingSize expansion (e.g. short reads
142
- // don't have to expand a softclipping size a lot, but long reads might)
143
54
  getExpandedRegion(region, renderArgs) {
144
55
  const { config, showSoftClip } = renderArgs;
145
- const maxClippingSize = (0, configuration_1.readConfObject)(config, 'maxClippingSize');
146
56
  const { start, end } = region;
57
+ const maxClippingSize = (0, configuration_1.readConfObject)(config, 'maxClippingSize');
147
58
  const bpExpansion = showSoftClip ? Math.round(maxClippingSize) : 0;
148
59
  return {
149
60
  // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
@@ -152,666 +63,13 @@ class PileupRenderer extends BoxRendererType_1.default {
152
63
  end: Math.ceil(end + bpExpansion),
153
64
  };
154
65
  }
155
- colorByOrientation(feature, config) {
156
- return alignmentColoring[this.getOrientation(feature, config) || 'color_nostrand'];
157
- }
158
- getOrientation(feature, config) {
159
- const orientationType = (0, configuration_1.readConfObject)(config, 'orientationType');
160
- const type = util_2.orientationTypes[orientationType];
161
- const orientation = type[feature.get('pair_orientation')];
162
- const map = {
163
- LR: 'color_pair_lr',
164
- RR: 'color_pair_rr',
165
- RL: 'color_pair_rl',
166
- LL: 'color_pair_ll',
167
- };
168
- return map[orientation];
169
- }
170
- colorByInsertSize(feature, _config) {
171
- return feature.get('is_paired') &&
172
- feature.get('refName') !== feature.get('next_ref')
173
- ? '#555'
174
- : `hsl(${Math.abs(feature.get('template_length')) / 10},50%,50%)`;
175
- }
176
- colorByStranded(feature, _config) {
177
- const flags = feature.get('flags');
178
- const strand = feature.get('strand');
179
- // is paired
180
- if (flags & 1) {
181
- const revflag = flags & 64;
182
- const flipper = revflag ? -1 : 1;
183
- // proper pairing
184
- if (flags & 2) {
185
- return strand * flipper === 1 ? 'color_rev_strand' : 'color_fwd_strand';
186
- }
187
- if (feature.get('multi_segment_next_segment_unmapped')) {
188
- return strand * flipper === 1
189
- ? 'color_rev_missing_mate'
190
- : 'color_fwd_missing_mate';
191
- }
192
- if (feature.get('refName') === feature.get('next_refName')) {
193
- return strand * flipper === 1
194
- ? 'color_rev_strand_not_proper'
195
- : 'color_fwd_strand_not_proper';
196
- }
197
- // should only leave aberrant chr
198
- return strand === 1 ? 'color_fwd_diff_chr' : 'color_rev_diff_chr';
199
- }
200
- return strand === 1 ? 'color_fwd_strand' : 'color_rev_strand';
201
- }
202
- colorByPerBaseLettering({ ctx, feat, region, bpPerPx, colorForBase, contrastForBase, charWidth, charHeight, canvasWidth, }) {
203
- const heightLim = charHeight - 2;
204
- const { feature, topPx, heightPx } = feat;
205
- const seq = feature.get('seq');
206
- const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
207
- const w = 1 / bpPerPx;
208
- const start = feature.get('start');
209
- let soffset = 0; // sequence offset
210
- let roffset = 0; // reference offset
211
- if (!seq) {
212
- return;
213
- }
214
- for (let i = 0; i < cigarOps.length; i += 2) {
215
- const len = +cigarOps[i];
216
- const op = cigarOps[i + 1];
217
- if (op === 'S' || op === 'I') {
218
- soffset += len;
219
- }
220
- else if (op === 'D' || op === 'N') {
221
- roffset += len;
222
- }
223
- else if (op === 'M' || op === 'X' || op === '=') {
224
- for (let m = 0; m < len; m++) {
225
- const letter = seq[soffset + m];
226
- const r = start + roffset + m;
227
- const [leftPx] = (0, util_1.bpSpanPx)(r, r + 1, region, bpPerPx);
228
- fillRect(ctx, leftPx, topPx, w + 0.5, heightPx, canvasWidth, colorForBase[letter]);
229
- if (w >= charWidth && heightPx >= heightLim) {
230
- // normal SNP coloring
231
- ctx.fillStyle = contrastForBase[letter];
232
- ctx.fillText(letter, leftPx + (w - charWidth) / 2 + 1, topPx + heightPx);
233
- }
234
- }
235
- soffset += len;
236
- roffset += len;
237
- }
238
- }
239
- }
240
- colorByPerBaseQuality({ ctx, feat, region, bpPerPx, canvasWidth, }) {
241
- const { feature, topPx, heightPx } = feat;
242
- const qual = feature.get('qual') || '';
243
- const scores = qual.split(' ').map(val => +val);
244
- const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
245
- const width = 1 / bpPerPx;
246
- const start = feature.get('start');
247
- let soffset = 0; // sequence offset
248
- let roffset = 0; // reference offset
249
- for (let i = 0; i < cigarOps.length; i += 2) {
250
- const len = +cigarOps[i];
251
- const op = cigarOps[i + 1];
252
- if (op === 'S' || op === 'I') {
253
- soffset += len;
254
- }
255
- else if (op === 'D' || op === 'N') {
256
- roffset += len;
257
- }
258
- else if (op === 'M' || op === 'X' || op === '=') {
259
- for (let m = 0; m < len; m++) {
260
- const score = scores[soffset + m];
261
- const [leftPx] = (0, util_1.bpSpanPx)(start + roffset + m, start + roffset + m + 1, region, bpPerPx);
262
- fillRect(ctx, leftPx, topPx, width + 0.5, heightPx, canvasWidth, `hsl(${score === 255 ? 150 : score * 1.5},55%,50%)`);
263
- }
264
- soffset += len;
265
- roffset += len;
266
- }
267
- }
268
- }
269
- // ML stores probabilities as array of numerics and MP is scaled phred scores
270
- // https://github.com/samtools/hts-specs/pull/418/files#diff-e765c6479316309f56b636f88189cdde8c40b854c7bdcce9ee7fe87a4e76febcR596
271
- //
272
- // if we have ML or Ml, it is an 8bit probability, divide by 255
273
- //
274
- // if we have MP or Mp it is phred scaled ASCII, which can go up to 90 but
275
- // has very high likelihood basecalls at that point, we really only care
276
- // about low qual calls <20 approx
277
- //
278
- colorByModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
279
- const { feature, topPx, heightPx } = feat;
280
- const { Color, modificationTagMap = {} } = renderArgs;
281
- const mm = (0, util_2.getTagAlt)(feature, 'MM', 'Mm') || '';
282
- const ml = (0, util_2.getTagAlt)(feature, 'ML', 'Ml') || [];
283
- const probabilities = ml
284
- ? (typeof ml === 'string' ? ml.split(',').map(e => +e) : ml).map(e => e / 255)
285
- : (0, util_2.getTagAlt)(feature, 'MP', 'Mp')
286
- .split('')
287
- .map(s => s.charCodeAt(0) - 33)
288
- .map(elt => Math.min(1, elt / 50));
289
- const cigar = feature.get('CIGAR');
290
- const start = feature.get('start');
291
- const seq = feature.get('seq');
292
- const strand = feature.get('strand');
293
- const cigarOps = (0, MismatchParser_1.parseCigar)(cigar);
294
- if (!seq) {
295
- return;
296
- }
297
- const modifications = (0, MismatchParser_1.getModificationPositions)(mm, seq, strand);
298
- // probIndex applies across multiple modifications e.g.
299
- let probIndex = 0;
300
- for (const { type, positions } of modifications) {
301
- const col = modificationTagMap[type] || 'black';
302
- // @ts-expect-error
303
- const base = Color(col);
304
- for (const readPos of (0, MismatchParser_1.getNextRefPos)(cigarOps, positions)) {
305
- const r = start + readPos;
306
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(r, r + 1, region, bpPerPx);
307
- // give it a little boost of 0.1 to not make them fully
308
- // invisible to avoid confusion
309
- const prob = probabilities[probIndex];
310
- fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, prob && prob !== 1
311
- ? base
312
- .alpha(prob + 0.1)
313
- .hsl()
314
- .string()
315
- : col);
316
- probIndex++;
317
- }
318
- }
319
- }
320
- // Color by methylation is slightly modified version of color by
321
- // modifications that focuses on CpG sites, with non-methylated CpG colored
322
- // blue
323
- colorByMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
324
- const { regionSequence } = renderArgs;
325
- const { feature, topPx, heightPx } = feat;
326
- const mm = (0, util_2.getTagAlt)(feature, 'MM', 'Mm') || '';
327
- if (!regionSequence) {
328
- throw new Error('region sequence required for methylation');
329
- }
330
- const cigar = feature.get('CIGAR');
331
- const fstart = feature.get('start');
332
- const fend = feature.get('end');
333
- const seq = feature.get('seq');
334
- const strand = feature.get('strand');
335
- const cigarOps = (0, MismatchParser_1.parseCigar)(cigar);
336
- if (!seq) {
337
- return;
338
- }
339
- const methBins = new Array(region.end - region.start).fill(0);
340
- const modifications = (0, MismatchParser_1.getModificationPositions)(mm, seq, strand);
341
- for (let i = 0; i < modifications.length; i++) {
342
- const { type, positions } = modifications[i];
343
- if (type === 'm' && positions) {
344
- for (const pos of (0, MismatchParser_1.getNextRefPos)(cigarOps, positions)) {
345
- const epos = pos + fstart - region.start;
346
- if (epos >= 0 && epos < methBins.length) {
347
- methBins[epos] = 1;
348
- }
349
- }
350
- }
351
- }
352
- for (let j = fstart; j < fend; j++) {
353
- const i = j - region.start;
354
- if (i >= 0 && i < methBins.length) {
355
- const l1 = regionSequence[i].toLowerCase();
356
- const l2 = regionSequence[i + 1].toLowerCase();
357
- // if we are zoomed out, display just a block over the cpg
358
- if (bpPerPx > 2) {
359
- if (l1 === 'c' && l2 === 'g') {
360
- const s = region.start + i;
361
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s, s + 2, region, bpPerPx);
362
- fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, methBins[i] || methBins[i + 1] ? 'red' : 'blue');
363
- }
364
- }
365
- // if we are zoomed in, color the c inside the cpg
366
- else {
367
- // color
368
- if (l1 === 'c' && l2 === 'g') {
369
- const s = region.start + i;
370
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s, s + 1, region, bpPerPx);
371
- fillRect(ctx, leftPx, topPx, rightPx - leftPx + 0.5, heightPx, canvasWidth, methBins[i] ? 'red' : 'blue');
372
- const [leftPx2, rightPx2] = (0, util_1.bpSpanPx)(s + 1, s + 2, region, bpPerPx);
373
- fillRect(ctx, leftPx2, topPx, rightPx2 - leftPx2 + 0.5, heightPx, canvasWidth, methBins[i + 1] ? 'red' : 'blue');
374
- }
375
- }
376
- }
377
- }
378
- }
379
- drawRect(ctx, feat, props) {
380
- const { regions, bpPerPx } = props;
381
- const { heightPx, topPx, feature } = feat;
382
- const [region] = regions;
383
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(feature.get('start'), feature.get('end'), region, bpPerPx);
384
- const flip = region.reversed ? -1 : 1;
385
- const strand = feature.get('strand') * flip;
386
- if (bpPerPx < 10) {
387
- if (strand === -1) {
388
- ctx.beginPath();
389
- ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
390
- ctx.lineTo(leftPx, topPx + heightPx);
391
- ctx.lineTo(rightPx, topPx + heightPx);
392
- ctx.lineTo(rightPx, topPx);
393
- ctx.lineTo(leftPx, topPx);
394
- ctx.closePath();
395
- ctx.fill();
396
- }
397
- else {
398
- ctx.beginPath();
399
- ctx.moveTo(leftPx, topPx);
400
- ctx.lineTo(leftPx, topPx + heightPx);
401
- ctx.lineTo(rightPx, topPx + heightPx);
402
- ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
403
- ctx.lineTo(rightPx, topPx);
404
- ctx.closePath();
405
- ctx.fill();
406
- }
407
- }
408
- else {
409
- ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
410
- }
411
- }
412
- drawAlignmentRect({ ctx, feat, renderArgs, colorForBase, contrastForBase, charWidth, charHeight, defaultColor, theme, canvasWidth, }) {
413
- const { config, bpPerPx, regions, colorBy, colorTagMap = {} } = renderArgs;
414
- const { tag = '', type: colorType = '' } = colorBy || {};
415
- const { feature } = feat;
416
- const region = regions[0];
417
- // first pass for simple color changes that change the color of the
418
- // alignment
419
- switch (colorType) {
420
- case 'insertSize':
421
- ctx.fillStyle = this.colorByInsertSize(feature, config);
422
- break;
423
- case 'strand':
424
- ctx.fillStyle = feature.get('strand') === -1 ? '#8F8FD8' : '#EC8B8B';
425
- break;
426
- case 'mappingQuality':
427
- ctx.fillStyle = `hsl(${feature.get('mq')},50%,50%)`;
428
- break;
429
- case 'pairOrientation':
430
- ctx.fillStyle = this.colorByOrientation(feature, config);
431
- break;
432
- case 'stranded':
433
- ctx.fillStyle = alignmentColoring[this.colorByStranded(feature, config)];
434
- break;
435
- case 'xs':
436
- case 'tag': {
437
- const tags = feature.get('tags');
438
- const val = tags ? tags[tag] : feature.get(tag);
439
- // special for for XS/TS tag
440
- if (tag === 'XS' || tag === 'TS') {
441
- const map = {
442
- '-': 'color_rev_strand',
443
- '+': 'color_fwd_strand',
444
- };
445
- ctx.fillStyle = alignmentColoring[map[val] || 'color_nostrand'];
446
- }
447
- // lower case 'ts' from minimap2 is flipped from xs
448
- if (tag === 'ts') {
449
- const map = {
450
- '-': feature.get('strand') === -1
451
- ? 'color_fwd_strand'
452
- : 'color_rev_strand',
453
- '+': feature.get('strand') === -1
454
- ? 'color_rev_strand'
455
- : 'color_fwd_strand',
456
- };
457
- ctx.fillStyle = alignmentColoring[map[val] || 'color_nostrand'];
458
- }
459
- // tag is not one of the autofilled tags, has color-value pairs from
460
- // fetchValues
461
- else {
462
- const foundValue = colorTagMap[val];
463
- ctx.fillStyle = foundValue || alignmentColoring['color_nostrand'];
464
- }
465
- break;
466
- }
467
- case 'insertSizeAndPairOrientation': {
468
- break;
469
- }
470
- case 'modifications':
471
- case 'methylation': {
472
- // this coloring is similar to igv.js, and is helpful to color negative
473
- // strand reads differently because their c-g will be flipped (e.g. g-c
474
- // read right to left)
475
- ctx.fillStyle = feature.get('flags') & 16 ? '#c8dcc8' : '#c8c8c8';
476
- break;
477
- }
478
- default: {
479
- ctx.fillStyle = defaultColor
480
- ? 'lightgrey'
481
- : (0, configuration_1.readConfObject)(config, 'color', { feature });
482
- break;
483
- }
484
- }
485
- this.drawRect(ctx, feat, renderArgs);
486
- // second pass for color types that render per-base things that go over the
487
- // existing drawing
488
- switch (colorType) {
489
- case 'perBaseQuality':
490
- this.colorByPerBaseQuality({
491
- ctx,
492
- feat,
493
- region,
494
- bpPerPx,
495
- canvasWidth,
496
- });
497
- break;
498
- case 'perBaseLettering':
499
- this.colorByPerBaseLettering({
500
- ctx,
501
- feat,
502
- region,
503
- bpPerPx,
504
- colorForBase,
505
- contrastForBase,
506
- charWidth,
507
- charHeight,
508
- canvasWidth,
509
- });
510
- break;
511
- case 'modifications':
512
- this.colorByModifications({
513
- ctx,
514
- feat,
515
- region,
516
- bpPerPx,
517
- renderArgs,
518
- canvasWidth,
519
- });
520
- break;
521
- case 'methylation':
522
- this.colorByMethylation({
523
- ctx,
524
- feat,
525
- region,
526
- bpPerPx,
527
- renderArgs,
528
- canvasWidth,
529
- });
530
- break;
531
- }
532
- }
533
- drawMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInsertionIndicatorScale, mismatchAlpha, charWidth, charHeight, colorForBase, contrastForBase, canvasWidth, drawSNPsMuted, drawIndels = true, }) {
534
- const { Color, bpPerPx, regions } = renderArgs;
535
- const { heightPx, topPx, feature } = feat;
536
- const [region] = regions;
537
- const start = feature.get('start');
538
- const pxPerBp = Math.min(1 / bpPerPx, 2);
539
- const w = Math.max(minSubfeatureWidth, pxPerBp);
540
- const mismatches = feature.get('mismatches');
541
- const heightLim = charHeight - 2;
542
- // extraHorizontallyFlippedOffset is used to draw interbase items, which
543
- // are located to the left when forward and right when reversed
544
- const extraHorizontallyFlippedOffset = region.reversed
545
- ? 1 / bpPerPx + 1
546
- : -1;
547
- if (!mismatches) {
548
- return;
549
- }
550
- // two pass rendering: first pass, draw all the mismatches except wide
551
- // insertion markers
552
- for (let i = 0; i < mismatches.length; i += 1) {
553
- const mismatch = mismatches[i];
554
- const mstart = start + mismatch.start;
555
- const mlen = mismatch.length;
556
- const mbase = mismatch.base;
557
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
558
- const widthPx = Math.max(minSubfeatureWidth, Math.abs(leftPx - rightPx));
559
- if (mismatch.type === 'mismatch') {
560
- if (!drawSNPsMuted) {
561
- const baseColor = colorForBase[mismatch.base] || '#888';
562
- fillRect(ctx, Math.round(leftPx), topPx, widthPx, heightPx, canvasWidth, mismatchAlpha
563
- ? mismatch.qual === undefined
564
- ? baseColor
565
- : // @ts-expect-error
566
- Color(baseColor)
567
- .alpha(Math.min(1, mismatch.qual / 50))
568
- .hsl()
569
- .string()
570
- : baseColor);
571
- }
572
- if (widthPx >= charWidth && heightPx >= heightLim) {
573
- // normal SNP coloring
574
- const contrastColor = drawSNPsMuted
575
- ? 'black'
576
- : contrastForBase[mismatch.base] || 'black';
577
- ctx.fillStyle = mismatchAlpha
578
- ? mismatch.qual === undefined
579
- ? contrastColor
580
- : // @ts-expect-error
581
- Color(contrastColor)
582
- .alpha(Math.min(1, mismatch.qual / 50))
583
- .hsl()
584
- .string()
585
- : contrastColor;
586
- ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
587
- }
588
- }
589
- else if (mismatch.type === 'deletion' && drawIndels) {
590
- fillRect(ctx, leftPx, topPx, Math.abs(leftPx - rightPx), heightPx, canvasWidth, colorForBase.deletion);
591
- const txt = `${mismatch.length}`;
592
- const rwidth = (0, util_1.measureText)(txt, 10);
593
- if (widthPx >= rwidth && heightPx >= heightLim) {
594
- ctx.fillStyle = contrastForBase.deletion;
595
- ctx.fillText(txt, (leftPx + rightPx) / 2 - rwidth / 2, topPx + heightPx);
596
- }
597
- }
598
- else if (mismatch.type === 'insertion' && drawIndels) {
599
- ctx.fillStyle = 'purple';
600
- const pos = leftPx + extraHorizontallyFlippedOffset;
601
- const len = +mismatch.base || mismatch.length;
602
- const insW = Math.max(0, Math.min(1.2, 1 / bpPerPx));
603
- if (len < 10) {
604
- fillRect(ctx, pos, topPx, insW, heightPx, canvasWidth, 'purple');
605
- if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
606
- fillRect(ctx, pos - insW, topPx, insW * 3, 1, canvasWidth);
607
- fillRect(ctx, pos - insW, topPx + heightPx - 1, insW * 3, 1, canvasWidth);
608
- ctx.fillText(`(${mismatch.base})`, pos + 3, topPx + heightPx);
609
- }
610
- }
611
- }
612
- else if (mismatch.type === 'hardclip' || mismatch.type === 'softclip') {
613
- const pos = leftPx + extraHorizontallyFlippedOffset;
614
- fillRect(ctx, pos, topPx, w, heightPx, canvasWidth, mismatch.type === 'hardclip' ? 'red' : 'blue');
615
- if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
616
- fillRect(ctx, pos - w, topPx, w * 3, 1, canvasWidth);
617
- fillRect(ctx, pos - w, topPx + heightPx - 1, w * 3, 1, canvasWidth);
618
- ctx.fillText(`(${mismatch.base})`, pos + 3, topPx + heightPx);
619
- }
620
- }
621
- else if (mismatch.type === 'skip') {
622
- // fix to avoid bad rendering note that this was also related to chrome
623
- // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1131528
624
- // also affected firefox ref #1236 #2750
625
- if (leftPx + widthPx > 0) {
626
- // make small exons more visible when zoomed far out
627
- const adjustPx = widthPx - (bpPerPx > 10 ? 1.5 : 0);
628
- ctx.clearRect(leftPx, topPx, adjustPx, heightPx);
629
- fillRect(ctx, Math.max(0, leftPx), topPx + heightPx / 2 - 1, adjustPx + (leftPx < 0 ? leftPx : 0), 2, canvasWidth, '#333');
630
- }
631
- }
632
- }
633
- // second pass, draw wide insertion markers on top
634
- if (drawIndels) {
635
- for (let i = 0; i < mismatches.length; i += 1) {
636
- const mismatch = mismatches[i];
637
- const mstart = start + mismatch.start;
638
- const mlen = mismatch.length;
639
- const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
640
- const len = +mismatch.base || mismatch.length;
641
- const txt = `${len}`;
642
- if (mismatch.type === 'insertion' && len >= 10) {
643
- if (bpPerPx > largeInsertionIndicatorScale) {
644
- fillRect(ctx, leftPx - 1, topPx, 2, heightPx, canvasWidth, 'purple');
645
- }
646
- else if (heightPx > charHeight) {
647
- const rwidth = (0, util_1.measureText)(txt);
648
- const padding = 5;
649
- fillRect(ctx, leftPx - rwidth / 2 - padding, topPx, rwidth + 2 * padding, heightPx, canvasWidth, 'purple');
650
- ctx.fillStyle = 'white';
651
- ctx.fillText(txt, leftPx - rwidth / 2, topPx + heightPx);
652
- }
653
- else {
654
- const padding = 2;
655
- fillRect(ctx, leftPx - padding, topPx, 2 * padding, heightPx, canvasWidth, 'purple');
656
- }
657
- }
658
- }
659
- }
660
- }
661
- drawSoftClipping({ ctx, feat, renderArgs, config, theme, canvasWidth, }) {
662
- const { feature, topPx, heightPx } = feat;
663
- const { regions, bpPerPx } = renderArgs;
664
- const [region] = regions;
665
- const minFeatWidth = (0, configuration_1.readConfObject)(config, 'minSubfeatureWidth');
666
- const mismatches = feature.get('mismatches');
667
- const seq = feature.get('seq');
668
- const { charWidth, charHeight } = this.getCharWidthHeight();
669
- const { bases } = theme.palette;
670
- const colorForBase = {
671
- A: bases.A.main,
672
- C: bases.C.main,
673
- G: bases.G.main,
674
- T: bases.T.main,
675
- deletion: '#808080', // gray
676
- };
677
- // Display all bases softclipped off in lightened colors
678
- if (!(seq && mismatches)) {
679
- return;
680
- }
681
- mismatches
682
- .filter(mismatch => mismatch.type === 'softclip')
683
- .forEach(mismatch => {
684
- const len = mismatch.cliplen || 0;
685
- const s = feature.get('start');
686
- const start = mismatch.start === 0 ? s - len : s + mismatch.start;
687
- for (let k = 0; k < len; k += 1) {
688
- const base = seq.charAt(k + mismatch.start);
689
- // If softclip length+start is longer than sequence, no need to
690
- // continue showing base
691
- if (!base) {
692
- return;
693
- }
694
- const [leftPx, rightPx] = (0, util_1.bpSpanPx)(start + k, start + k + 1, region, bpPerPx);
695
- const widthPx = Math.max(minFeatWidth, rightPx - leftPx);
696
- // Black accounts for IUPAC ambiguity code bases such as N that
697
- // show in soft clipping
698
- const baseColor = colorForBase[base] || '#000000';
699
- ctx.fillStyle = baseColor;
700
- fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth);
701
- if (widthPx >= charWidth && heightPx >= charHeight - 5) {
702
- ctx.fillStyle = theme.palette.getContrastText(baseColor);
703
- ctx.fillText(base, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
704
- }
705
- }
706
- });
707
- }
708
- makeImageData({ ctx, layoutRecords, canvasWidth, renderArgs, }) {
709
- const { layout, config, showSoftClip, colorBy, theme: configTheme, } = renderArgs;
710
- const mismatchAlpha = (0, configuration_1.readConfObject)(config, 'mismatchAlpha');
711
- const minSubfeatureWidth = (0, configuration_1.readConfObject)(config, 'minSubfeatureWidth');
712
- const largeInsertionIndicatorScale = (0, configuration_1.readConfObject)(config, 'largeInsertionIndicatorScale');
713
- const defaultColor = (0, configuration_1.readConfObject)(config, 'color') === '#f0f';
714
- const theme = (0, ui_1.createJBrowseTheme)(configTheme);
715
- const colorForBase = getColorBaseMap(theme);
716
- const contrastForBase = getContrastBaseMap(theme);
717
- if (!layout) {
718
- throw new Error(`layout required`);
719
- }
720
- if (!layout.addRect) {
721
- throw new Error('invalid layout object');
722
- }
723
- ctx.font = 'bold 10px Courier New,monospace';
724
- const { charWidth, charHeight } = this.getCharWidthHeight();
725
- const drawSNPsMuted = shouldDrawSNPsMuted(colorBy === null || colorBy === void 0 ? void 0 : colorBy.type);
726
- const drawIndels = shouldDrawIndels(colorBy === null || colorBy === void 0 ? void 0 : colorBy.type);
727
- for (let i = 0; i < layoutRecords.length; i++) {
728
- const feat = layoutRecords[i];
729
- if (feat === null) {
730
- continue;
731
- }
732
- this.drawAlignmentRect({
733
- ctx,
734
- feat,
735
- renderArgs,
736
- defaultColor,
737
- colorForBase,
738
- contrastForBase,
739
- charWidth,
740
- charHeight,
741
- canvasWidth,
742
- theme,
743
- });
744
- this.drawMismatches({
745
- ctx,
746
- feat,
747
- renderArgs,
748
- mismatchAlpha,
749
- drawSNPsMuted,
750
- drawIndels,
751
- largeInsertionIndicatorScale,
752
- minSubfeatureWidth,
753
- charWidth,
754
- charHeight,
755
- colorForBase,
756
- contrastForBase,
757
- canvasWidth,
758
- theme,
759
- });
760
- if (showSoftClip) {
761
- this.drawSoftClipping({
762
- ctx,
763
- feat,
764
- renderArgs,
765
- config,
766
- theme,
767
- canvasWidth,
768
- });
769
- }
770
- }
771
- }
772
- // we perform a full layout before render as a separate method because the
773
- // layout determines the height of the canvas that we use to render
774
- layoutFeats(props) {
775
- const { layout, features, sortedBy, config, bpPerPx, showSoftClip, regions, } = props;
776
- const [region] = regions;
777
- if (!layout) {
778
- throw new Error(`layout required`);
779
- }
780
- if (!layout.addRect) {
781
- throw new Error('invalid layout object');
782
- }
783
- const featureMap = (sortedBy === null || sortedBy === void 0 ? void 0 : sortedBy.type) && region.start === sortedBy.pos
784
- ? (0, sortUtil_1.sortFeature)(features, sortedBy)
785
- : features;
786
- const heightPx = (0, configuration_1.readConfObject)(config, 'height');
787
- const displayMode = (0, configuration_1.readConfObject)(config, 'displayMode');
788
- return (0, util_1.iterMap)(featureMap.values(), feature => this.layoutFeature({
789
- feature,
790
- layout,
791
- bpPerPx,
792
- region,
793
- showSoftClip,
794
- heightPx,
795
- displayMode,
796
- }), featureMap.size);
797
- }
798
- async fetchSequence(renderProps) {
799
- const { sessionId, regions, adapterConfig } = renderProps;
800
- const { sequenceAdapter } = adapterConfig;
801
- if (!sequenceAdapter) {
802
- return undefined;
803
- }
804
- const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, sequenceAdapter);
805
- const [region] = regions;
806
- return (0, util_2.fetchSequence)(region, dataAdapter);
807
- }
808
66
  async render(renderProps) {
809
67
  var _a;
810
68
  const features = await this.getFeatures(renderProps);
811
69
  const layout = this.createLayoutInWorker(renderProps);
812
70
  const { regions, bpPerPx } = renderProps;
813
71
  const [region] = regions;
814
- const layoutRecords = this.layoutFeats({
72
+ const layoutRecords = (0, layoutFeatures_1.layoutFeats)({
815
73
  ...renderProps,
816
74
  features,
817
75
  layout,
@@ -821,13 +79,12 @@ class PileupRenderer extends BoxRendererType_1.default {
821
79
  const regionSequence = features.size && (0, util_2.shouldFetchReferenceSequence)((_a = renderProps.colorBy) === null || _a === void 0 ? void 0 : _a.type)
822
80
  ? await this.fetchSequence(renderProps)
823
81
  : undefined;
824
- const { end, start } = region;
825
- const width = (end - start) / bpPerPx;
82
+ const width = (region.end - region.start) / bpPerPx;
826
83
  const height = Math.max(layout.getTotalHeight(), 1);
827
84
  const Color = await Promise.resolve().then(() => __importStar(require('color'))).then(f => f.default);
828
- const res = await (0, offscreenCanvasUtils_1.renderToAbstractCanvas)(width, height, renderProps, ctx => this.makeImageData({
85
+ const res = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => (0, makeImageData_1.makeImageData)({
829
86
  ctx,
830
- layoutRecords,
87
+ layoutRecords: layoutRecords.filter(util_1.notEmpty),
831
88
  canvasWidth: width,
832
89
  renderArgs: {
833
90
  ...renderProps,