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