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