@genome-spy/core 0.36.1 → 0.37.1

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 (523) hide show
  1. package/README.md +1 -0
  2. package/dist/{index.es.js → bundle/index.es.js} +2253 -2115
  3. package/dist/{index.js → bundle/index.js} +180 -44
  4. package/dist/src/data/collector.d.ts +36 -0
  5. package/dist/src/data/collector.d.ts.map +1 -0
  6. package/dist/src/data/collector.js +184 -0
  7. package/dist/src/data/collector.test.js +84 -0
  8. package/dist/src/data/dataFlow.d.ts +65 -0
  9. package/dist/src/data/dataFlow.d.ts.map +1 -0
  10. package/dist/src/data/dataFlow.js +142 -0
  11. package/dist/src/data/dataFlow.test.js +5 -0
  12. package/dist/src/data/facetNode.d.ts +17 -0
  13. package/dist/src/data/facetNode.d.ts.map +1 -0
  14. package/dist/src/data/facetNode.js +17 -0
  15. package/dist/src/data/flow.test.js +72 -0
  16. package/dist/src/data/flowNode.d.ts +136 -0
  17. package/dist/src/data/flowNode.d.ts.map +1 -0
  18. package/dist/src/data/flowNode.js +286 -0
  19. package/dist/src/data/flowNode.test.js +50 -0
  20. package/dist/src/data/flowOptimizer.d.ts +27 -0
  21. package/dist/src/data/flowOptimizer.d.ts.map +1 -0
  22. package/dist/src/data/flowOptimizer.js +133 -0
  23. package/dist/src/data/flowOptimizer.test.js +193 -0
  24. package/dist/src/data/flowTestUtils.d.ts +30 -0
  25. package/dist/src/data/flowTestUtils.d.ts.map +1 -0
  26. package/dist/src/data/flowTestUtils.js +63 -0
  27. package/dist/src/data/formats/fasta.d.ts +20 -0
  28. package/dist/src/data/formats/fasta.d.ts.map +1 -0
  29. package/dist/src/data/formats/fasta.js +32 -0
  30. package/dist/src/data/formats/fasta.test.js +27 -0
  31. package/dist/src/data/sources/dataSource.d.ts +12 -0
  32. package/dist/src/data/sources/dataSource.d.ts.map +1 -0
  33. package/dist/src/data/sources/dataSource.js +25 -0
  34. package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
  35. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
  36. package/dist/src/data/sources/dataSourceFactory.js +127 -0
  37. package/dist/src/data/sources/dataUtils.d.ts +50 -0
  38. package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
  39. package/dist/src/data/sources/dataUtils.js +83 -0
  40. package/dist/src/data/sources/dynamic/README.md +3 -0
  41. package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
  42. package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
  43. package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
  44. package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
  45. package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
  46. package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
  47. package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
  48. package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
  49. package/dist/src/data/sources/dynamic/bamSource.js +115 -0
  50. package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
  51. package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
  52. package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
  53. package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
  54. package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
  55. package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
  56. package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
  57. package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
  58. package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
  59. package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
  60. package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
  61. package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
  62. package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
  63. package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
  64. package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
  65. package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
  66. package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
  67. package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
  68. package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
  69. package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
  70. package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
  71. package/dist/src/data/sources/inlineSource.d.ts +16 -0
  72. package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
  73. package/dist/src/data/sources/inlineSource.js +68 -0
  74. package/dist/src/data/sources/inlineSource.test.js +56 -0
  75. package/dist/src/data/sources/namedSource.d.ts +25 -0
  76. package/dist/src/data/sources/namedSource.d.ts.map +1 -0
  77. package/dist/src/data/sources/namedSource.js +80 -0
  78. package/dist/src/data/sources/sequenceSource.d.ts +17 -0
  79. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
  80. package/dist/src/data/sources/sequenceSource.js +47 -0
  81. package/dist/src/data/sources/sequenceSource.test.js +46 -0
  82. package/dist/src/data/sources/urlSource.d.ts +16 -0
  83. package/dist/src/data/sources/urlSource.d.ts.map +1 -0
  84. package/dist/src/data/sources/urlSource.js +74 -0
  85. package/dist/src/data/transforms/aggregate.d.ts +18 -0
  86. package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
  87. package/dist/src/data/transforms/aggregate.js +67 -0
  88. package/dist/src/data/transforms/clone.d.ts +15 -0
  89. package/dist/src/data/transforms/clone.d.ts.map +1 -0
  90. package/dist/src/data/transforms/clone.js +40 -0
  91. package/dist/src/data/transforms/clone.test.js +11 -0
  92. package/dist/src/data/transforms/coverage.d.ts +30 -0
  93. package/dist/src/data/transforms/coverage.d.ts.map +1 -0
  94. package/dist/src/data/transforms/coverage.js +183 -0
  95. package/dist/src/data/transforms/coverage.test.js +123 -0
  96. package/dist/src/data/transforms/filter.d.ts +12 -0
  97. package/dist/src/data/transforms/filter.d.ts.map +1 -0
  98. package/dist/src/data/transforms/filter.js +33 -0
  99. package/dist/src/data/transforms/filter.test.js +18 -0
  100. package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
  101. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
  102. package/dist/src/data/transforms/filterScoredLabels.js +134 -0
  103. package/dist/src/data/transforms/flatten.d.ts +10 -0
  104. package/dist/src/data/transforms/flatten.d.ts.map +1 -0
  105. package/dist/src/data/transforms/flatten.js +68 -0
  106. package/dist/src/data/transforms/flatten.test.js +93 -0
  107. package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
  108. package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
  109. package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
  110. package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
  111. package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
  112. package/dist/src/data/transforms/flattenDelimited.js +66 -0
  113. package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
  114. package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
  115. package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
  116. package/dist/src/data/transforms/flattenSequence.js +35 -0
  117. package/dist/src/data/transforms/flattenSequence.test.js +34 -0
  118. package/dist/src/data/transforms/formula.d.ts +13 -0
  119. package/dist/src/data/transforms/formula.d.ts.map +1 -0
  120. package/dist/src/data/transforms/formula.js +35 -0
  121. package/dist/src/data/transforms/formula.test.js +19 -0
  122. package/dist/src/data/transforms/identifier.d.ts +40 -0
  123. package/dist/src/data/transforms/identifier.d.ts.map +1 -0
  124. package/dist/src/data/transforms/identifier.js +106 -0
  125. package/dist/src/data/transforms/identifier.test.js +83 -0
  126. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
  127. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
  128. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
  129. package/dist/src/data/transforms/measureText.d.ts +18 -0
  130. package/dist/src/data/transforms/measureText.d.ts.map +1 -0
  131. package/dist/src/data/transforms/measureText.js +42 -0
  132. package/dist/src/data/transforms/pileup.d.ts +10 -0
  133. package/dist/src/data/transforms/pileup.d.ts.map +1 -0
  134. package/dist/src/data/transforms/pileup.js +126 -0
  135. package/dist/src/data/transforms/pileup.test.js +70 -0
  136. package/dist/src/data/transforms/project.d.ts +13 -0
  137. package/dist/src/data/transforms/project.d.ts.map +1 -0
  138. package/dist/src/data/transforms/project.js +38 -0
  139. package/dist/src/data/transforms/project.test.js +32 -0
  140. package/dist/src/data/transforms/regexExtract.d.ts +13 -0
  141. package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
  142. package/dist/src/data/transforms/regexExtract.js +57 -0
  143. package/dist/src/data/transforms/regexExtract.test.js +67 -0
  144. package/dist/src/data/transforms/regexFold.d.ts +14 -0
  145. package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
  146. package/dist/src/data/transforms/regexFold.js +139 -0
  147. package/dist/src/data/transforms/regexFold.test.js +160 -0
  148. package/dist/src/data/transforms/sample.d.ts +42 -0
  149. package/dist/src/data/transforms/sample.d.ts.map +1 -0
  150. package/dist/src/data/transforms/sample.js +99 -0
  151. package/dist/src/data/transforms/sample.test.js +38 -0
  152. package/dist/src/data/transforms/stack.d.ts +11 -0
  153. package/dist/src/data/transforms/stack.d.ts.map +1 -0
  154. package/dist/src/data/transforms/stack.js +134 -0
  155. package/dist/src/data/transforms/stack.test.js +91 -0
  156. package/dist/src/data/transforms/transformFactory.d.ts +12 -0
  157. package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
  158. package/dist/src/data/transforms/transformFactory.js +59 -0
  159. package/dist/src/encoder/accessor.d.ts +15 -0
  160. package/dist/src/encoder/accessor.d.ts.map +1 -0
  161. package/dist/src/encoder/accessor.js +76 -0
  162. package/dist/src/encoder/accessor.test.js +47 -0
  163. package/dist/src/encoder/encoder.d.ts +144 -0
  164. package/dist/src/encoder/encoder.d.ts.map +1 -0
  165. package/dist/src/encoder/encoder.js +400 -0
  166. package/dist/src/encoder/encoder.test.js +98 -0
  167. package/dist/src/fonts/Lato-Regular.json +1267 -0
  168. package/dist/src/fonts/Lato-Regular.png +0 -0
  169. package/dist/src/fonts/OFL.txt +93 -0
  170. package/dist/src/fonts/README.md +3 -0
  171. package/dist/src/fonts/bmFontManager.d.ts +182 -0
  172. package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
  173. package/dist/src/fonts/bmFontManager.js +359 -0
  174. package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
  175. package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
  176. package/dist/src/fonts/bmFontMetrics.js +108 -0
  177. package/dist/src/genome/genome.d.ts +172 -0
  178. package/dist/src/genome/genome.d.ts.map +1 -0
  179. package/dist/src/genome/genome.js +379 -0
  180. package/dist/src/genome/genome.test.js +226 -0
  181. package/dist/src/genome/genomeStore.d.ts +20 -0
  182. package/dist/src/genome/genomeStore.d.ts.map +1 -0
  183. package/dist/src/genome/genomeStore.js +54 -0
  184. package/dist/src/genome/locusFormat.d.ts +14 -0
  185. package/dist/src/genome/locusFormat.d.ts.map +1 -0
  186. package/dist/src/genome/locusFormat.js +37 -0
  187. package/dist/src/genome/scaleIndex.d.ts +6 -0
  188. package/dist/src/genome/scaleIndex.d.ts.map +1 -0
  189. package/dist/src/genome/scaleIndex.js +165 -0
  190. package/dist/src/genome/scaleIndex.test.js +78 -0
  191. package/dist/src/genome/scaleLocus.d.ts +3 -0
  192. package/dist/src/genome/scaleLocus.d.ts.map +1 -0
  193. package/dist/src/genome/scaleLocus.js +101 -0
  194. package/dist/src/genome/scaleLocus.test.js +4 -0
  195. package/dist/src/genomeSpy.d.ts +141 -0
  196. package/dist/src/genomeSpy.d.ts.map +1 -0
  197. package/dist/src/genomeSpy.js +788 -0
  198. package/dist/src/gl/arrayBuilder.d.ts +71 -0
  199. package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
  200. package/dist/src/gl/arrayBuilder.js +199 -0
  201. package/dist/src/gl/dataToVertices.d.ts +194 -0
  202. package/dist/src/gl/dataToVertices.d.ts.map +1 -0
  203. package/dist/src/gl/dataToVertices.js +639 -0
  204. package/dist/src/gl/includes/common.glsl.js +2 -0
  205. package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
  206. package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
  207. package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
  208. package/dist/src/gl/includes/scales.glsl.js +2 -0
  209. package/dist/src/gl/link.fragment.glsl.js +2 -0
  210. package/dist/src/gl/link.vertex.glsl.js +2 -0
  211. package/dist/src/gl/point.fragment.glsl.js +2 -0
  212. package/dist/src/gl/point.vertex.glsl.js +2 -0
  213. package/dist/src/gl/rect.fragment.glsl.js +2 -0
  214. package/dist/src/gl/rect.vertex.glsl.js +2 -0
  215. package/dist/src/gl/rule.fragment.glsl.js +2 -0
  216. package/dist/src/gl/rule.vertex.glsl.js +2 -0
  217. package/dist/src/gl/text.fragment.glsl.js +2 -0
  218. package/dist/src/gl/text.vertex.glsl.js +2 -0
  219. package/dist/src/gl/webGLHelper.d.ts +118 -0
  220. package/dist/src/gl/webGLHelper.d.ts.map +1 -0
  221. package/dist/src/gl/webGLHelper.js +513 -0
  222. package/dist/src/img/bowtie.svg +1 -0
  223. package/dist/src/img/genomespy-favicon.svg +34 -0
  224. package/dist/src/index.d.ts +15 -0
  225. package/dist/src/index.d.ts.map +1 -0
  226. package/dist/src/index.html +11 -0
  227. package/dist/src/index.js +129 -0
  228. package/dist/src/marks/link.d.ts +11 -0
  229. package/dist/src/marks/link.d.ts.map +1 -0
  230. package/dist/src/marks/link.js +175 -0
  231. package/dist/src/marks/mark.d.ts +226 -0
  232. package/dist/src/marks/mark.d.ts.map +1 -0
  233. package/dist/src/marks/mark.js +1004 -0
  234. package/dist/src/marks/markUtils.d.ts +23 -0
  235. package/dist/src/marks/markUtils.d.ts.map +1 -0
  236. package/dist/src/marks/markUtils.js +125 -0
  237. package/dist/src/marks/pointMark.d.ts +11 -0
  238. package/dist/src/marks/pointMark.d.ts.map +1 -0
  239. package/dist/src/marks/pointMark.js +251 -0
  240. package/dist/src/marks/rectMark.d.ts +18 -0
  241. package/dist/src/marks/rectMark.d.ts.map +1 -0
  242. package/dist/src/marks/rectMark.js +255 -0
  243. package/dist/src/marks/rule.d.ts +6 -0
  244. package/dist/src/marks/rule.d.ts.map +1 -0
  245. package/dist/src/marks/rule.js +250 -0
  246. package/dist/src/marks/text.d.ts +13 -0
  247. package/dist/src/marks/text.d.ts.map +1 -0
  248. package/dist/src/marks/text.js +279 -0
  249. package/dist/src/scale/colorUtils.d.ts +34 -0
  250. package/dist/src/scale/colorUtils.d.ts.map +1 -0
  251. package/dist/src/scale/colorUtils.js +184 -0
  252. package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
  253. package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
  254. package/dist/src/scale/glslScaleGenerator.js +506 -0
  255. package/dist/src/scale/scale.d.ts +10 -0
  256. package/dist/src/scale/scale.d.ts.map +1 -0
  257. package/dist/src/scale/scale.js +456 -0
  258. package/dist/src/scale/scale.test.js +324 -0
  259. package/dist/src/scale/ticks.d.ts +47 -0
  260. package/dist/src/scale/ticks.d.ts.map +1 -0
  261. package/dist/src/scale/ticks.js +203 -0
  262. package/dist/src/scale/ticks.test.js +40 -0
  263. package/dist/src/singlePageApp.d.ts +2 -0
  264. package/dist/src/singlePageApp.d.ts.map +1 -0
  265. package/dist/src/singlePageApp.js +13 -0
  266. package/dist/src/spec/axis.d.ts +402 -0
  267. package/dist/src/spec/channel.d.ts +440 -0
  268. package/dist/src/spec/data.d.ts +370 -0
  269. package/dist/src/spec/font.d.ts +15 -0
  270. package/dist/src/spec/genome.d.ts +35 -0
  271. package/dist/src/spec/mark.d.ts +435 -0
  272. package/dist/src/spec/root.d.ts +22 -0
  273. package/dist/src/spec/sampleView.d.ts +185 -0
  274. package/dist/src/spec/scale.d.ts +273 -0
  275. package/dist/src/spec/title.d.ts +102 -0
  276. package/dist/src/spec/tooltip.d.ts +9 -0
  277. package/dist/src/spec/transform.d.ts +504 -0
  278. package/dist/src/spec/view.d.ts +214 -0
  279. package/dist/src/styles/genome-spy.css.d.ts +3 -0
  280. package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
  281. package/dist/src/styles/genome-spy.css.js +114 -0
  282. package/dist/src/styles/genome-spy.scss +153 -0
  283. package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
  284. package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
  285. package/dist/src/tooltip/dataTooltipHandler.js +64 -0
  286. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
  287. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
  288. package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
  289. package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
  290. package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
  291. package/dist/src/tooltip/tooltipHandler.ts +12 -0
  292. package/dist/src/types/bmFont.d.ts +58 -0
  293. package/dist/src/types/embedApi.d.ts +67 -0
  294. package/dist/src/types/encoder.d.ts +84 -0
  295. package/dist/src/types/flowBatch.d.ts +40 -0
  296. package/dist/src/types/rendering.d.ts +65 -0
  297. package/dist/src/types/scaleResolutionApi.d.ts +40 -0
  298. package/dist/src/types/viewContext.d.ts +85 -0
  299. package/dist/src/utils/addBaseUrl.d.ts +6 -0
  300. package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
  301. package/dist/src/utils/addBaseUrl.js +19 -0
  302. package/dist/src/utils/addBaseUrl.test.js +22 -0
  303. package/dist/src/utils/animator.d.ts +41 -0
  304. package/dist/src/utils/animator.d.ts.map +1 -0
  305. package/dist/src/utils/animator.js +83 -0
  306. package/dist/src/utils/arrayUtils.d.ts +34 -0
  307. package/dist/src/utils/arrayUtils.d.ts.map +1 -0
  308. package/dist/src/utils/arrayUtils.js +61 -0
  309. package/dist/src/utils/binnedIndex.d.ts +23 -0
  310. package/dist/src/utils/binnedIndex.d.ts.map +1 -0
  311. package/dist/src/utils/binnedIndex.js +167 -0
  312. package/dist/src/utils/binnedIndex.test.js +155 -0
  313. package/dist/src/utils/clamp.d.ts +7 -0
  314. package/dist/src/utils/clamp.d.ts.map +1 -0
  315. package/dist/src/utils/clamp.js +8 -0
  316. package/dist/src/utils/cloner.d.ts +16 -0
  317. package/dist/src/utils/cloner.d.ts.map +1 -0
  318. package/dist/src/utils/cloner.js +34 -0
  319. package/dist/src/utils/cloner.test.js +24 -0
  320. package/dist/src/utils/coalesce.d.ts +6 -0
  321. package/dist/src/utils/coalesce.d.ts.map +1 -0
  322. package/dist/src/utils/coalesce.js +11 -0
  323. package/dist/src/utils/coalesce.test.js +16 -0
  324. package/dist/src/utils/concatIterables.d.ts +8 -0
  325. package/dist/src/utils/concatIterables.d.ts.map +1 -0
  326. package/dist/src/utils/concatIterables.js +26 -0
  327. package/dist/src/utils/concatIterables.test.js +8 -0
  328. package/dist/src/utils/debounce.d.ts +8 -0
  329. package/dist/src/utils/debounce.d.ts.map +1 -0
  330. package/dist/src/utils/debounce.js +37 -0
  331. package/dist/src/utils/domainArray.d.ts +61 -0
  332. package/dist/src/utils/domainArray.d.ts.map +1 -0
  333. package/dist/src/utils/domainArray.js +216 -0
  334. package/dist/src/utils/domainArray.test.js +130 -0
  335. package/dist/src/utils/eerp.d.ts +12 -0
  336. package/dist/src/utils/eerp.d.ts.map +1 -0
  337. package/dist/src/utils/eerp.js +13 -0
  338. package/dist/src/utils/expression.d.ts +9 -0
  339. package/dist/src/utils/expression.d.ts.map +1 -0
  340. package/dist/src/utils/expression.js +32 -0
  341. package/dist/src/utils/field.d.ts +17 -0
  342. package/dist/src/utils/field.d.ts.map +1 -0
  343. package/dist/src/utils/field.js +28 -0
  344. package/dist/src/utils/formatObject.d.ts +7 -0
  345. package/dist/src/utils/formatObject.d.ts.map +1 -0
  346. package/dist/src/utils/formatObject.js +37 -0
  347. package/dist/src/utils/indexer.d.ts +16 -0
  348. package/dist/src/utils/indexer.d.ts.map +1 -0
  349. package/dist/src/utils/indexer.js +43 -0
  350. package/dist/src/utils/indexer.test.js +47 -0
  351. package/dist/src/utils/inertia.d.ts +42 -0
  352. package/dist/src/utils/inertia.d.ts.map +1 -0
  353. package/dist/src/utils/inertia.js +124 -0
  354. package/dist/src/utils/interactionEvent.d.ts +26 -0
  355. package/dist/src/utils/interactionEvent.d.ts.map +1 -0
  356. package/dist/src/utils/interactionEvent.js +33 -0
  357. package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
  358. package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
  359. package/dist/src/utils/iterateNestedMaps.js +21 -0
  360. package/dist/src/utils/iterateNestedMaps.test.js +33 -0
  361. package/dist/src/utils/kWayMerge.d.ts +9 -0
  362. package/dist/src/utils/kWayMerge.d.ts.map +1 -0
  363. package/dist/src/utils/kWayMerge.js +42 -0
  364. package/dist/src/utils/kWayMerge.test.js +26 -0
  365. package/dist/src/utils/layout/flexLayout.d.ts +182 -0
  366. package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
  367. package/dist/src/utils/layout/flexLayout.js +381 -0
  368. package/dist/src/utils/layout/flexLayout.test.js +323 -0
  369. package/dist/src/utils/layout/grid.d.ts +29 -0
  370. package/dist/src/utils/layout/grid.d.ts.map +1 -0
  371. package/dist/src/utils/layout/grid.js +95 -0
  372. package/dist/src/utils/layout/grid.test.js +71 -0
  373. package/dist/src/utils/layout/padding.d.ts +83 -0
  374. package/dist/src/utils/layout/padding.d.ts.map +1 -0
  375. package/dist/src/utils/layout/padding.js +155 -0
  376. package/dist/src/utils/layout/point.d.ts +16 -0
  377. package/dist/src/utils/layout/point.d.ts.map +1 -0
  378. package/dist/src/utils/layout/point.js +23 -0
  379. package/dist/src/utils/layout/rectangle.d.ts +142 -0
  380. package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
  381. package/dist/src/utils/layout/rectangle.js +296 -0
  382. package/dist/src/utils/layout/rectangle.test.js +172 -0
  383. package/dist/src/utils/mergeObjects.d.ts +15 -0
  384. package/dist/src/utils/mergeObjects.d.ts.map +1 -0
  385. package/dist/src/utils/mergeObjects.js +99 -0
  386. package/dist/src/utils/mergeObjects.test.js +42 -0
  387. package/dist/src/utils/numberExtractor.d.ts +9 -0
  388. package/dist/src/utils/numberExtractor.d.ts.map +1 -0
  389. package/dist/src/utils/numberExtractor.js +24 -0
  390. package/dist/src/utils/numberExtractor.test.js +6 -0
  391. package/dist/src/utils/point.d.ts +9 -0
  392. package/dist/src/utils/point.d.ts.map +1 -0
  393. package/dist/src/utils/point.js +14 -0
  394. package/dist/src/utils/propertyCacher.d.ts +30 -0
  395. package/dist/src/utils/propertyCacher.d.ts.map +1 -0
  396. package/dist/src/utils/propertyCacher.js +70 -0
  397. package/dist/src/utils/propertyCacher.test.js +85 -0
  398. package/dist/src/utils/propertyCoalescer.d.ts +15 -0
  399. package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
  400. package/dist/src/utils/propertyCoalescer.js +42 -0
  401. package/dist/src/utils/propertyCoalescer.test.js +22 -0
  402. package/dist/src/utils/reservationMap.d.ts +42 -0
  403. package/dist/src/utils/reservationMap.d.ts.map +1 -0
  404. package/dist/src/utils/reservationMap.js +103 -0
  405. package/dist/src/utils/reservationMap.test.js +20 -0
  406. package/dist/src/utils/scaleNull.d.ts +13 -0
  407. package/dist/src/utils/scaleNull.d.ts.map +1 -0
  408. package/dist/src/utils/scaleNull.js +21 -0
  409. package/dist/src/utils/setOperations.d.ts +31 -0
  410. package/dist/src/utils/setOperations.d.ts.map +1 -0
  411. package/dist/src/utils/setOperations.js +75 -0
  412. package/dist/src/utils/smoothstep.d.ts +7 -0
  413. package/dist/src/utils/smoothstep.d.ts.map +1 -0
  414. package/dist/src/utils/smoothstep.js +10 -0
  415. package/dist/src/utils/throttle.d.ts +8 -0
  416. package/dist/src/utils/throttle.d.ts.map +1 -0
  417. package/dist/src/utils/throttle.js +34 -0
  418. package/dist/src/utils/topK.d.ts +22 -0
  419. package/dist/src/utils/topK.d.ts.map +1 -0
  420. package/dist/src/utils/topK.js +76 -0
  421. package/dist/src/utils/topK.test.js +64 -0
  422. package/dist/src/utils/transition.d.ts +44 -0
  423. package/dist/src/utils/transition.d.ts.map +1 -0
  424. package/dist/src/utils/transition.js +74 -0
  425. package/dist/src/utils/trees.d.ts +56 -0
  426. package/dist/src/utils/trees.d.ts.map +1 -0
  427. package/dist/src/utils/trees.js +92 -0
  428. package/dist/src/utils/trees.test.js +130 -0
  429. package/dist/src/utils/ui/tooltip.d.ts +50 -0
  430. package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
  431. package/dist/src/utils/ui/tooltip.js +189 -0
  432. package/dist/src/utils/url.d.ts +9 -0
  433. package/dist/src/utils/url.d.ts.map +1 -0
  434. package/dist/src/utils/url.js +22 -0
  435. package/dist/src/utils/variableTools.d.ts +14 -0
  436. package/dist/src/utils/variableTools.d.ts.map +1 -0
  437. package/dist/src/utils/variableTools.js +24 -0
  438. package/dist/src/utils/variableTools.test.js +13 -0
  439. package/dist/src/view/axisGridView.d.ts +39 -0
  440. package/dist/src/view/axisGridView.d.ts.map +1 -0
  441. package/dist/src/view/axisGridView.js +246 -0
  442. package/dist/src/view/axisResolution.d.ts +24 -0
  443. package/dist/src/view/axisResolution.d.ts.map +1 -0
  444. package/dist/src/view/axisResolution.js +141 -0
  445. package/dist/src/view/axisResolution.test.js +201 -0
  446. package/dist/src/view/axisView.d.ts +49 -0
  447. package/dist/src/view/axisView.d.ts.map +1 -0
  448. package/dist/src/view/axisView.js +629 -0
  449. package/dist/src/view/concatView.d.ts +16 -0
  450. package/dist/src/view/concatView.d.ts.map +1 -0
  451. package/dist/src/view/concatView.js +84 -0
  452. package/dist/src/view/containerView.d.ts +43 -0
  453. package/dist/src/view/containerView.d.ts.map +1 -0
  454. package/dist/src/view/containerView.js +137 -0
  455. package/dist/src/view/facetView.d.ts +71 -0
  456. package/dist/src/view/facetView.d.ts.map +1 -0
  457. package/dist/src/view/facetView.js +492 -0
  458. package/dist/src/view/flowBuilder.d.ts +37 -0
  459. package/dist/src/view/flowBuilder.d.ts.map +1 -0
  460. package/dist/src/view/flowBuilder.js +383 -0
  461. package/dist/src/view/flowBuilder.test.js +125 -0
  462. package/dist/src/view/gridView.d.ts +111 -0
  463. package/dist/src/view/gridView.d.ts.map +1 -0
  464. package/dist/src/view/gridView.js +1086 -0
  465. package/dist/src/view/implicitRootView.d.ts +9 -0
  466. package/dist/src/view/implicitRootView.d.ts.map +1 -0
  467. package/dist/src/view/implicitRootView.js +23 -0
  468. package/dist/src/view/importView.d.ts +17 -0
  469. package/dist/src/view/importView.d.ts.map +1 -0
  470. package/dist/src/view/importView.js +22 -0
  471. package/dist/src/view/layerView.d.ts +25 -0
  472. package/dist/src/view/layerView.d.ts.map +1 -0
  473. package/dist/src/view/layerView.js +77 -0
  474. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
  475. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
  476. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
  477. package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
  478. package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
  479. package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
  480. package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
  481. package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
  482. package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
  483. package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
  484. package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
  485. package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
  486. package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
  487. package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
  488. package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
  489. package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
  490. package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
  491. package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
  492. package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
  493. package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
  494. package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
  495. package/dist/src/view/scaleResolution.d.ts +170 -0
  496. package/dist/src/view/scaleResolution.d.ts.map +1 -0
  497. package/dist/src/view/scaleResolution.js +874 -0
  498. package/dist/src/view/scaleResolution.test.js +658 -0
  499. package/dist/src/view/testUtils.d.ts +30 -0
  500. package/dist/src/view/testUtils.d.ts.map +1 -0
  501. package/dist/src/view/testUtils.js +101 -0
  502. package/dist/src/view/title.d.ts +6 -0
  503. package/dist/src/view/title.d.ts.map +1 -0
  504. package/dist/src/view/title.js +165 -0
  505. package/dist/src/view/unitView.d.ts +93 -0
  506. package/dist/src/view/unitView.d.ts.map +1 -0
  507. package/dist/src/view/unitView.js +345 -0
  508. package/dist/src/view/view.d.ts +291 -0
  509. package/dist/src/view/view.d.ts.map +1 -0
  510. package/dist/src/view/view.js +691 -0
  511. package/dist/src/view/view.test.js +214 -0
  512. package/dist/src/view/viewFactory.d.ts +76 -0
  513. package/dist/src/view/viewFactory.d.ts.map +1 -0
  514. package/dist/src/view/viewFactory.js +178 -0
  515. package/dist/src/view/viewFactory.test.js +17 -0
  516. package/dist/src/view/viewUtils.d.ts +90 -0
  517. package/dist/src/view/viewUtils.d.ts.map +1 -0
  518. package/dist/src/view/viewUtils.js +326 -0
  519. package/dist/src/view/zoom.d.ts +23 -0
  520. package/dist/src/view/zoom.d.ts.map +1 -0
  521. package/dist/src/view/zoom.js +89 -0
  522. package/package.json +17 -12
  523. package/dist/style.css +0 -1
