@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
@@ -0,0 +1,206 @@
1
+ import { bpSpanPx, measureText } from '@jbrowse/core/util'
2
+ import { Mismatch } from '../MismatchParser'
3
+ import { fillRect, LayoutFeature } from './util'
4
+ import { RenderArgsWithColor } from './makeImageData'
5
+
6
+ export function renderMismatches({
7
+ ctx,
8
+ feat,
9
+ renderArgs,
10
+ minSubfeatureWidth,
11
+ largeInsertionIndicatorScale,
12
+ mismatchAlpha,
13
+ charWidth,
14
+ charHeight,
15
+ colorForBase,
16
+ contrastForBase,
17
+ canvasWidth,
18
+ drawSNPsMuted,
19
+ drawIndels = true,
20
+ }: {
21
+ ctx: CanvasRenderingContext2D
22
+ feat: LayoutFeature
23
+ renderArgs: RenderArgsWithColor
24
+ colorForBase: { [key: string]: string }
25
+ contrastForBase: { [key: string]: string }
26
+ mismatchAlpha?: boolean
27
+ drawIndels?: boolean
28
+ drawSNPsMuted?: boolean
29
+ minSubfeatureWidth: number
30
+ largeInsertionIndicatorScale: number
31
+ charWidth: number
32
+ charHeight: number
33
+ canvasWidth: number
34
+ }) {
35
+ const { Color, bpPerPx, regions } = renderArgs
36
+ const { heightPx, topPx, feature } = feat
37
+ const [region] = regions
38
+ const start = feature.get('start')
39
+
40
+ const pxPerBp = Math.min(1 / bpPerPx, 2)
41
+ const mismatches = feature.get('mismatches') as Mismatch[] | undefined
42
+ const heightLim = charHeight - 2
43
+
44
+ // extraHorizontallyFlippedOffset is used to draw interbase items, which
45
+ // are located to the left when forward and right when reversed
46
+ const extraHorizontallyFlippedOffset = region.reversed ? 1 / bpPerPx + 1 : -1
47
+
48
+ if (!mismatches) {
49
+ return
50
+ }
51
+
52
+ // two pass rendering: first pass, draw all the mismatches except wide
53
+ // insertion markers
54
+ for (let i = 0; i < mismatches.length; i += 1) {
55
+ const mismatch = mismatches[i]
56
+ const mstart = start + mismatch.start
57
+ const mlen = mismatch.length
58
+ const mbase = mismatch.base
59
+ const [leftPx, rightPx] = bpSpanPx(mstart, mstart + mlen, region, bpPerPx)
60
+ const widthPx = Math.max(minSubfeatureWidth, Math.abs(leftPx - rightPx))
61
+ if (mismatch.type === 'mismatch') {
62
+ if (!drawSNPsMuted) {
63
+ const baseColor = colorForBase[mismatch.base] || '#888'
64
+ const c = mismatchAlpha
65
+ ? mismatch.qual === undefined
66
+ ? baseColor
67
+ : Color(baseColor)
68
+ .alpha(Math.min(1, mismatch.qual / 50))
69
+ .hsl()
70
+ .string()
71
+ : baseColor
72
+
73
+ fillRect(
74
+ ctx,
75
+ Math.round(leftPx),
76
+ topPx,
77
+ widthPx,
78
+ heightPx,
79
+ canvasWidth,
80
+ c,
81
+ )
82
+ }
83
+
84
+ if (widthPx >= charWidth && heightPx >= heightLim) {
85
+ // normal SNP coloring
86
+ const contrastColor = drawSNPsMuted
87
+ ? 'black'
88
+ : contrastForBase[mismatch.base] || 'black'
89
+ ctx.fillStyle = mismatchAlpha
90
+ ? mismatch.qual === undefined
91
+ ? contrastColor
92
+ : Color(contrastColor)
93
+ .alpha(Math.min(1, mismatch.qual / 50))
94
+ .hsl()
95
+ .string()
96
+ : contrastColor
97
+ ctx.fillText(
98
+ mbase,
99
+ leftPx + (widthPx - charWidth) / 2 + 1,
100
+ topPx + heightPx,
101
+ )
102
+ }
103
+ } else if (mismatch.type === 'deletion' && drawIndels) {
104
+ fillRect(
105
+ ctx,
106
+ leftPx,
107
+ topPx,
108
+ Math.abs(leftPx - rightPx),
109
+ heightPx,
110
+ canvasWidth,
111
+ colorForBase.deletion,
112
+ )
113
+ const txt = `${mismatch.length}`
114
+ const rwidth = measureText(txt, 10)
115
+ if (widthPx >= rwidth && heightPx >= heightLim) {
116
+ ctx.fillStyle = contrastForBase.deletion
117
+ ctx.fillText(txt, (leftPx + rightPx) / 2 - rwidth / 2, topPx + heightPx)
118
+ }
119
+ } else if (mismatch.type === 'insertion' && drawIndels) {
120
+ ctx.fillStyle = 'purple'
121
+ const pos = leftPx + extraHorizontallyFlippedOffset
122
+ const len = +mismatch.base || mismatch.length
123
+ const insW = Math.max(0, Math.min(1.2, 1 / bpPerPx))
124
+ if (len < 10) {
125
+ fillRect(ctx, pos, topPx, insW, heightPx, canvasWidth, 'purple')
126
+ if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
127
+ const l = pos - insW
128
+ fillRect(ctx, l, topPx, insW * 3, 1, canvasWidth)
129
+ fillRect(ctx, l, topPx + heightPx - 1, insW * 3, 1, canvasWidth)
130
+ ctx.fillText(`(${mismatch.base})`, pos + 3, topPx + heightPx)
131
+ }
132
+ }
133
+ } else if (mismatch.type === 'hardclip' || mismatch.type === 'softclip') {
134
+ const pos = leftPx + extraHorizontallyFlippedOffset
135
+ const c = mismatch.type === 'hardclip' ? 'red' : 'blue'
136
+ const clipW = Math.max(minSubfeatureWidth, pxPerBp)
137
+ fillRect(ctx, pos, topPx, clipW, heightPx, canvasWidth, c)
138
+ if (1 / bpPerPx >= charWidth && heightPx >= heightLim) {
139
+ const l = pos - clipW
140
+ fillRect(ctx, l, topPx, clipW * 3, 1, canvasWidth)
141
+ fillRect(ctx, l, topPx + heightPx - 1, clipW * 3, 1, canvasWidth)
142
+ ctx.fillText(`(${mismatch.base})`, pos + 3, topPx + heightPx)
143
+ }
144
+ } else if (mismatch.type === 'skip') {
145
+ // fix to avoid bad rendering note that this was also related to chrome
146
+ // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1131528
147
+ // also affected firefox ref #1236 #2750
148
+ if (leftPx + widthPx > 0) {
149
+ // make small exons more visible when zoomed far out
150
+ const adjustPx = widthPx - (bpPerPx > 10 ? 1.5 : 0)
151
+ ctx.clearRect(leftPx, topPx, adjustPx, heightPx)
152
+ fillRect(
153
+ ctx,
154
+ Math.max(0, leftPx),
155
+ topPx + heightPx / 2 - 1,
156
+ adjustPx + (leftPx < 0 ? leftPx : 0),
157
+ 2,
158
+ canvasWidth,
159
+ '#333',
160
+ )
161
+ }
162
+ }
163
+ }
164
+
165
+ // second pass, draw wide insertion markers on top
166
+ if (drawIndels) {
167
+ for (let i = 0; i < mismatches.length; i += 1) {
168
+ const mismatch = mismatches[i]
169
+ const mstart = start + mismatch.start
170
+ const mlen = mismatch.length
171
+ const [leftPx] = bpSpanPx(mstart, mstart + mlen, region, bpPerPx)
172
+ const len = +mismatch.base || mismatch.length
173
+ const txt = `${len}`
174
+ if (mismatch.type === 'insertion' && len >= 10) {
175
+ if (bpPerPx > largeInsertionIndicatorScale) {
176
+ fillRect(ctx, leftPx - 1, topPx, 2, heightPx, canvasWidth, 'purple')
177
+ } else if (heightPx > charHeight) {
178
+ const rwidth = measureText(txt)
179
+ const padding = 5
180
+ fillRect(
181
+ ctx,
182
+ leftPx - rwidth / 2 - padding,
183
+ topPx,
184
+ rwidth + 2 * padding,
185
+ heightPx,
186
+ canvasWidth,
187
+ 'purple',
188
+ )
189
+ ctx.fillStyle = 'white'
190
+ ctx.fillText(txt, leftPx - rwidth / 2, topPx + heightPx)
191
+ } else {
192
+ const padding = 2
193
+ fillRect(
194
+ ctx,
195
+ leftPx - padding,
196
+ topPx,
197
+ 2 * padding,
198
+ heightPx,
199
+ canvasWidth,
200
+ 'purple',
201
+ )
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
@@ -0,0 +1,74 @@
1
+ import { bpSpanPx, Region } from '@jbrowse/core/util'
2
+ import {
3
+ getModificationPositions,
4
+ getModificationProbabilities,
5
+ getNextRefPos,
6
+ parseCigar,
7
+ } from '../MismatchParser'
8
+ import { getTagAlt } from '../util'
9
+ import { fillRect, LayoutFeature } from './util'
10
+ import { RenderArgsWithColor } from './makeImageData'
11
+
12
+ // render modifications stored in MM tag in BAM
13
+ //
14
+ // ML stores probabilities as array of numerics and MP is scaled phred scores
15
+ // https://github.com/samtools/hts-specs/pull/418/files#diff-e765c6479316309f56b636f88189cdde8c40b854c7bdcce9ee7fe87a4e76febcR596
16
+ //
17
+ // if we have ML or Ml, it is an 8bit probability, divide by 255
18
+ //
19
+ // if we have MP or Mp it is phred scaled ASCII, which can go up to 90 but
20
+ // has very high likelihood basecalls at that point, we really only care
21
+ // about low qual calls <20 approx
22
+ export function renderModifications({
23
+ ctx,
24
+ feat,
25
+ region,
26
+ bpPerPx,
27
+ renderArgs,
28
+ canvasWidth,
29
+ }: {
30
+ ctx: CanvasRenderingContext2D
31
+ feat: LayoutFeature
32
+ region: Region
33
+ bpPerPx: number
34
+ renderArgs: RenderArgsWithColor
35
+ canvasWidth: number
36
+ }) {
37
+ const { feature, topPx, heightPx } = feat
38
+ const { Color, modificationTagMap = {} } = renderArgs
39
+
40
+ const seq = feature.get('seq') as string | undefined
41
+
42
+ if (!seq) {
43
+ return
44
+ }
45
+ const mm = (getTagAlt(feature, 'MM', 'Mm') as string) || ''
46
+ const cigar = feature.get('CIGAR')
47
+ const start = feature.get('start')
48
+ const strand = feature.get('strand')
49
+ const cigarOps = parseCigar(cigar)
50
+ const probabilities = getModificationProbabilities(feature)
51
+ const modifications = getModificationPositions(mm, seq, strand)
52
+
53
+ // probIndex applies across multiple modifications e.g.
54
+ let probIndex = 0
55
+ for (const { type, positions } of modifications) {
56
+ const col = modificationTagMap[type] || 'black'
57
+ const base = Color(col)
58
+ for (const readPos of getNextRefPos(cigarOps, positions)) {
59
+ const r = start + readPos
60
+ const [leftPx, rightPx] = bpSpanPx(r, r + 1, region, bpPerPx)
61
+ const prob = probabilities?.[probIndex] || 0
62
+ const c =
63
+ prob !== 1
64
+ ? base
65
+ .alpha(prob + 0.1)
66
+ .hsl()
67
+ .string()
68
+ : col
69
+ const w = rightPx - leftPx + 0.5
70
+ fillRect(ctx, leftPx, topPx, w, heightPx, canvasWidth, c)
71
+ probIndex++
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,67 @@
1
+ import { bpSpanPx, Region } from '@jbrowse/core/util'
2
+ import { parseCigar } from '../MismatchParser'
3
+ import { fillRect, LayoutFeature } from './util'
4
+
5
+ export function renderPerBaseLettering({
6
+ ctx,
7
+ feat,
8
+ region,
9
+ bpPerPx,
10
+ colorForBase,
11
+ contrastForBase,
12
+ charWidth,
13
+ charHeight,
14
+ canvasWidth,
15
+ }: {
16
+ ctx: CanvasRenderingContext2D
17
+ feat: LayoutFeature
18
+ region: Region
19
+ bpPerPx: number
20
+ colorForBase: Record<string, string>
21
+ contrastForBase: Record<string, string>
22
+ charWidth: number
23
+ charHeight: number
24
+ canvasWidth: number
25
+ }) {
26
+ const heightLim = charHeight - 2
27
+ const { feature, topPx, heightPx } = feat
28
+ const seq = feature.get('seq') as string | undefined
29
+ const cigarOps = parseCigar(feature.get('CIGAR'))
30
+ const w = 1 / bpPerPx
31
+ const start = feature.get('start')
32
+ let soffset = 0
33
+ let roffset = 0
34
+
35
+ if (!seq) {
36
+ return
37
+ }
38
+ for (let i = 0; i < cigarOps.length; i += 2) {
39
+ const len = +cigarOps[i]
40
+ const op = cigarOps[i + 1]
41
+ if (op === 'S' || op === 'I') {
42
+ soffset += len
43
+ } else if (op === 'D' || op === 'N') {
44
+ roffset += len
45
+ } else if (op === 'M' || op === 'X' || op === '=') {
46
+ for (let m = 0; m < len; m++) {
47
+ const letter = seq[soffset + m]
48
+ const r = start + roffset + m
49
+ const [leftPx] = bpSpanPx(r, r + 1, region, bpPerPx)
50
+ const c = colorForBase[letter]
51
+ fillRect(ctx, leftPx, topPx, w + 0.5, heightPx, canvasWidth, c)
52
+
53
+ if (w >= charWidth && heightPx >= heightLim) {
54
+ // normal SNP coloring
55
+ ctx.fillStyle = contrastForBase[letter]
56
+ ctx.fillText(
57
+ letter,
58
+ leftPx + (w - charWidth) / 2 + 1,
59
+ topPx + heightPx,
60
+ )
61
+ }
62
+ }
63
+ soffset += len
64
+ roffset += len
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,46 @@
1
+ import { bpSpanPx, Region } from '@jbrowse/core/util'
2
+ import { parseCigar } from '../MismatchParser'
3
+ import { fillRect, LayoutFeature } from './util'
4
+
5
+ export function renderPerBaseQuality({
6
+ ctx,
7
+ feat,
8
+ region,
9
+ bpPerPx,
10
+ canvasWidth,
11
+ }: {
12
+ ctx: CanvasRenderingContext2D
13
+ feat: LayoutFeature
14
+ region: Region
15
+ bpPerPx: number
16
+ canvasWidth: number
17
+ }) {
18
+ const { feature, topPx, heightPx } = feat
19
+ const qual: string = feature.get('qual') || ''
20
+ const scores = qual.split(' ').map(val => +val)
21
+ const cigarOps = parseCigar(feature.get('CIGAR'))
22
+ const w = 1 / bpPerPx
23
+ const start = feature.get('start')
24
+ let soffset = 0 // sequence offset
25
+ let roffset = 0 // reference offset
26
+
27
+ for (let i = 0; i < cigarOps.length; i += 2) {
28
+ const len = +cigarOps[i]
29
+ const op = cigarOps[i + 1]
30
+ if (op === 'S' || op === 'I') {
31
+ soffset += len
32
+ } else if (op === 'D' || op === 'N') {
33
+ roffset += len
34
+ } else if (op === 'M' || op === 'X' || op === '=') {
35
+ for (let m = 0; m < len; m++) {
36
+ const score = scores[soffset + m]
37
+ const start0 = start + roffset + m
38
+ const leftPx = bpSpanPx(start0, start0 + 1, region, bpPerPx)[0]
39
+ const c = `hsl(${score === 255 ? 150 : score * 1.5},55%,50%)`
40
+ fillRect(ctx, leftPx, topPx, w + 0.5, heightPx, canvasWidth, c)
41
+ }
42
+ soffset += len
43
+ roffset += len
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,78 @@
1
+ import {
2
+ AnyConfigurationModel,
3
+ readConfObject,
4
+ } from '@jbrowse/core/configuration'
5
+ import { bpSpanPx } from '@jbrowse/core/util'
6
+ import { Theme } from '@mui/material'
7
+
8
+ // locals
9
+ import { Mismatch } from '../MismatchParser'
10
+ import { RenderArgsDeserializedWithFeaturesAndLayout } from './PileupRenderer'
11
+ import { fillRect, getCharWidthHeight, LayoutFeature } from './util'
12
+
13
+ export function renderSoftClipping({
14
+ ctx,
15
+ feat,
16
+ renderArgs,
17
+ config,
18
+ theme,
19
+ colorForBase,
20
+ canvasWidth,
21
+ }: {
22
+ ctx: CanvasRenderingContext2D
23
+ feat: LayoutFeature
24
+ renderArgs: RenderArgsDeserializedWithFeaturesAndLayout
25
+ config: AnyConfigurationModel
26
+ colorForBase: Record<string, string>
27
+ theme: Theme
28
+ canvasWidth: number
29
+ }) {
30
+ const { feature, topPx, heightPx } = feat
31
+ const { regions, bpPerPx } = renderArgs
32
+ const [region] = regions
33
+ const minFeatWidth = readConfObject(config, 'minSubfeatureWidth')
34
+ const mismatches = feature.get('mismatches') as Mismatch[] | undefined
35
+ const seq = feature.get('seq') as string | undefined
36
+ const { charWidth, charHeight } = getCharWidthHeight()
37
+
38
+ // Display all bases softclipped off in lightened colors
39
+ if (!(seq && mismatches)) {
40
+ return
41
+ }
42
+ mismatches
43
+ .filter(mismatch => mismatch.type === 'softclip')
44
+ .forEach(mismatch => {
45
+ const len = mismatch.cliplen || 0
46
+ const s = feature.get('start')
47
+ const start = mismatch.start === 0 ? s - len : s + mismatch.start
48
+
49
+ for (let k = 0; k < len; k += 1) {
50
+ const base = seq.charAt(k + mismatch.start)
51
+
52
+ // If softclip length+start is longer than sequence, no need to
53
+ // continue showing base
54
+ if (!base) {
55
+ return
56
+ }
57
+
58
+ const s0 = start + k
59
+ const [leftPx, rightPx] = bpSpanPx(s0, s0 + 1, region, bpPerPx)
60
+ const widthPx = Math.max(minFeatWidth, rightPx - leftPx)
61
+
62
+ // Black accounts for IUPAC ambiguity code bases such as N that
63
+ // show in soft clipping
64
+ const baseColor = colorForBase[base] || '#000000'
65
+ ctx.fillStyle = baseColor
66
+ fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth)
67
+
68
+ if (widthPx >= charWidth && heightPx >= charHeight - 5) {
69
+ ctx.fillStyle = theme.palette.getContrastText(baseColor)
70
+ ctx.fillText(
71
+ base,
72
+ leftPx + (widthPx - charWidth) / 2 + 1,
73
+ topPx + heightPx,
74
+ )
75
+ }
76
+ }
77
+ })
78
+ }
@@ -98,12 +98,10 @@ export const sortFeature = (
98
98
  }
99
99
  }
100
100
 
101
- const sortedMap = new Map(
101
+ return new Map(
102
102
  [...featuresInCenterLine, ...featuresOutsideCenter].map(feature => [
103
103
  feature.id(),
104
104
  feature,
105
105
  ]),
106
106
  )
107
-
108
- return sortedMap
109
107
  }
@@ -0,0 +1,63 @@
1
+ import { Feature, measureText } from '@jbrowse/core/util'
2
+ import { Theme } from '@mui/material'
3
+
4
+ export function fillRect(
5
+ ctx: CanvasRenderingContext2D,
6
+ l: number,
7
+ t: number,
8
+ w: number,
9
+ h: number,
10
+ cw: number,
11
+ color?: string,
12
+ ) {
13
+ if (l + w < 0 || l > cw) {
14
+ return
15
+ } else {
16
+ if (color) {
17
+ ctx.fillStyle = color
18
+ }
19
+ ctx.fillRect(l, t, w, h)
20
+ }
21
+ }
22
+
23
+ export function getColorBaseMap(theme: 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
+
34
+ export function getContrastBaseMap(theme: Theme) {
35
+ return Object.fromEntries(
36
+ Object.entries(getColorBaseMap(theme)).map(([key, value]) => [
37
+ key,
38
+ theme.palette.getContrastText(value),
39
+ ]),
40
+ )
41
+ }
42
+
43
+ export function shouldDrawSNPsMuted(type?: string) {
44
+ return ['methylation', 'modifications'].includes(type || '')
45
+ }
46
+
47
+ export function shouldDrawIndels() {
48
+ return true
49
+ }
50
+
51
+ export interface LayoutFeature {
52
+ heightPx: number
53
+ topPx: number
54
+ feature: Feature
55
+ }
56
+
57
+ // get width and height of chars the height is an approximation: width letter M
58
+ // is approximately the height
59
+ export function getCharWidthHeight() {
60
+ const charWidth = measureText('A')
61
+ const charHeight = measureText('M') - 2
62
+ return { charWidth, charHeight }
63
+ }
@@ -94,9 +94,12 @@ export default class SNPCoverageAdapter extends BaseFeatureDataAdapter {
94
94
  }, opts.signal)
95
95
  }
96
96
 
97
- async estimateRegionsStats(regions: Region[], opts?: BaseOptions) {
97
+ async getMultiRegionFeatureDensityStats(
98
+ regions: Region[],
99
+ opts?: BaseOptions,
100
+ ) {
98
101
  const { subadapter } = await this.configure()
99
- return subadapter.estimateRegionsStats(regions, opts)
102
+ return subadapter.getMultiRegionFeatureDensityStats(regions, opts)
100
103
  }
101
104
 
102
105
  async getRefNames(opts: BaseOptions = {}) {
@@ -106,6 +109,3 @@ export default class SNPCoverageAdapter extends BaseFeatureDataAdapter {
106
109
 
107
110
  freeResources(/* { region } */): void {}
108
111
  }
109
-
110
- const { capabilities } = SNPCoverageAdapter
111
- export { capabilities }