@jbrowse/plugin-alignments 2.2.1 → 2.3.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 (349) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +1 -1
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  3. package/dist/AlignmentsTrack/index.js +1 -0
  4. package/dist/AlignmentsTrack/index.js.map +1 -1
  5. package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +3 -4
  6. package/dist/BamAdapter/BamSlightlyLazyFeature.js +11 -18
  7. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  8. package/dist/BamAdapter/index.js +1 -0
  9. package/dist/BamAdapter/index.js.map +1 -1
  10. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +5 -7
  11. package/dist/CramAdapter/CramSlightlyLazyFeature.js +6 -8
  12. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  13. package/dist/CramAdapter/CramTestAdapters.js +2 -1
  14. package/dist/CramAdapter/CramTestAdapters.js.map +1 -1
  15. package/dist/CramAdapter/index.js +1 -0
  16. package/dist/CramAdapter/index.js.map +1 -1
  17. package/dist/GuessAlignmentsTypes/index.d.ts +3 -0
  18. package/dist/GuessAlignmentsTypes/index.js +56 -0
  19. package/dist/GuessAlignmentsTypes/index.js.map +1 -0
  20. package/dist/HtsgetBamAdapter/index.js +11 -11
  21. package/dist/HtsgetBamAdapter/index.js.map +1 -1
  22. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +10 -13
  23. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  24. package/dist/LinearAlignmentsDisplay/index.js +1 -0
  25. package/dist/LinearAlignmentsDisplay/index.js.map +1 -1
  26. package/dist/LinearAlignmentsDisplay/models/configSchema.d.ts +6 -3
  27. package/dist/LinearAlignmentsDisplay/models/configSchema.js +2 -3
  28. package/dist/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
  29. package/dist/LinearAlignmentsDisplay/models/model.d.ts +22 -36
  30. package/dist/LinearAlignmentsDisplay/models/model.js +166 -151
  31. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
  32. package/dist/LinearPileupDisplay/components/ColorByModifications.d.ts +3 -1
  33. package/dist/LinearPileupDisplay/components/ColorByModifications.js +7 -22
  34. package/dist/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
  35. package/dist/LinearPileupDisplay/components/ColorByTag.js +2 -22
  36. package/dist/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
  37. package/dist/LinearPileupDisplay/components/SetFeatureHeight.d.ts +2 -2
  38. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +3 -22
  39. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -1
  40. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +2 -18
  41. package/dist/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -1
  42. package/dist/LinearPileupDisplay/components/SortByTag.js +2 -23
  43. package/dist/LinearPileupDisplay/components/SortByTag.js.map +1 -1
  44. package/dist/LinearPileupDisplay/configSchema.d.ts +0 -3
  45. package/dist/LinearPileupDisplay/configSchema.js.map +1 -1
  46. package/dist/LinearPileupDisplay/index.js +2 -0
  47. package/dist/LinearPileupDisplay/index.js.map +1 -1
  48. package/dist/LinearPileupDisplay/model.d.ts +19 -16
  49. package/dist/LinearPileupDisplay/model.js +28 -13
  50. package/dist/LinearPileupDisplay/model.js.map +1 -1
  51. package/dist/LinearReadArcsDisplay/components/ReactComponent.d.ts +6 -0
  52. package/dist/LinearReadArcsDisplay/components/ReactComponent.js +49 -0
  53. package/dist/LinearReadArcsDisplay/components/ReactComponent.js.map +1 -0
  54. package/dist/LinearReadArcsDisplay/configSchema.d.ts +6 -0
  55. package/dist/LinearReadArcsDisplay/configSchema.js +52 -0
  56. package/dist/LinearReadArcsDisplay/configSchema.js.map +1 -0
  57. package/dist/LinearReadArcsDisplay/drawFeats.d.ts +14 -0
  58. package/dist/LinearReadArcsDisplay/drawFeats.js +162 -0
  59. package/dist/LinearReadArcsDisplay/drawFeats.js.map +1 -0
  60. package/dist/LinearReadArcsDisplay/index.d.ts +2 -0
  61. package/dist/LinearReadArcsDisplay/index.js +27 -0
  62. package/dist/LinearReadArcsDisplay/index.js.map +1 -0
  63. package/dist/LinearReadArcsDisplay/model.d.ts +342 -0
  64. package/dist/LinearReadArcsDisplay/model.js +327 -0
  65. package/dist/LinearReadArcsDisplay/model.js.map +1 -0
  66. package/dist/LinearReadCloudDisplay/components/ReactComponent.d.ts +6 -0
  67. package/dist/LinearReadCloudDisplay/components/ReactComponent.js +49 -0
  68. package/dist/LinearReadCloudDisplay/components/ReactComponent.js.map +1 -0
  69. package/dist/LinearReadCloudDisplay/configSchema.d.ts +6 -0
  70. package/dist/LinearReadCloudDisplay/configSchema.js +51 -0
  71. package/dist/LinearReadCloudDisplay/configSchema.js.map +1 -0
  72. package/dist/LinearReadCloudDisplay/drawFeats.d.ts +10 -0
  73. package/dist/LinearReadCloudDisplay/drawFeats.js +159 -0
  74. package/dist/LinearReadCloudDisplay/drawFeats.js.map +1 -0
  75. package/dist/LinearReadCloudDisplay/index.d.ts +2 -0
  76. package/dist/LinearReadCloudDisplay/index.js +27 -0
  77. package/dist/LinearReadCloudDisplay/index.js.map +1 -0
  78. package/dist/LinearReadCloudDisplay/model.d.ts +320 -0
  79. package/dist/LinearReadCloudDisplay/model.js +252 -0
  80. package/dist/LinearReadCloudDisplay/model.js.map +1 -0
  81. package/dist/LinearSNPCoverageDisplay/index.js +1 -0
  82. package/dist/LinearSNPCoverageDisplay/index.js.map +1 -1
  83. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +22 -19
  84. package/dist/LinearSNPCoverageDisplay/models/model.js +9 -12
  85. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  86. package/dist/{BamAdapter/MismatchParser.d.ts → MismatchParser/index.d.ts} +23 -0
  87. package/dist/{BamAdapter/MismatchParser.js → MismatchParser/index.js} +116 -3
  88. package/dist/MismatchParser/index.js.map +1 -0
  89. package/dist/PileupRPC/base.d.ts +8 -0
  90. package/dist/PileupRPC/base.js +22 -0
  91. package/dist/PileupRPC/base.js.map +1 -0
  92. package/dist/PileupRPC/index.d.ts +3 -0
  93. package/dist/PileupRPC/index.js +9 -0
  94. package/dist/PileupRPC/index.js.map +1 -0
  95. package/dist/PileupRPC/methods/GetGlobalValueForTag.d.ts +14 -0
  96. package/dist/PileupRPC/methods/GetGlobalValueForTag.js +29 -0
  97. package/dist/PileupRPC/methods/GetGlobalValueForTag.js.map +1 -0
  98. package/dist/PileupRPC/methods/GetReducedFeatures.d.ts +25 -0
  99. package/dist/PileupRPC/methods/GetReducedFeatures.js +61 -0
  100. package/dist/PileupRPC/methods/GetReducedFeatures.js.map +1 -0
  101. package/dist/PileupRPC/methods/GetVisibleModifications.d.ts +14 -0
  102. package/dist/PileupRPC/methods/GetVisibleModifications.js +32 -0
  103. package/dist/PileupRPC/methods/GetVisibleModifications.js.map +1 -0
  104. package/dist/PileupRPC/rpcMethods.d.ts +4 -34
  105. package/dist/PileupRPC/rpcMethods.js +7 -77
  106. package/dist/PileupRPC/rpcMethods.js.map +1 -1
  107. package/dist/PileupRPC/util.d.ts +8 -0
  108. package/dist/PileupRPC/util.js +20 -0
  109. package/dist/PileupRPC/util.js.map +1 -0
  110. package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
  111. package/dist/PileupRenderer/PileupRenderer.js +5 -5
  112. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  113. package/dist/PileupRenderer/configSchema.js +1 -1
  114. package/dist/PileupRenderer/configSchema.js.map +1 -1
  115. package/dist/PileupRenderer/index.js +1 -0
  116. package/dist/PileupRenderer/index.js.map +1 -1
  117. package/dist/PileupRenderer/sortUtil.d.ts +1 -1
  118. package/dist/PileupRenderer/sortUtil.js +2 -2
  119. package/dist/PileupRenderer/sortUtil.js.map +1 -1
  120. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +0 -51
  121. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +3 -182
  122. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  123. package/dist/SNPCoverageAdapter/generateCoverageBins.d.ts +53 -0
  124. package/dist/SNPCoverageAdapter/generateCoverageBins.js +185 -0
  125. package/dist/SNPCoverageAdapter/generateCoverageBins.js.map +1 -0
  126. package/dist/SNPCoverageAdapter/index.js +1 -3
  127. package/dist/SNPCoverageAdapter/index.js.map +1 -1
  128. package/dist/index.d.ts +2 -2
  129. package/dist/index.js +12 -58
  130. package/dist/index.js.map +1 -1
  131. package/dist/{LinearPileupDisplay/components → shared}/FilterByTag.d.ts +0 -0
  132. package/dist/{LinearPileupDisplay/components → shared}/FilterByTag.js +5 -24
  133. package/dist/shared/FilterByTag.js.map +1 -0
  134. package/dist/shared/color.d.ts +17 -0
  135. package/dist/shared/color.js +43 -0
  136. package/dist/shared/color.js.map +1 -0
  137. package/dist/shared/fetchChains.d.ts +27 -0
  138. package/dist/shared/fetchChains.js +30 -0
  139. package/dist/shared/fetchChains.js.map +1 -0
  140. package/dist/shared/index.d.ts +36 -0
  141. package/dist/{shared.js → shared/index.js} +12 -2
  142. package/dist/shared/index.js.map +1 -0
  143. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +1 -1
  144. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  145. package/esm/AlignmentsTrack/index.js +1 -0
  146. package/esm/AlignmentsTrack/index.js.map +1 -1
  147. package/esm/BamAdapter/BamSlightlyLazyFeature.d.ts +3 -4
  148. package/esm/BamAdapter/BamSlightlyLazyFeature.js +11 -18
  149. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  150. package/esm/BamAdapter/index.js +1 -0
  151. package/esm/BamAdapter/index.js.map +1 -1
  152. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +5 -7
  153. package/esm/CramAdapter/CramSlightlyLazyFeature.js +6 -8
  154. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  155. package/esm/CramAdapter/CramTestAdapters.js +2 -1
  156. package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
  157. package/esm/CramAdapter/index.js +1 -0
  158. package/esm/CramAdapter/index.js.map +1 -1
  159. package/esm/GuessAlignmentsTypes/index.d.ts +3 -0
  160. package/esm/GuessAlignmentsTypes/index.js +54 -0
  161. package/esm/GuessAlignmentsTypes/index.js.map +1 -0
  162. package/esm/HtsgetBamAdapter/index.js +11 -11
  163. package/esm/HtsgetBamAdapter/index.js.map +1 -1
  164. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +10 -13
  165. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  166. package/esm/LinearAlignmentsDisplay/index.js +1 -0
  167. package/esm/LinearAlignmentsDisplay/index.js.map +1 -1
  168. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +6 -3
  169. package/esm/LinearAlignmentsDisplay/models/configSchema.js +2 -4
  170. package/esm/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
  171. package/esm/LinearAlignmentsDisplay/models/model.d.ts +22 -36
  172. package/esm/LinearAlignmentsDisplay/models/model.js +167 -152
  173. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  174. package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +3 -1
  175. package/esm/LinearPileupDisplay/components/ColorByModifications.js +8 -23
  176. package/esm/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
  177. package/esm/LinearPileupDisplay/components/ColorByTag.js +3 -20
  178. package/esm/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
  179. package/esm/LinearPileupDisplay/components/SetFeatureHeight.d.ts +2 -2
  180. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +4 -20
  181. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -1
  182. package/esm/LinearPileupDisplay/components/SetMaxHeight.js +3 -16
  183. package/esm/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -1
  184. package/esm/LinearPileupDisplay/components/SortByTag.js +3 -21
  185. package/esm/LinearPileupDisplay/components/SortByTag.js.map +1 -1
  186. package/esm/LinearPileupDisplay/configSchema.d.ts +0 -3
  187. package/esm/LinearPileupDisplay/configSchema.js.map +1 -1
  188. package/esm/LinearPileupDisplay/index.js +2 -0
  189. package/esm/LinearPileupDisplay/index.js.map +1 -1
  190. package/esm/LinearPileupDisplay/model.d.ts +19 -16
  191. package/esm/LinearPileupDisplay/model.js +29 -14
  192. package/esm/LinearPileupDisplay/model.js.map +1 -1
  193. package/esm/LinearReadArcsDisplay/components/ReactComponent.d.ts +6 -0
  194. package/esm/LinearReadArcsDisplay/components/ReactComponent.js +44 -0
  195. package/esm/LinearReadArcsDisplay/components/ReactComponent.js.map +1 -0
  196. package/esm/LinearReadArcsDisplay/configSchema.d.ts +6 -0
  197. package/esm/LinearReadArcsDisplay/configSchema.js +50 -0
  198. package/esm/LinearReadArcsDisplay/configSchema.js.map +1 -0
  199. package/esm/LinearReadArcsDisplay/drawFeats.d.ts +14 -0
  200. package/esm/LinearReadArcsDisplay/drawFeats.js +157 -0
  201. package/esm/LinearReadArcsDisplay/drawFeats.js.map +1 -0
  202. package/esm/LinearReadArcsDisplay/index.d.ts +2 -0
  203. package/esm/LinearReadArcsDisplay/index.js +21 -0
  204. package/esm/LinearReadArcsDisplay/index.js.map +1 -0
  205. package/esm/LinearReadArcsDisplay/model.d.ts +342 -0
  206. package/esm/LinearReadArcsDisplay/model.js +299 -0
  207. package/esm/LinearReadArcsDisplay/model.js.map +1 -0
  208. package/esm/LinearReadCloudDisplay/components/ReactComponent.d.ts +6 -0
  209. package/esm/LinearReadCloudDisplay/components/ReactComponent.js +44 -0
  210. package/esm/LinearReadCloudDisplay/components/ReactComponent.js.map +1 -0
  211. package/esm/LinearReadCloudDisplay/configSchema.d.ts +6 -0
  212. package/esm/LinearReadCloudDisplay/configSchema.js +49 -0
  213. package/esm/LinearReadCloudDisplay/configSchema.js.map +1 -0
  214. package/esm/LinearReadCloudDisplay/drawFeats.d.ts +10 -0
  215. package/esm/LinearReadCloudDisplay/drawFeats.js +156 -0
  216. package/esm/LinearReadCloudDisplay/drawFeats.js.map +1 -0
  217. package/esm/LinearReadCloudDisplay/index.d.ts +2 -0
  218. package/esm/LinearReadCloudDisplay/index.js +21 -0
  219. package/esm/LinearReadCloudDisplay/index.js.map +1 -0
  220. package/esm/LinearReadCloudDisplay/model.d.ts +320 -0
  221. package/esm/LinearReadCloudDisplay/model.js +224 -0
  222. package/esm/LinearReadCloudDisplay/model.js.map +1 -0
  223. package/esm/LinearSNPCoverageDisplay/index.js +1 -0
  224. package/esm/LinearSNPCoverageDisplay/index.js.map +1 -1
  225. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +22 -19
  226. package/esm/LinearSNPCoverageDisplay/models/model.js +11 -14
  227. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  228. package/esm/{BamAdapter/MismatchParser.d.ts → MismatchParser/index.d.ts} +23 -0
  229. package/esm/{BamAdapter/MismatchParser.js → MismatchParser/index.js} +107 -2
  230. package/esm/MismatchParser/index.js.map +1 -0
  231. package/esm/PileupRPC/base.d.ts +8 -0
  232. package/esm/PileupRPC/base.js +16 -0
  233. package/esm/PileupRPC/base.js.map +1 -0
  234. package/esm/PileupRPC/index.d.ts +3 -0
  235. package/esm/PileupRPC/index.js +7 -0
  236. package/esm/PileupRPC/index.js.map +1 -0
  237. package/esm/PileupRPC/methods/GetGlobalValueForTag.d.ts +14 -0
  238. package/esm/PileupRPC/methods/GetGlobalValueForTag.js +23 -0
  239. package/esm/PileupRPC/methods/GetGlobalValueForTag.js.map +1 -0
  240. package/esm/PileupRPC/methods/GetReducedFeatures.d.ts +25 -0
  241. package/esm/PileupRPC/methods/GetReducedFeatures.js +55 -0
  242. package/esm/PileupRPC/methods/GetReducedFeatures.js.map +1 -0
  243. package/esm/PileupRPC/methods/GetVisibleModifications.d.ts +14 -0
  244. package/esm/PileupRPC/methods/GetVisibleModifications.js +26 -0
  245. package/esm/PileupRPC/methods/GetVisibleModifications.js.map +1 -0
  246. package/esm/PileupRPC/rpcMethods.d.ts +4 -34
  247. package/esm/PileupRPC/rpcMethods.js +4 -74
  248. package/esm/PileupRPC/rpcMethods.js.map +1 -1
  249. package/esm/PileupRPC/util.d.ts +8 -0
  250. package/esm/PileupRPC/util.js +15 -0
  251. package/esm/PileupRPC/util.js.map +1 -0
  252. package/esm/PileupRenderer/PileupRenderer.d.ts +1 -1
  253. package/esm/PileupRenderer/PileupRenderer.js +5 -5
  254. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  255. package/esm/PileupRenderer/configSchema.js +1 -1
  256. package/esm/PileupRenderer/configSchema.js.map +1 -1
  257. package/esm/PileupRenderer/index.js +1 -0
  258. package/esm/PileupRenderer/index.js.map +1 -1
  259. package/esm/PileupRenderer/sortUtil.d.ts +1 -1
  260. package/esm/PileupRenderer/sortUtil.js +1 -1
  261. package/esm/PileupRenderer/sortUtil.js.map +1 -1
  262. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +0 -51
  263. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +4 -183
  264. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  265. package/esm/SNPCoverageAdapter/generateCoverageBins.d.ts +53 -0
  266. package/esm/SNPCoverageAdapter/generateCoverageBins.js +182 -0
  267. package/esm/SNPCoverageAdapter/generateCoverageBins.js.map +1 -0
  268. package/esm/SNPCoverageAdapter/index.js +1 -3
  269. package/esm/SNPCoverageAdapter/index.js.map +1 -1
  270. package/esm/index.d.ts +2 -2
  271. package/esm/index.js +10 -56
  272. package/esm/index.js.map +1 -1
  273. package/esm/{LinearPileupDisplay/components → shared}/FilterByTag.d.ts +0 -0
  274. package/esm/{LinearPileupDisplay/components → shared}/FilterByTag.js +6 -22
  275. package/esm/shared/FilterByTag.js.map +1 -0
  276. package/esm/shared/color.d.ts +17 -0
  277. package/esm/shared/color.js +37 -0
  278. package/esm/shared/color.js.map +1 -0
  279. package/esm/shared/fetchChains.d.ts +27 -0
  280. package/esm/shared/fetchChains.js +26 -0
  281. package/esm/shared/fetchChains.js.map +1 -0
  282. package/esm/shared/index.d.ts +36 -0
  283. package/esm/{shared.js → shared/index.js} +11 -1
  284. package/esm/shared/index.js.map +1 -0
  285. package/package.json +5 -5
  286. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +1 -1
  287. package/src/AlignmentsTrack/index.ts +1 -0
  288. package/src/BamAdapter/BamSlightlyLazyFeature.ts +13 -19
  289. package/src/BamAdapter/index.ts +1 -0
  290. package/src/CramAdapter/CramSlightlyLazyFeature.ts +13 -15
  291. package/src/CramAdapter/CramTestAdapters.ts +1 -0
  292. package/src/CramAdapter/__snapshots__/CramAdapter.test.ts.snap +0 -10
  293. package/src/CramAdapter/index.ts +1 -0
  294. package/src/GuessAlignmentsTypes/index.ts +79 -0
  295. package/src/HtsgetBamAdapter/index.ts +11 -15
  296. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +21 -29
  297. package/src/LinearAlignmentsDisplay/index.ts +1 -0
  298. package/src/LinearAlignmentsDisplay/models/configSchema.ts +2 -6
  299. package/src/LinearAlignmentsDisplay/models/model.tsx +238 -199
  300. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +5 -34
  301. package/src/LinearPileupDisplay/components/ColorByTag.tsx +2 -29
  302. package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +5 -27
  303. package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +2 -24
  304. package/src/LinearPileupDisplay/components/SortByTag.tsx +2 -31
  305. package/src/LinearPileupDisplay/configSchema.ts +1 -3
  306. package/src/LinearPileupDisplay/index.ts +2 -0
  307. package/src/LinearPileupDisplay/model.ts +36 -23
  308. package/src/LinearReadArcsDisplay/components/ReactComponent.tsx +86 -0
  309. package/src/LinearReadArcsDisplay/configSchema.ts +58 -0
  310. package/src/LinearReadArcsDisplay/declare.d.ts +1 -0
  311. package/src/LinearReadArcsDisplay/drawFeats.ts +199 -0
  312. package/src/LinearReadArcsDisplay/index.ts +23 -0
  313. package/src/LinearReadArcsDisplay/model.tsx +370 -0
  314. package/src/LinearReadCloudDisplay/components/ReactComponent.tsx +86 -0
  315. package/src/LinearReadCloudDisplay/configSchema.ts +57 -0
  316. package/src/LinearReadCloudDisplay/drawFeats.ts +201 -0
  317. package/src/LinearReadCloudDisplay/index.ts +23 -0
  318. package/src/LinearReadCloudDisplay/model.tsx +289 -0
  319. package/src/LinearSNPCoverageDisplay/index.ts +1 -0
  320. package/src/LinearSNPCoverageDisplay/models/model.ts +15 -21
  321. package/src/{BamAdapter/MismatchParser.test.ts → MismatchParser/index.test.ts} +1 -1
  322. package/src/{BamAdapter/MismatchParser.ts → MismatchParser/index.ts} +129 -2
  323. package/src/PileupRPC/base.ts +24 -0
  324. package/src/PileupRPC/index.ts +12 -0
  325. package/src/PileupRPC/methods/GetGlobalValueForTag.ts +41 -0
  326. package/src/PileupRPC/methods/GetReducedFeatures.ts +76 -0
  327. package/src/PileupRPC/methods/GetVisibleModifications.ts +45 -0
  328. package/src/PileupRPC/rpcMethods.ts +8 -113
  329. package/src/PileupRPC/util.ts +19 -0
  330. package/src/PileupRenderer/PileupRenderer.ts +5 -8
  331. package/src/PileupRenderer/configSchema.ts +1 -1
  332. package/src/PileupRenderer/index.ts +1 -0
  333. package/src/PileupRenderer/sortUtil.ts +2 -3
  334. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +5 -249
  335. package/src/SNPCoverageAdapter/generateCoverageBins.ts +245 -0
  336. package/src/SNPCoverageAdapter/index.ts +1 -3
  337. package/src/index.ts +12 -93
  338. package/src/{LinearPileupDisplay/components → shared}/FilterByTag.tsx +5 -31
  339. package/src/shared/color.ts +47 -0
  340. package/src/shared/fetchChains.ts +63 -0
  341. package/src/{shared.ts → shared/index.ts} +17 -4
  342. package/dist/BamAdapter/MismatchParser.js.map +0 -1
  343. package/dist/LinearPileupDisplay/components/FilterByTag.js.map +0 -1
  344. package/dist/shared.d.ts +0 -25
  345. package/dist/shared.js.map +0 -1
  346. package/esm/BamAdapter/MismatchParser.js.map +0 -1
  347. package/esm/LinearPileupDisplay/components/FilterByTag.js.map +0 -1
  348. package/esm/shared.d.ts +0 -25
  349. package/esm/shared.js.map +0 -1