@@ -0,0 +1,108 @@
1
+ export const SDF_PADDING = 5; // Not sure if this is same with all msdf bmfonts...
2
+
3
+ const MAX_ASCII = 127;
4
+
5
+ /**
6
+ * Metrics calculation for msdf bmfonts:
7
+ *
8
+ * https://github.com/mattdesl/bmfont2json
9
+ * https://github.com/etiennepinchon/aframe-fonts
10
+ *
11
+ * @typedef {import("../types/bmFont").Char} Char
12
+ *
13
+ * @typedef {object} BMFontMetrics
14
+ * @prop {(text: string, fontSize?: number) => number} measureWidth
15
+ * @prop {(charCode: number) => Char} getCharByCode
16
+ * @prop {(char: string) => Char} getChar
17
+ * @prop {number} xHeight
18
+ * @prop {number} capHeight
19
+ * @prop {number} descent
20
+ * @prop {import("../types/bmFont").Common} common
21
+ *
22
+ * @param {import("../types/bmFont").BMFont} bmFont
23
+ * @returns {BMFontMetrics}
24
+ */
25
+ export default function getMetrics(bmFont) {
26
+ /**
27
+ * Use an ordinary array for fast lookup of ascii chars
28
+ *
29
+ * @type {import("../types/bmFont").Char[]}
30
+ */
31
+ const asciiChars = [];
32
+
33
+ // Ensure that the array is not "holey": https://v8.dev/blog/elements-kinds
34
+ for (let i = 0; i <= MAX_ASCII; i++) {
35
+ asciiChars.push(undefined);
36
+ }
37
+
38
+ /**
39
+ * Put the rest (unicode = sparse and infrequent) chars into a map
40
+ *
41
+ * @type {Map<number, Char>}
42
+ */
43
+ const unicodeChars = new Map();
44
+
45
+ for (const char of bmFont.chars) {
46
+ if (char.id <= MAX_ASCII) {
47
+ asciiChars[char.id] = char;
48
+ } else {
49
+ unicodeChars.set(char.id, char);
50
+ }
51
+ }
52
+
53
+ // Workaround https://github.com/d3/d3-format/commit/39f41940386024d3b8a2172240189a0950c8dd23
54
+ const minusHyphen = 8722;
55
+ if (!unicodeChars.has(minusHyphen)) {
56
+ unicodeChars.set(minusHyphen, asciiChars["-".charCodeAt(0)]);
57
+ }
58
+
59
+ /** @param {number} charCode */
60
+ function getCharByCode(charCode) {
61
+ const char =
62
+ charCode <= MAX_ASCII
63
+ ? asciiChars[charCode]
64
+ : unicodeChars.get(charCode);
65
+ return char || asciiChars[63];
66
+ }
67
+
68
+ /** @param {string} char */
69
+ function getChar(char) {
70
+ return getCharByCode(char.charCodeAt(0));
71
+ }
72
+
73
+ const base = bmFont.common.base;
74
+
75
+ // Font metrics are not available in the bmfont metadata. Have to calculate...
76
+ const x = getChar("x");
77
+ const X = getChar("X");
78
+ const q = getChar("q");
79
+
80
+ const xHeight = x.height - SDF_PADDING * 2;
81
+ const capHeight = X.height - SDF_PADDING * 2;
82
+ const descent = q.height - x.height + q.yoffset - x.yoffset;
83
+
84
+ /**
85
+ * TODO: Kerning
86
+ *
87
+ * @param {string} text text to measure
88
+ * @param {number} fontSize
89
+ */
90
+ function measureWidth(text, fontSize = 1.0) {
91
+ let width = 0;
92
+ for (let i = 0; i < text.length; i++) {
93
+ width += getCharByCode(text.charCodeAt(i)).xadvance;
94
+ }
95
+
96
+ return (width / base) * fontSize;
97
+ }
98
+
99
+ return {
100
+ measureWidth,
101
+ getCharByCode,
102
+ getChar,
103
+ xHeight,
104
+ capHeight,
105
+ descent,
106
+ common: bmFont.common,
107
+ };
108
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ *
3
+ * @param {string} chromSizesData
4
+ */
5
+ export function parseChromSizes(chromSizesData: string): {
6
+ name: string;
7
+ size: number;
8
+ }[];
9
+ /**
10
+ *
11
+ * @param {any} value
12
+ * @return {value is ChromosomalLocus}
13
+ */
14
+ export function isChromosomalLocus(value: any): value is import("../spec/genome").ChromosomalLocus;
15
+ /**
16
+ *
17
+ * @param {any[]} value
18
+ * @return {value is ChromosomalLocus[]}
19
+ */
20
+ export function isChromosomalLocusInterval(value: any[]): value is import("../spec/genome").ChromosomalLocus[];
21
+ /**
22
+ * @typedef {import("../spec/genome").GenomeConfig} GenomeConfig
23
+ * @typedef {import("../spec/genome").ChromosomalLocus} ChromosomalLocus
24
+ *
25
+ * @typedef {object} Chromosome
26
+ * @prop {string} name
27
+ * @prop {number} size
28
+ *
29
+ * @typedef {object} ChromosomeAnnotation
30
+ * @prop {number} index 0-based index
31
+ * @prop {number} number 1-based index
32
+ * @prop {number} continuousStart zero-based start, inclusive
33
+ * @prop {number} continuousEnd zero-based end, exclusive
34
+ * @prop {number[]} continuousInterval
35
+ * @prop {boolean} odd true if odd chrom number
36
+ *
37
+ * @typedef {object} DiscreteChromosomeInterval
38
+ * @prop {string} chrom
39
+ * @prop {number} startPos
40
+ * @prop {number} endPos
41
+ */
42
+ export default class Genome {
43
+ /**
44
+ * @param {GenomeConfig} config
45
+ */
46
+ constructor(config: GenomeConfig);
47
+ config: import("../spec/genome").GenomeConfig;
48
+ /** @type {(Chromosome & ChromosomeAnnotation)[]} */
49
+ chromosomes: (Chromosome & ChromosomeAnnotation)[];
50
+ /** @type {Map<string | number, number>} */
51
+ cumulativeChromPositions: Map<string | number, number>;
52
+ /** @type {Map<string | number, Chromosome & ChromosomeAnnotation>} */
53
+ chromosomesByName: Map<string | number, Chromosome & ChromosomeAnnotation>;
54
+ /** @type {number[]} */
55
+ startByIndex: number[];
56
+ totalSize: number;
57
+ get name(): string;
58
+ /**
59
+ * @param {string} baseUrl
60
+ */
61
+ load(baseUrl: string): Promise<void>;
62
+ baseUrl: string;
63
+ hasChrPrefix(): boolean;
64
+ /**
65
+ *
66
+ * @param {Chromosome[]} chromSizes
67
+ */
68
+ setChromSizes(chromSizes: Chromosome[]): void;
69
+ getExtent(): number[];
70
+ /**
71
+ * Returns a chromosomal locus in the continuous domain
72
+ *
73
+ * @param {string | number} chrom A number or name with or without a "chr" prefix. Examples: 23, chrX, X
74
+ * @param {number} pos zero-based coordinate
75
+ */
76
+ toContinuous(chrom: string | number, pos: number): number;
77
+ /**
78
+ *
79
+ * @param {number} continuousPos
80
+ */
81
+ toChromosome(continuousPos: number): Chromosome & ChromosomeAnnotation;
82
+ /**
83
+ *
84
+ * @param {number} continuousPos
85
+ * @returns {ChromosomalLocus}
86
+ */
87
+ toChromosomal(continuousPos: number): ChromosomalLocus;
88
+ /**
89
+ *
90
+ * @param {string} name
91
+ */
92
+ getChromosome(name: string): Chromosome & ChromosomeAnnotation;
93
+ /**
94
+ * Returns a UCSC Genome Browser -style string presentation of the interval.
95
+ * However, the interval may span multiple chromosomes, which is incompatible
96
+ * with UCSC.
97
+ *
98
+ * The inteval is shown as one-based closed-open range.
99
+ * See https://genome.ucsc.edu/FAQ/FAQtracks#tracks1
100
+ *
101
+ * @param {number[]} interval
102
+ * @returns {string}
103
+ */
104
+ formatInterval(interval: number[]): string;
105
+ /**
106
+ * @param {number[]} interval
107
+ * @returns {[ChromosomalLocus, ChromosomalLocus]}
108
+ */
109
+ toChromosomalInterval(interval: number[]): [ChromosomalLocus, ChromosomalLocus];
110
+ /**
111
+ * Returns a continuous interval. The optional position of the left end defaults to zero,
112
+ * the right end defaults to the size of the chromosome. Thus, the chromosome is inclusive
113
+ * when positions are omitted.
114
+ *
115
+ * @param {ChromosomalLocus[]} chromosomal
116
+ */
117
+ toContinuousInterval(chromosomal: ChromosomalLocus[]): number[];
118
+ /**
119
+ * Returns an array of discrete chromosome intervals that fall within the given interval.
120
+ *
121
+ * @param {[ChromosomalLocus, ChromosomalLocus]} interval
122
+ * @returns {DiscreteChromosomeInterval[]}
123
+ */
124
+ toDiscreteChromosomeIntervals(interval: [ChromosomalLocus, ChromosomalLocus]): DiscreteChromosomeInterval[];
125
+ /**
126
+ * Returns an array of discrete chromosome intervals that fall within the given interval.
127
+ *
128
+ * @param {number[]} continuousInterval
129
+ */
130
+ continuousToDiscreteChromosomeIntervals(continuousInterval: number[]): DiscreteChromosomeInterval[];
131
+ /**
132
+ *
133
+ * @param {string} str
134
+ * @returns {[number, number]}
135
+ */
136
+ parseInterval(str: string): [number, number];
137
+ }
138
+ export type GenomeConfig = import("../spec/genome").GenomeConfig;
139
+ export type ChromosomalLocus = import("../spec/genome").ChromosomalLocus;
140
+ export type Chromosome = {
141
+ name: string;
142
+ size: number;
143
+ };
144
+ export type ChromosomeAnnotation = {
145
+ /**
146
+ * 0-based index
147
+ */
148
+ index: number;
149
+ /**
150
+ * 1-based index
151
+ */
152
+ number: number;
153
+ /**
154
+ * zero-based start, inclusive
155
+ */
156
+ continuousStart: number;
157
+ /**
158
+ * zero-based end, exclusive
159
+ */
160
+ continuousEnd: number;
161
+ continuousInterval: number[];
162
+ /**
163
+ * true if odd chrom number
164
+ */
165
+ odd: boolean;
166
+ };
167
+ export type DiscreteChromosomeInterval = {
168
+ chrom: string;
169
+ startPos: number;
170
+ endPos: number;
171
+ };
172
+ //# sourceMappingURL=genome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genome.d.ts","sourceRoot":"","sources":["../../../src/genome/genome.js"],"names":[],"mappings":"AA+VA;;;GAGG;AACH,gDAFW,MAAM;;;IAOhB;AAED;;;;GAIG;AACH,0CAHW,GAAG,sDAKb;AAED;;;;GAIG;AACH,kDAHW,GAAG,EAAE,wDAKf;AAlXD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;IACI;;OAEG;IACH,oBAFW,YAAY,EA4BtB;IAzBG,8CAAoB;IAQpB,oDAAoD;IACpD,aADW,CAAC,UAAU,GAAG,oBAAoB,CAAC,EAAE,CAC3B;IAErB,2CAA2C;IAC3C,0BADW,IAAI,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CACE;IAEzC,sEAAsE;IACtE,mBADW,IAAI,MAAM,GAAG,MAAM,EAAE,UAAU,GAAG,oBAAoB,CAAC,CAChC;IAElC,uBAAuB;IACvB,cADW,MAAM,EAAE,CACG;IAEtB,kBAAkB;IAOtB,mBAEC;IAED;;OAEG;IACH,cAFW,MAAM,iBA0BhB;IAlBO,gBAEyC;IAkBjD,wBAEC;IAED;;;OAGG;IACH,0BAFW,UAAU,EAAE,QA2CtB;IAED,sBAEC;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GAAG,MAAM,OACf,MAAM,UAShB;IAED;;;OAGG;IACH,4BAFW,MAAM,qCAgBhB;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,gBAAgB,CAY5B;IAED;;;OAGG;IACH,oBAFW,MAAM,qCAIhB;IAED;;;;;;;;;;OAUG;IACH,yBAHW,MAAM,EAAE,GACN,MAAM,CAIlB;IAED;;;OAGG;IACH,gCAHW,MAAM,EAAE,GACN,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAUhD;IAED;;;;;;OAMG;IACH,kCAFW,gBAAgB,EAAE,YAgB5B;IAED;;;;;OAKG;IACH,wCAHW,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAClC,0BAA0B,EAAE,CAiCxC;IAED;;;;OAIG;IACH,4DAFW,MAAM,EAAE,gCAOlB;IAED;;;;OAIG;IACH,mBAHW,MAAM,GACJ,CAAC,MAAM,EAAE,MAAM,CAAC,CAgC5B;CACJ;2BApVY,OAAO,gBAAgB,EAAE,YAAY;+BACrC,OAAO,gBAAgB,EAAE,gBAAgB;;UAG5C,MAAM;UACN,MAAM;;;;;;WAGN,MAAM;;;;YACN,MAAM;;;;qBACN,MAAM;;;;mBACN,MAAM;wBACN,MAAM,EAAE;;;;SACR,OAAO;;;WAGP,MAAM;cACN,MAAM;YACN,MAAM"}
@@ -0,0 +1,379 @@
1
+ import { bisect } from "d3-array";
2
+ import { tsvParseRows } from "d3-dsv";
3
+ import { loader } from "vega-loader";
4
+ import { isObject } from "vega-util";
5
+ import { formatRange } from "./locusFormat";
6
+
7
+ const defaultBaseUrl = "https://genomespy.app/data/genomes/";
8
+
9
+ /**
10
+ * @typedef {import("../spec/genome").GenomeConfig} GenomeConfig
11
+ * @typedef {import("../spec/genome").ChromosomalLocus} ChromosomalLocus
12
+ *
13
+ * @typedef {object} Chromosome
14
+ * @prop {string} name
15
+ * @prop {number} size
16
+ *
17
+ * @typedef {object} ChromosomeAnnotation
18
+ * @prop {number} index 0-based index
19
+ * @prop {number} number 1-based index
20
+ * @prop {number} continuousStart zero-based start, inclusive
21
+ * @prop {number} continuousEnd zero-based end, exclusive
22
+ * @prop {number[]} continuousInterval
23
+ * @prop {boolean} odd true if odd chrom number
24
+ *
25
+ * @typedef {object} DiscreteChromosomeInterval
26
+ * @prop {string} chrom
27
+ * @prop {number} startPos
28
+ * @prop {number} endPos
29
+ */
30
+
31
+ export default class Genome {
32
+ /**
33
+ * @param {GenomeConfig} config
34
+ */
35
+ constructor(config) {
36
+ this.config = config;
37
+
38
+ if (!this.config.contigs && typeof this.config.name !== "string") {
39
+ throw new Error(
40
+ "No name has been defined for the genome assembly!"
41
+ );
42
+ }
43
+
44
+ /** @type {(Chromosome & ChromosomeAnnotation)[]} */
45
+ this.chromosomes = [];
46
+
47
+ /** @type {Map<string | number, number>} */
48
+ this.cumulativeChromPositions = new Map();
49
+
50
+ /** @type {Map<string | number, Chromosome & ChromosomeAnnotation>} */
51
+ this.chromosomesByName = new Map();
52
+
53
+ /** @type {number[]} */
54
+ this.startByIndex = [];
55
+
56
+ this.totalSize = 0;
57
+
58
+ if (this.config.contigs) {
59
+ this.setChromSizes(this.config.contigs);
60
+ }
61
+ }
62
+
63
+ get name() {
64
+ return this.config.name;
65
+ }
66
+
67
+ /**
68
+ * @param {string} baseUrl
69
+ */
70
+ async load(baseUrl) {
71
+ if (this.config.contigs) {
72
+ return;
73
+ }
74
+
75
+ if (this.config.baseUrl) {
76
+ this.baseUrl = /^http(s)?/.test(this.config.baseUrl)
77
+ ? this.config.baseUrl
78
+ : baseUrl + "/" + this.config.baseUrl;
79
+ } else {
80
+ this.baseUrl = defaultBaseUrl;
81
+ }
82
+
83
+ try {
84
+ this.setChromSizes(
85
+ parseChromSizes(
86
+ await loader({ baseURL: this.baseUrl }).load(
87
+ `${this.config.name}/${this.name}.chrom.sizes`
88
+ )
89
+ )
90
+ );
91
+ } catch (e) {
92
+ throw new Error(`Could not load chrom sizes: ${e.message}`);
93
+ }
94
+ }
95
+
96
+ hasChrPrefix() {
97
+ return this.chromosomes.some((c) => c.name.startsWith("chr"));
98
+ }
99
+
100
+ /**
101
+ *
102
+ * @param {Chromosome[]} chromSizes
103
+ */
104
+ setChromSizes(chromSizes) {
105
+ let pos = 0;
106
+ this.startByIndex = [0];
107
+
108
+ for (let i = 0; i < chromSizes.length; i++) {
109
+ this.startByIndex.push(pos);
110
+ const size = chromSizes[i].size;
111
+
112
+ const chrom = {
113
+ ...chromSizes[i],
114
+ continuousStart: pos,
115
+ continuousEnd: pos + size,
116
+ continuousInterval: [pos, pos + size],
117
+ index: i,
118
+ number: i + 1,
119
+ // eslint-disable-next-line no-bitwise
120
+ odd: !(i & 1),
121
+ };
122
+
123
+ this.chromosomes.push(chrom);
124
+
125
+ const plain = chrom.name.replace(/^chr/i, "");
126
+ for (const name of [
127
+ "chr" + plain,
128
+ "CHR" + plain,
129
+ "Chr" + plain,
130
+ // The number is a bit fragile because it depends on the order of the chromosomes.
131
+ // It probably works for autosomes, but X, Y, M, etc., not necessarily.
132
+ chrom.number,
133
+ "" + chrom.number,
134
+ plain,
135
+ chrom.name,
136
+ ]) {
137
+ this.cumulativeChromPositions.set(name, pos);
138
+ this.chromosomesByName.set(name, chrom);
139
+ }
140
+
141
+ pos += chrom.size;
142
+ }
143
+
144
+ this.totalSize = pos;
145
+ }
146
+
147
+ getExtent() {
148
+ return [0, this.totalSize];
149
+ }
150
+
151
+ /**
152
+ * Returns a chromosomal locus in the continuous domain
153
+ *
154
+ * @param {string | number} chrom A number or name with or without a "chr" prefix. Examples: 23, chrX, X
155
+ * @param {number} pos zero-based coordinate
156
+ */
157
+ toContinuous(chrom, pos) {
158
+ let offset = this.cumulativeChromPositions.get(chrom);
159
+ if (offset === undefined) {
160
+ throw new Error("Unknown chromosome/contig: " + chrom);
161
+ }
162
+
163
+ return offset + +pos;
164
+ }
165
+
166
+ /**
167
+ *
168
+ * @param {number} continuousPos
169
+ */
170
+ toChromosome(continuousPos) {
171
+ // Position equal to the length is a special case needed because the intervals
172
+ // are half-open.
173
+ if (continuousPos > this.totalSize) {
174
+ return; // TODO: Consider displaying a warning
175
+ }
176
+
177
+ continuousPos = Math.floor(continuousPos);
178
+
179
+ // TODO: Fix the offset by one
180
+ const i = bisect(this.startByIndex, continuousPos) - 1;
181
+ if (i > 0 && i <= this.chromosomes.length) {
182
+ return this.chromosomes[i - 1];
183
+ }
184
+ }
185
+
186
+ /**
187
+ *
188
+ * @param {number} continuousPos
189
+ * @returns {ChromosomalLocus}
190
+ */
191
+ toChromosomal(continuousPos) {
192
+ const chrom = this.toChromosome(continuousPos);
193
+ if (!chrom) {
194
+ return undefined;
195
+ }
196
+
197
+ return {
198
+ chrom: chrom.name,
199
+ pos: Math.floor(continuousPos) - chrom.continuousStart,
200
+ };
201
+ }
202
+
203
+ /**
204
+ *
205
+ * @param {string} name
206
+ */
207
+ getChromosome(name) {
208
+ return this.chromosomesByName.get(name);
209
+ }
210
+
211
+ /**
212
+ * Returns a UCSC Genome Browser -style string presentation of the interval.
213
+ * However, the interval may span multiple chromosomes, which is incompatible
214
+ * with UCSC.
215
+ *
216
+ * The inteval is shown as one-based closed-open range.
217
+ * See https://genome.ucsc.edu/FAQ/FAQtracks#tracks1
218
+ *
219
+ * @param {number[]} interval
220
+ * @returns {string}
221
+ */
222
+ formatInterval(interval) {
223
+ return formatRange(...this.toChromosomalInterval(interval));
224
+ }
225
+
226
+ /**
227
+ * @param {number[]} interval
228
+ * @returns {[ChromosomalLocus, ChromosomalLocus]}
229
+ */
230
+ toChromosomalInterval(interval) {
231
+ // Round the lower end
232
+ const begin = this.toChromosomal(interval[0] + 0.5);
233
+ // Because of the open upper bound, one is first subtracted from the upper bound and later added back.
234
+ const end = this.toChromosomal(interval[1] - 0.5);
235
+ end.pos += 1;
236
+
237
+ return [begin, end];
238
+ }
239
+
240
+ /**
241
+ * Returns a continuous interval. The optional position of the left end defaults to zero,
242
+ * the right end defaults to the size of the chromosome. Thus, the chromosome is inclusive
243
+ * when positions are omitted.
244
+ *
245
+ * @param {ChromosomalLocus[]} chromosomal
246
+ */
247
+ toContinuousInterval(chromosomal) {
248
+ let [a, b] = chromosomal;
249
+ if (!b) {
250
+ // A shortcut for a single chromosome. { domain: [{ chrom: "chr3" }] }
251
+ b = a;
252
+ }
253
+
254
+ return [
255
+ this.toContinuous(a.chrom, a.pos ?? 0),
256
+ this.toContinuous(
257
+ b.chrom,
258
+ b.pos ?? this.chromosomesByName.get(b.chrom)?.size
259
+ ),
260
+ ];
261
+ }
262
+
263
+ /**
264
+ * Returns an array of discrete chromosome intervals that fall within the given interval.
265
+ *
266
+ * @param {[ChromosomalLocus, ChromosomalLocus]} interval
267
+ * @returns {DiscreteChromosomeInterval[]}
268
+ */
269
+ toDiscreteChromosomeIntervals(interval) {
270
+ const a = interval[0];
271
+ const b = interval[1];
272
+
273
+ const intervals = [];
274
+
275
+ if (a.chrom === b.chrom) {
276
+ intervals.push({ chrom: a.chrom, startPos: a.pos, endPos: b.pos });
277
+ } else {
278
+ const startIndex = this.chromosomes.findIndex(
279
+ (chrom) => chrom.name === a.chrom
280
+ );
281
+ const endIndex = this.chromosomes.findIndex(
282
+ (chrom) => chrom.name === b.chrom
283
+ );
284
+
285
+ intervals.push({
286
+ chrom: a.chrom,
287
+ startPos: a.pos,
288
+ endPos: this.chromosomes[startIndex].size,
289
+ });
290
+ for (let i = startIndex + 1; i < endIndex; i++) {
291
+ intervals.push({
292
+ chrom: this.chromosomes[i].name,
293
+ startPos: 0,
294
+ endPos: this.chromosomes[i].size,
295
+ });
296
+ }
297
+ intervals.push({ chrom: b.chrom, startPos: 0, endPos: b.pos });
298
+ }
299
+ return intervals;
300
+ }
301
+
302
+ /**
303
+ * Returns an array of discrete chromosome intervals that fall within the given interval.
304
+ *
305
+ * @param {number[]} continuousInterval
306
+ */
307
+ continuousToDiscreteChromosomeIntervals(continuousInterval) {
308
+ return this.toDiscreteChromosomeIntervals([
309
+ this.toChromosomal(continuousInterval[0]),
310
+ this.toChromosomal(continuousInterval[1]),
311
+ ]);
312
+ }
313
+
314
+ /**
315
+ *
316
+ * @param {string} str
317
+ * @returns {[number, number]}
318
+ */
319
+ parseInterval(str) {
320
+ // TODO: consider changing [0-9XY] to support other species besides humans
321
+ const matches = str.match(
322
+ /^(chr[0-9A-Z]+)(?::([0-9,]+)(?:-(?:(chr[0-9A-Z]+):)?([0-9,]+))?)?$/
323
+ );
324
+
325
+ if (matches) {
326
+ const startChr = matches[1];
327
+
328
+ if (matches.slice(2).every((x) => x === undefined)) {
329
+ const chrom = this.getChromosome(startChr);
330
+ if (chrom) {
331
+ return [chrom.continuousStart, chrom.continuousEnd];
332
+ }
333
+ return;
334
+ }
335
+
336
+ const endChr = matches[3] || startChr;
337
+
338
+ const startIndex = parseInt(matches[2].replace(/,/g, ""));
339
+ const endIndex =
340
+ matches[4] !== undefined
341
+ ? parseInt(matches[4].replace(/,/g, ""))
342
+ : startIndex;
343
+
344
+ return [
345
+ this.toContinuous(startChr, startIndex - 1),
346
+ this.toContinuous(endChr, endIndex),
347
+ ];
348
+ }
349
+ }
350
+ }
351
+
352
+ /**
353
+ *
354
+ * @param {string} chromSizesData
355
+ */
356
+ export function parseChromSizes(chromSizesData) {
357
+ // TODO: Support other organisms too
358
+ return tsvParseRows(chromSizesData)
359
+ .filter((row) => /^chr[0-9A-Z]+$/.test(row[0]))
360
+ .map(([name, size]) => ({ name, size: parseInt(size) }));
361
+ }
362
+
363
+ /**
364
+ *
365
+ * @param {any} value
366
+ * @return {value is ChromosomalLocus}
367
+ */
368
+ export function isChromosomalLocus(value) {
369
+ return isObject(value) && "chrom" in value;
370
+ }
371
+
372
+ /**
373
+ *
374
+ * @param {any[]} value
375
+ * @return {value is ChromosomalLocus[]}
376
+ */
377
+ export function isChromosomalLocusInterval(value) {
378
+ return value.every(isChromosomalLocus);
379
+ }