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