@@ -3,19 +3,15 @@ import PluginManager from '@jbrowse/core/PluginManager'
3
3
  import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
4
4
 
5
5
  export default (pluginManager: PluginManager) => {
6
- pluginManager.addAdapterType(
7
- () =>
8
- new AdapterType({
9
- name: 'HtsgetBamAdapter',
10
- adapterMetadata: {
11
- category: null,
12
- hiddenFromGUI: true,
13
- displayName: null,
14
- description: null,
15
- },
16
- configSchema,
17
- getAdapterClass: () =>
18
- import('./HtsgetBamAdapter').then(r => r.default),
19
- }),
20
- )
6
+ pluginManager.addAdapterType(() => {
7
+ return new AdapterType({
8
+ name: 'HtsgetBamAdapter',
9
+ displayName: 'Htsget BAM adapter',
10
+ adapterMetadata: {
11
+ hiddenFromGUI: true,
12
+ },
13
+ configSchema,
14
+ getAdapterClass: () => import('./HtsgetBamAdapter').then(r => r.default),
15
+ })
16
+ })
21
17
  }
@@ -16,7 +16,7 @@ const useStyles = makeStyles()(() => ({
16
16
  }))
17
17
 
18
18
  function AlignmentsDisplay({ model }: { model: AlignmentsDisplayModel }) {
19
- const { PileupDisplay, SNPCoverageDisplay, showPileup, showCoverage } = model
19
+ const { PileupDisplay, SNPCoverageDisplay } = model
20
20
  const { classes } = useStyles()
21
21
  const top = SNPCoverageDisplay.height
22
22
  return (
@@ -24,35 +24,27 @@ function AlignmentsDisplay({ model }: { model: AlignmentsDisplayModel }) {
24
24
  data-testid={`display-${getConf(model, 'displayId')}`}
25
25
  style={{ position: 'relative' }}
26
26
  >
27
- {showCoverage ? (
28
- <>
29
- <div data-testid="Blockset-snpcoverage">
30
- <SNPCoverageDisplay.RenderingComponent model={SNPCoverageDisplay} />
31
- </div>
32
- <ResizeHandle
33
- onDrag={delta => {
34
- SNPCoverageDisplay.setHeight(SNPCoverageDisplay.height + delta)
35
- return delta
36
- }}
37
- className={classes.resizeHandle}
38
- style={{
39
- top,
40
- }}
41
- />
42
- </>
43
- ) : null}
27
+ <div data-testid="Blockset-snpcoverage">
28
+ <SNPCoverageDisplay.RenderingComponent model={SNPCoverageDisplay} />
29
+ </div>
30
+ <ResizeHandle
31
+ onDrag={delta => {
32
+ SNPCoverageDisplay.setHeight(SNPCoverageDisplay.height + delta)
33
+ return delta
34
+ }}
35
+ className={classes.resizeHandle}
36
+ style={{ top }}
37
+ />
44
38
 
45
- {showPileup ? (
46
- <div
47
- data-testid="Blockset-pileup"
48
- style={{
49
- position: 'absolute',
50
- top: showCoverage ? SNPCoverageDisplay.height : 0,
51
- }}
52
- >
53
- <PileupDisplay.RenderingComponent model={PileupDisplay} />
54
- </div>
55
- ) : null}
39
+ <div
40
+ data-testid="Blockset-pileup"
41
+ style={{
42
+ position: 'absolute',
43
+ top,
44
+ }}
45
+ >
46
+ <PileupDisplay.RenderingComponent model={PileupDisplay} />
47
+ </div>
56
48
  </div>
57
49
  )
58
50
  }
@@ -10,6 +10,7 @@ export default function (pluginManager: PluginManager) {
10
10
  const configSchema = configSchemaFactory(pluginManager)
11
11
  return new DisplayType({
12
12
  name: 'LinearAlignmentsDisplay',
13
+ displayName: 'Alignments display (combination)',
13
14
  configSchema,
14
15
  stateModel: modelFactory(pluginManager, configSchema),
15
16
  trackType: 'AlignmentsTrack',
@@ -7,9 +7,7 @@ import PluginManager from '@jbrowse/core/PluginManager'
7
7
  * has a "pileup" sub-display, where you can see individual reads and a
8
8
  * quantitative "snpcoverage" sub-display track showing SNP frequencies
9
9
  */
10
- function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
11
-
12
- const configModelFactory = (pm: PluginManager) => {
10
+ export default function configModelFactory(pm: PluginManager) {
13
11
  return ConfigurationSchema(
14
12
  'LinearAlignmentsDisplay',
15
13
  {
@@ -17,6 +15,7 @@ const configModelFactory = (pm: PluginManager) => {
17
15
  * #slot
18
16
  */
19
17
  pileupDisplay: pm.getDisplayType('LinearPileupDisplay').configSchema,
18
+
20
19
  /**
21
20
  * #slot
22
21
  */
@@ -32,6 +31,3 @@ const configModelFactory = (pm: PluginManager) => {
32
31
  },
33
32
  )
34
33
  }
35
-
36
- export type AlignmentsConfigModel = ReturnType<typeof configModelFactory>
37
- export default configModelFactory
@@ -1,4 +1,16 @@
1
1
  import React from 'react'
2
+ import { autorun, when } from 'mobx'
3
+ import {
4
+ addDisposer,
5
+ getSnapshot,
6
+ isAlive,
7
+ types,
8
+ Instance,
9
+ IStateTreeNode,
10
+ } from 'mobx-state-tree'
11
+ import deepEqual from 'fast-deep-equal'
12
+
13
+ // jbrowse
2
14
  import {
3
15
  ConfigurationReference,
4
16
  AnyConfigurationModel,
@@ -8,13 +20,109 @@ import {
8
20
  import { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'
9
21
  import PluginManager from '@jbrowse/core/PluginManager'
10
22
  import { MenuItem } from '@jbrowse/core/ui'
11
- import { autorun, when } from 'mobx'
12
- import { addDisposer, getSnapshot, Instance, types } from 'mobx-state-tree'
13
- import { getContainingTrack } from '@jbrowse/core/util'
14
- import deepEqual from 'fast-deep-equal'
15
23
 
16
24
  const minDisplayHeight = 20
17
25
 
26
+ function getLowerPanelDisplays(pluginManager: PluginManager) {
27
+ return (
28
+ pluginManager
29
+ .getDisplayElements()
30
+ // @ts-ignore
31
+ .filter(f => f.subDisplay?.type === 'LinearAlignmentsDisplay')
32
+ // @ts-ignore
33
+ .filter(f => f.subDisplay?.lowerPanel)
34
+ )
35
+ }
36
+
37
+ function deepSnap<T extends IStateTreeNode, U extends IStateTreeNode>(
38
+ x1: T,
39
+ x2: U,
40
+ ) {
41
+ return deepEqual(
42
+ x1 ? getSnapshot(x1) : undefined,
43
+ x2 ? getSnapshot(x2) : undefined,
44
+ )
45
+ }
46
+
47
+ function preCheck(self: AlignmentsDisplayModel) {
48
+ const { PileupDisplay, SNPCoverageDisplay } = self
49
+ return (
50
+ PileupDisplay ||
51
+ isAlive(PileupDisplay) ||
52
+ SNPCoverageDisplay ||
53
+ isAlive(SNPCoverageDisplay)
54
+ )
55
+ }
56
+
57
+ function propagateColorBy(self: AlignmentsDisplayModel) {
58
+ const { PileupDisplay, SNPCoverageDisplay } = self
59
+ if (!preCheck(self) || !PileupDisplay.colorBy) {
60
+ return
61
+ }
62
+ if (!deepSnap(PileupDisplay.colorBy, SNPCoverageDisplay.colorBy)) {
63
+ SNPCoverageDisplay.setColorBy(getSnapshot(PileupDisplay.colorBy))
64
+ }
65
+ }
66
+
67
+ function propagateFilterBy(self: AlignmentsDisplayModel) {
68
+ const { PileupDisplay, SNPCoverageDisplay } = self
69
+ if (!preCheck(self) || !PileupDisplay.filterBy) {
70
+ return
71
+ }
72
+ if (!deepSnap(PileupDisplay.filterBy, SNPCoverageDisplay.filterBy)) {
73
+ SNPCoverageDisplay.setFilterBy(getSnapshot(PileupDisplay.filterBy))
74
+ }
75
+ }
76
+
77
+ function AlignmentsModel(
78
+ pluginManager: PluginManager,
79
+ configSchema: AnyConfigurationSchemaType,
80
+ ) {
81
+ const lowerPanelDisplays = getLowerPanelDisplays(pluginManager).map(
82
+ f => f.stateModel,
83
+ )
84
+
85
+ return types.model({
86
+ /**
87
+ * #property
88
+ * refers to LinearPileupDisplay sub-display model
89
+ */
90
+ // @ts-ignore
91
+ PileupDisplay: types.maybe(types.union(...lowerPanelDisplays)),
92
+ /**
93
+ * #property
94
+ * refers to LinearSNPCoverageDisplay sub-display model
95
+ */
96
+ SNPCoverageDisplay: types.maybe(
97
+ pluginManager.getDisplayType('LinearSNPCoverageDisplay').stateModel,
98
+ ),
99
+ /**
100
+ * #property
101
+ */
102
+ snpCovHeight: 45,
103
+ /**
104
+ * #property
105
+ */
106
+ type: types.literal('LinearAlignmentsDisplay'),
107
+ /**
108
+ * #property
109
+ */
110
+ configuration: ConfigurationReference(configSchema),
111
+ /**
112
+ * #property
113
+ */
114
+ height: 250,
115
+ /**
116
+ * #property
117
+ */
118
+ userFeatureScreenDensity: types.maybe(types.number),
119
+ /**
120
+ * #property
121
+ */
122
+ lowerPanelType: 'LinearPileupDisplay',
123
+ })
124
+ }
125
+
18
126
  /**
19
127
  * #stateModel LinearAlignmentsDisplay
20
128
  * extends `BaseDisplay`
@@ -27,67 +135,12 @@ function stateModelFactory(
27
135
  .compose(
28
136
  'LinearAlignmentsDisplay',
29
137
  BaseDisplay,
30
- types.model({
31
- /**
32
- * #property
33
- * refers to LinearPileupDisplay sub-display model
34
- */
35
- PileupDisplay: types.maybe(
36
- pluginManager.getDisplayType('LinearPileupDisplay').stateModel,
37
- ),
38
- /**
39
- * #property
40
- * refers to LinearSNPCoverageDisplay sub-display model
41
- */
42
- SNPCoverageDisplay: types.maybe(
43
- pluginManager.getDisplayType('LinearSNPCoverageDisplay').stateModel,
44
- ),
45
- /**
46
- * #property
47
- */
48
- snpCovHeight: 45,
49
- /**
50
- * #property
51
- */
52
- type: types.literal('LinearAlignmentsDisplay'),
53
- /**
54
- * #property
55
- */
56
- configuration: ConfigurationReference(configSchema),
57
- /**
58
- * #property
59
- */
60
- height: 250,
61
- /**
62
- * #property
63
- */
64
- showCoverage: true,
65
- /**
66
- * #property
67
- */
68
- showPileup: true,
69
- /**
70
- * #property
71
- */
72
- userFeatureScreenDensity: types.maybe(types.number),
73
- }),
138
+ AlignmentsModel(pluginManager, configSchema),
74
139
  )
75
140
  .volatile(() => ({
76
141
  scrollTop: 0,
77
142
  }))
78
143
  .actions(self => ({
79
- /**
80
- * #action
81
- */
82
- toggleCoverage() {
83
- self.showCoverage = !self.showCoverage
84
- },
85
- /**
86
- * #action
87
- */
88
- togglePileup() {
89
- self.showPileup = !self.showPileup
90
- },
91
144
  /**
92
145
  * #action
93
146
  */
@@ -102,103 +155,64 @@ function stateModelFactory(
102
155
  self.snpCovHeight = n
103
156
  },
104
157
  }))
105
- .views(self => {
106
- const { trackMenuItems: superTrackMenuItems } = self
107
- return {
108
- /**
109
- * #getter
110
- */
111
- get pileupDisplayConfig() {
112
- const conf = getConf(self, 'pileupDisplay')
113
- const track = getContainingTrack(self)
114
- return {
115
- ...conf,
116
- type: 'LinearPileupDisplay',
117
- name: `${getConf(track, 'name')} pileup`,
118
- displayId: `${self.configuration.displayId}_pileup_xyz`, // xyz to avoid someone accidentally naming the displayId similar to this
119
- }
120
- },
121
-
122
- /**
123
- * #method
124
- */
125
- getFeatureByID(blockKey: string, id: string) {
126
- return self.PileupDisplay.getFeatureByID(blockKey, id)
127
- },
128
- /**
129
- * #method
130
- */
131
- searchFeatureByID(id: string) {
132
- return self.PileupDisplay.searchFeatureByID(id)
133
- },
158
+ .views(self => ({
159
+ /**
160
+ * #getter
161
+ */
162
+ get pileupConf() {
163
+ const conf = getConf(self, 'pileupDisplay')
164
+ return {
165
+ ...conf,
166
+ type: self.lowerPanelType,
167
+ displayId: `${self.configuration.displayId}_${self.lowerPanelType}_xyz`, // xyz to avoid someone accidentally naming the displayId similar to this
168
+ }
169
+ },
134
170
 
135
- /**
136
- * #getter
137
- */
138
- get features() {
139
- return self.PileupDisplay.features
140
- },
171
+ /**
172
+ * #method
173
+ */
174
+ getFeatureByID(blockKey: string, id: string) {
175
+ return self.PileupDisplay.getFeatureByID(blockKey, id)
176
+ },
177
+ /**
178
+ * #method
179
+ */
180
+ searchFeatureByID(id: string) {
181
+ return self.PileupDisplay.searchFeatureByID(id)
182
+ },
141
183
 
142
- /**
143
- * #getter
144
- */
145
- get DisplayBlurb() {
146
- return self.PileupDisplay?.DisplayBlurb
147
- },
184
+ /**
185
+ * #getter
186
+ */
187
+ get features() {
188
+ return self.PileupDisplay.features
189
+ },
148
190
 
149
- /**
150
- * #getter
151
- */
152
- get sortedBy() {
153
- return self.PileupDisplay.sortedBy
154
- },
155
- /**
156
- * #getter
157
- */
158
- get sortedByPosition() {
159
- return self.PileupDisplay.sortedByPosition
160
- },
161
- /**
162
- * #getter
163
- */
164
- get sortedByRefName() {
165
- return self.PileupDisplay.sortedByRefName
166
- },
191
+ /**
192
+ * #getter
193
+ */
194
+ get DisplayBlurb() {
195
+ return self.PileupDisplay?.DisplayBlurb
196
+ },
167
197
 
168
- /**
169
- * #getter
170
- */
171
- get snpCoverageDisplayConfig() {
172
- const conf = getConf(self, 'snpCoverageDisplay')
173
- const track = getContainingTrack(self)
174
- return {
175
- ...conf,
176
- type: 'LinearSNPCoverageDisplay',
177
- name: `${getConf(track, 'name')} snp coverage`,
178
- displayId: `${self.configuration.displayId}_snpcoverage_xyz`, // xyz to avoid someone accidentally naming the displayId similar to this
179
- }
180
- },
198
+ /**
199
+ * #getter
200
+ */
201
+ get sortedBy() {
202
+ return self.PileupDisplay.sortedBy
203
+ },
181
204
 
182
- /**
183
- * #method
184
- */
185
- trackMenuItems(): MenuItem[] {
186
- return [
187
- ...superTrackMenuItems(),
188
- {
189
- type: 'subMenu',
190
- label: 'Pileup settings',
191
- subMenu: self.PileupDisplay.trackMenuItems(),
192
- },
193
- {
194
- type: 'subMenu',
195
- label: 'SNPCoverage settings',
196
- subMenu: self.SNPCoverageDisplay.trackMenuItems(),
197
- },
198
- ]
199
- },
200
- }
201
- })
205
+ /**
206
+ * #getter
207
+ */
208
+ get coverageConf() {
209
+ const conf = getConf(self, 'snpCoverageDisplay')
210
+ return {
211
+ ...conf,
212
+ displayId: `${self.configuration.displayId}_snpcoverage_xyz`, // xyz to avoid someone accidentally naming the displayId similar to this
213
+ }
214
+ },
215
+ }))
202
216
  .actions(self => ({
203
217
  /**
204
218
  * #action
@@ -223,21 +237,23 @@ function stateModelFactory(
223
237
  */
224
238
  setPileupDisplay(configuration: AnyConfigurationModel) {
225
239
  self.PileupDisplay = {
226
- type: 'LinearPileupDisplay',
240
+ type: configuration.type || 'LinearPileupDisplay',
227
241
  configuration,
228
242
  }
229
243
  },
230
244
  /**
231
245
  * #action
232
246
  */
233
- setHeight(displayHeight: number) {
234
- if (displayHeight > minDisplayHeight) {
235
- self.height = displayHeight
236
- } else {
237
- self.height = minDisplayHeight
238
- }
247
+ setHeight(n: number) {
248
+ self.height = Math.max(n, minDisplayHeight)
239
249
  return self.height
240
250
  },
251
+ /**
252
+ * #action
253
+ */
254
+ setLowerPanelType(type: string) {
255
+ self.lowerPanelType = type
256
+ },
241
257
  /**
242
258
  * #action
243
259
  */
@@ -252,64 +268,53 @@ function stateModelFactory(
252
268
  addDisposer(
253
269
  self,
254
270
  autorun(() => {
255
- if (!self.SNPCoverageDisplay) {
256
- self.setSNPCoverageDisplay(self.snpCoverageDisplayConfig)
271
+ const {
272
+ SNPCoverageDisplay,
273
+ PileupDisplay,
274
+ coverageConf,
275
+ pileupConf,
276
+ } = self
277
+
278
+ if (!SNPCoverageDisplay) {
279
+ self.setSNPCoverageDisplay(coverageConf)
257
280
  } else if (
258
281
  !deepEqual(
259
- self.snpCoverageDisplayConfig,
260
- getSnapshot(self.SNPCoverageDisplay.configuration),
282
+ coverageConf,
283
+ getSnapshot(SNPCoverageDisplay.configuration),
261
284
  )
262
285
  ) {
263
- self.SNPCoverageDisplay.setHeight(self.snpCovHeight)
264
- self.SNPCoverageDisplay.setConfig(self.snpCoverageDisplayConfig)
286
+ SNPCoverageDisplay.setHeight(self.snpCovHeight)
287
+ SNPCoverageDisplay.setConfig(self.coverageConf)
265
288
  }
266
289
 
267
- if (!self.PileupDisplay) {
268
- self.setPileupDisplay(self.pileupDisplayConfig)
290
+ if (!PileupDisplay || self.lowerPanelType !== PileupDisplay.type) {
291
+ self.setPileupDisplay(pileupConf)
269
292
  } else if (
270
- !deepEqual(
271
- self.pileupDisplayConfig,
272
- getSnapshot(self.PileupDisplay.configuration),
273
- )
293
+ !deepEqual(pileupConf, getSnapshot(PileupDisplay.configuration))
274
294
  ) {
275
- self.PileupDisplay.setConfig(self.pileupDisplayConfig)
295
+ PileupDisplay.setConfig(self.pileupConf)
276
296
  }
277
297
 
278
- // propagate the filterBy setting from pileupdisplay to snpcoverage
279
- // note: the snpcoverage display is not able to control filterBy
280
- // itself
281
- if (
282
- self.PileupDisplay.filterBy &&
283
- !deepEqual(
284
- getSnapshot(self.PileupDisplay.filterBy),
285
- getSnapshot(self.SNPCoverageDisplay.filterBy),
286
- )
287
- ) {
288
- self.SNPCoverageDisplay.setFilterBy(
289
- getSnapshot(self.PileupDisplay.filterBy),
290
- )
291
- }
292
- if (
293
- self.PileupDisplay.colorBy &&
294
- !deepEqual(
295
- getSnapshot(self.PileupDisplay.colorBy),
296
- self.SNPCoverageDisplay.colorBy
297
- ? getSnapshot(self.SNPCoverageDisplay.colorBy)
298
- : {},
299
- )
300
- ) {
301
- self.SNPCoverageDisplay.setColorBy(
302
- getSnapshot(self.PileupDisplay.colorBy),
303
- )
304
- }
298
+ propagateColorBy(self as AlignmentsDisplayModel)
299
+ propagateFilterBy(self as AlignmentsDisplayModel)
305
300
  }),
306
301
  )
302
+
307
303
  addDisposer(
308
304
  self,
309
305
  autorun(() => {
310
306
  self.setSNPCoverageHeight(self.SNPCoverageDisplay.height)
311
307
  }),
312
308
  )
309
+
310
+ addDisposer(
311
+ self,
312
+ autorun(() => {
313
+ self.PileupDisplay.setHeight(
314
+ self.height - self.SNPCoverageDisplay.height,
315
+ )
316
+ }),
317
+ )
313
318
  },
314
319
  /**
315
320
  * #action
@@ -330,6 +335,40 @@ function stateModelFactory(
330
335
  )
331
336
  },
332
337
  }))
338
+ .views(self => {
339
+ const { trackMenuItems: superTrackMenuItems } = self
340
+ return {
341
+ /**
342
+ * #method
343
+ */
344
+ trackMenuItems(): MenuItem[] {
345
+ const extra = getLowerPanelDisplays(pluginManager).map(d => ({
346
+ type: 'radio',
347
+ label: d.displayName,
348
+ checked: d.name === self.PileupDisplay.type,
349
+ onClick: () => self.setLowerPanelType(d.name),
350
+ }))
351
+ return [
352
+ ...superTrackMenuItems(),
353
+ {
354
+ type: 'subMenu',
355
+ label: 'Pileup settings',
356
+ subMenu: self.PileupDisplay.trackMenuItems(),
357
+ },
358
+ {
359
+ type: 'subMenu',
360
+ label: 'SNPCoverage settings',
361
+ subMenu: self.SNPCoverageDisplay.trackMenuItems(),
362
+ },
363
+ {
364
+ type: 'subMenu',
365
+ label: `Replace lower panel with...`,
366
+ subMenu: extra,
367
+ },
368
+ ]
369
+ },
370
+ }
371
+ })
333
372
  }
334
373
 
335
374
  export default stateModelFactory