@jbrowse/plugin-variants 3.1.0 → 3.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 (237) hide show
  1. package/dist/MultiLinearVariantDisplay/components/VariantDisplayComponent.js +3 -3
  2. package/dist/MultiLinearVariantDisplay/index.js +1 -1
  3. package/dist/MultiLinearVariantDisplay/model.d.ts +58 -3
  4. package/dist/MultiLinearVariantDisplay/model.js +0 -1
  5. package/dist/MultiLinearVariantDisplay/renderSvg.js +2 -2
  6. package/dist/MultiLinearVariantMatrixDisplay/components/LinesConnectingMatrixToGenomicPosition.js +15 -5
  7. package/dist/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.js +3 -3
  8. package/dist/MultiLinearVariantMatrixDisplay/index.js +1 -1
  9. package/dist/MultiLinearVariantMatrixDisplay/model.d.ts +59 -2
  10. package/dist/MultiLinearVariantMatrixDisplay/model.js +5 -1
  11. package/dist/MultiLinearVariantMatrixDisplay/renderSvg.js +2 -2
  12. package/dist/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.d.ts → MultiLinearVariantMatrixRenderer.d.ts} +7 -3
  13. package/dist/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.d.ts +8 -0
  14. package/dist/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.js +41 -0
  15. package/dist/MultiLinearVariantMatrixRenderer/index.js +4 -4
  16. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +2 -2
  17. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.js +15 -8
  18. package/dist/MultiLinearVariantMatrixRenderer/types.d.ts +2 -4
  19. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +30 -1
  20. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.js +11 -5
  21. package/dist/MultiLinearVariantRenderer/components/{MultiVariantRendering.d.ts → MultiLinearVariantRendering.d.ts} +10 -4
  22. package/dist/MultiLinearVariantRenderer/{MultiVariantRendering.js → components/MultiLinearVariantRendering.js} +25 -7
  23. package/dist/MultiLinearVariantRenderer/components/util.d.ts +1 -0
  24. package/dist/MultiLinearVariantRenderer/components/util.js +15 -0
  25. package/dist/MultiLinearVariantRenderer/index.js +2 -2
  26. package/dist/MultiLinearVariantRenderer/makeImageData.d.ts +9 -0
  27. package/dist/MultiLinearVariantRenderer/makeImageData.js +63 -23
  28. package/dist/MultiLinearVariantRenderer/types.d.ts +1 -0
  29. package/dist/SplitVcfTabixAdapter/configSchema.js +4 -2
  30. package/dist/VariantFeatureWidget/AltFormatter.d.ts +4 -0
  31. package/dist/VariantFeatureWidget/AltFormatter.js +13 -0
  32. package/dist/VariantFeatureWidget/Checkbox2.js +1 -8
  33. package/dist/VariantFeatureWidget/Formatter.d.ts +3 -0
  34. package/dist/VariantFeatureWidget/Formatter.js +23 -0
  35. package/dist/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.js → VariantConsequence/VariantConsequenceDataGridWrapper.js} +3 -5
  36. package/dist/VariantFeatureWidget/VariantFeatureWidget.js +7 -2
  37. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.d.ts +4 -0
  38. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.js +80 -0
  39. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.d.ts +3 -9
  40. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.js +41 -20
  41. package/dist/VariantFeatureWidget/VariantSampleGrid/types.d.ts +21 -0
  42. package/dist/VariantFeatureWidget/VariantSampleGrid/types.js +2 -0
  43. package/dist/VariantFeatureWidget/VariantSampleGrid/util.d.ts +1 -0
  44. package/dist/VariantFeatureWidget/VariantSampleGrid/util.js +14 -0
  45. package/dist/VariantRPC/MultiVariantClusterGenotypeMatrix.d.ts +14 -0
  46. package/dist/VariantRPC/MultiVariantClusterGenotypeMatrix.js +30 -0
  47. package/dist/VariantRPC/MultiVariantGetGenotypeMatrix.d.ts +2 -13
  48. package/dist/VariantRPC/MultiVariantGetGenotypeMatrix.js +5 -57
  49. package/dist/VariantRPC/MultiVariantGetSimplifiedFeatures.d.ts +3 -10
  50. package/dist/VariantRPC/MultiVariantGetSimplifiedFeatures.js +15 -10
  51. package/dist/VariantRPC/getGenotypeMatrix.d.ts +6 -0
  52. package/dist/VariantRPC/getGenotypeMatrix.js +60 -0
  53. package/dist/VariantRPC/types.d.ts +36 -0
  54. package/dist/VariantRPC/types.js +2 -0
  55. package/dist/VcfAdapter/VcfAdapter.js +6 -3
  56. package/dist/VcfFeature/index.js +0 -1
  57. package/dist/VcfFeature/util.d.ts +2 -0
  58. package/dist/VcfFeature/util.js +125 -27
  59. package/dist/VcfTabixAdapter/VcfTabixAdapter.js +17 -7
  60. package/dist/getMultiVariantFeaturesAutorun.d.ts +2 -0
  61. package/dist/getMultiVariantFeaturesAutorun.js +9 -2
  62. package/dist/getMultiVariantSourcesAutorun.js +3 -2
  63. package/dist/index.js +2 -0
  64. package/dist/shared/MultiVariantBaseModel.d.ts +59 -3
  65. package/dist/shared/MultiVariantBaseModel.js +95 -37
  66. package/dist/shared/components/AddFiltersDialog.d.ts +9 -0
  67. package/dist/shared/components/AddFiltersDialog.js +61 -0
  68. package/dist/shared/components/MultiVariantBaseDisplayComponent.d.ts +5 -0
  69. package/dist/shared/components/MultiVariantBaseDisplayComponent.js +29 -0
  70. package/dist/shared/components/MultiVariantClusterDialog/ClusterDialog.d.ts +6 -0
  71. package/dist/shared/components/MultiVariantClusterDialog/ClusterDialog.js +29 -0
  72. package/dist/shared/components/MultiVariantClusterDialog/ClusterDialogAuto.d.ts +7 -0
  73. package/dist/shared/components/MultiVariantClusterDialog/ClusterDialogAuto.js +74 -0
  74. package/dist/shared/components/MultiVariantClusterDialog/ClusterDialogManual.d.ts +7 -0
  75. package/dist/shared/components/MultiVariantClusterDialog/ClusterDialogManual.js +145 -0
  76. package/dist/shared/components/MultiVariantClusterDialog/types.d.ts +10 -0
  77. package/dist/shared/components/MultiVariantClusterDialog/types.js +2 -0
  78. package/{esm/shared/components/ColorLegend.d.ts → dist/shared/components/MultiVariantColorLegend.d.ts} +2 -2
  79. package/dist/shared/components/{ColorLegend.js → MultiVariantColorLegend.js} +5 -3
  80. package/dist/shared/components/MultiVariantCrosshairs.d.ts +7 -0
  81. package/dist/shared/components/MultiVariantCrosshairs.js +40 -0
  82. package/dist/shared/components/MultiVariantLegendBar.d.ts +7 -0
  83. package/dist/shared/components/{LegendBar.js → MultiVariantLegendBar.js} +2 -2
  84. package/dist/shared/components/MultiVariantTooltip.d.ts +4 -0
  85. package/dist/shared/components/MultiVariantTooltip.js +3 -2
  86. package/dist/shared/components/RectBg.js +4 -2
  87. package/dist/shared/components/SetColorDialog.js +1 -1
  88. package/dist/shared/components/SourcesDataGrid.d.ts +2 -1
  89. package/dist/shared/components/SourcesDataGrid.js +2 -2
  90. package/dist/shared/components/SourcesGrid.js +1 -1
  91. package/dist/shared/components/SourcesGridHeader.d.ts +2 -1
  92. package/dist/shared/components/SourcesGridHeader.js +2 -2
  93. package/dist/shared/drawAlleleCount.d.ts +1 -1
  94. package/dist/shared/drawAlleleCount.js +29 -5
  95. package/dist/shared/drawPhased.d.ts +1 -1
  96. package/dist/shared/drawPhased.js +14 -10
  97. package/dist/shared/getSources.d.ts +15 -0
  98. package/dist/shared/getSources.js +34 -0
  99. package/dist/shared/minorAlleleFrequencyUtils.d.ts +6 -1
  100. package/dist/shared/minorAlleleFrequencyUtils.js +4 -5
  101. package/dist/shared/sourcesGridUtils.d.ts +3 -2
  102. package/esm/MultiLinearVariantDisplay/components/VariantDisplayComponent.js +2 -2
  103. package/esm/MultiLinearVariantDisplay/index.js +1 -1
  104. package/esm/MultiLinearVariantDisplay/model.d.ts +58 -3
  105. package/esm/MultiLinearVariantDisplay/model.js +0 -1
  106. package/esm/MultiLinearVariantDisplay/renderSvg.js +1 -1
  107. package/esm/MultiLinearVariantMatrixDisplay/components/LinesConnectingMatrixToGenomicPosition.js +15 -8
  108. package/esm/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.js +2 -2
  109. package/esm/MultiLinearVariantMatrixDisplay/index.js +1 -1
  110. package/esm/MultiLinearVariantMatrixDisplay/model.d.ts +59 -2
  111. package/esm/MultiLinearVariantMatrixDisplay/model.js +5 -1
  112. package/esm/MultiLinearVariantMatrixDisplay/renderSvg.js +1 -1
  113. package/esm/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.d.ts → MultiLinearVariantMatrixRenderer.d.ts} +7 -3
  114. package/esm/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.d.ts +8 -0
  115. package/esm/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.js +39 -0
  116. package/esm/MultiLinearVariantMatrixRenderer/index.js +4 -4
  117. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +2 -2
  118. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.js +16 -9
  119. package/esm/MultiLinearVariantMatrixRenderer/types.d.ts +2 -4
  120. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +30 -1
  121. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.js +11 -5
  122. package/esm/MultiLinearVariantRenderer/components/{MultiVariantRendering.d.ts → MultiLinearVariantRendering.d.ts} +10 -4
  123. package/esm/MultiLinearVariantRenderer/components/{MultiVariantRendering.js → MultiLinearVariantRendering.js} +25 -7
  124. package/esm/MultiLinearVariantRenderer/components/util.d.ts +1 -0
  125. package/esm/MultiLinearVariantRenderer/components/util.js +12 -0
  126. package/esm/MultiLinearVariantRenderer/index.js +1 -1
  127. package/esm/MultiLinearVariantRenderer/makeImageData.d.ts +9 -0
  128. package/esm/MultiLinearVariantRenderer/makeImageData.js +64 -24
  129. package/esm/MultiLinearVariantRenderer/types.d.ts +1 -0
  130. package/esm/SplitVcfTabixAdapter/configSchema.js +4 -2
  131. package/esm/VariantFeatureWidget/AltFormatter.d.ts +4 -0
  132. package/esm/VariantFeatureWidget/AltFormatter.js +10 -0
  133. package/esm/VariantFeatureWidget/Checkbox2.js +2 -9
  134. package/esm/VariantFeatureWidget/Formatter.d.ts +3 -0
  135. package/esm/VariantFeatureWidget/Formatter.js +17 -0
  136. package/esm/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.js → VariantConsequence/VariantConsequenceDataGridWrapper.js} +4 -6
  137. package/esm/VariantFeatureWidget/VariantFeatureWidget.js +7 -2
  138. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.d.ts +4 -0
  139. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.js +74 -0
  140. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.d.ts +3 -9
  141. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.js +43 -22
  142. package/esm/VariantFeatureWidget/VariantSampleGrid/types.d.ts +21 -0
  143. package/esm/VariantFeatureWidget/VariantSampleGrid/types.js +1 -0
  144. package/esm/VariantFeatureWidget/VariantSampleGrid/util.d.ts +1 -0
  145. package/esm/VariantFeatureWidget/VariantSampleGrid/util.js +11 -0
  146. package/esm/VariantRPC/MultiVariantClusterGenotypeMatrix.d.ts +14 -0
  147. package/esm/VariantRPC/MultiVariantClusterGenotypeMatrix.js +23 -0
  148. package/esm/VariantRPC/MultiVariantGetGenotypeMatrix.d.ts +2 -13
  149. package/esm/VariantRPC/MultiVariantGetGenotypeMatrix.js +5 -57
  150. package/esm/VariantRPC/MultiVariantGetSimplifiedFeatures.d.ts +3 -10
  151. package/esm/VariantRPC/MultiVariantGetSimplifiedFeatures.js +15 -10
  152. package/esm/VariantRPC/getGenotypeMatrix.d.ts +6 -0
  153. package/esm/VariantRPC/getGenotypeMatrix.js +57 -0
  154. package/esm/VariantRPC/types.d.ts +36 -0
  155. package/esm/VariantRPC/types.js +1 -0
  156. package/esm/VcfAdapter/VcfAdapter.js +7 -4
  157. package/esm/VcfFeature/index.js +0 -1
  158. package/esm/VcfFeature/util.d.ts +2 -0
  159. package/esm/VcfFeature/util.js +123 -27
  160. package/esm/VcfTabixAdapter/VcfTabixAdapter.js +18 -8
  161. package/esm/getMultiVariantFeaturesAutorun.d.ts +2 -0
  162. package/esm/getMultiVariantFeaturesAutorun.js +9 -2
  163. package/esm/getMultiVariantSourcesAutorun.js +3 -2
  164. package/esm/index.js +2 -0
  165. package/esm/shared/MultiVariantBaseModel.d.ts +59 -3
  166. package/esm/shared/MultiVariantBaseModel.js +97 -39
  167. package/esm/shared/components/AddFiltersDialog.d.ts +9 -0
  168. package/esm/shared/components/AddFiltersDialog.js +59 -0
  169. package/esm/shared/components/MultiVariantBaseDisplayComponent.d.ts +5 -0
  170. package/esm/shared/components/MultiVariantBaseDisplayComponent.js +24 -0
  171. package/esm/shared/components/MultiVariantClusterDialog/ClusterDialog.d.ts +6 -0
  172. package/esm/shared/components/MultiVariantClusterDialog/ClusterDialog.js +24 -0
  173. package/esm/shared/components/MultiVariantClusterDialog/ClusterDialogAuto.d.ts +7 -0
  174. package/esm/shared/components/MultiVariantClusterDialog/ClusterDialogAuto.js +72 -0
  175. package/esm/shared/components/MultiVariantClusterDialog/ClusterDialogManual.d.ts +7 -0
  176. package/esm/shared/components/MultiVariantClusterDialog/ClusterDialogManual.js +140 -0
  177. package/esm/shared/components/MultiVariantClusterDialog/types.d.ts +10 -0
  178. package/esm/shared/components/MultiVariantClusterDialog/types.js +1 -0
  179. package/{dist/shared/components/ColorLegend.d.ts → esm/shared/components/MultiVariantColorLegend.d.ts} +2 -2
  180. package/esm/shared/components/{ColorLegend.js → MultiVariantColorLegend.js} +6 -4
  181. package/esm/shared/components/MultiVariantCrosshairs.d.ts +7 -0
  182. package/esm/shared/components/MultiVariantCrosshairs.js +35 -0
  183. package/esm/shared/components/MultiVariantLegendBar.d.ts +7 -0
  184. package/esm/shared/components/{LegendBar.js → MultiVariantLegendBar.js} +1 -1
  185. package/esm/shared/components/MultiVariantTooltip.d.ts +4 -0
  186. package/esm/shared/components/MultiVariantTooltip.js +3 -2
  187. package/esm/shared/components/RectBg.js +4 -2
  188. package/esm/shared/components/SetColorDialog.js +1 -1
  189. package/esm/shared/components/SourcesDataGrid.d.ts +2 -1
  190. package/esm/shared/components/SourcesDataGrid.js +2 -2
  191. package/esm/shared/components/SourcesGrid.js +1 -1
  192. package/esm/shared/components/SourcesGridHeader.d.ts +2 -1
  193. package/esm/shared/components/SourcesGridHeader.js +2 -2
  194. package/esm/shared/drawAlleleCount.d.ts +1 -1
  195. package/esm/shared/drawAlleleCount.js +29 -5
  196. package/esm/shared/drawPhased.d.ts +1 -1
  197. package/esm/shared/drawPhased.js +14 -10
  198. package/esm/shared/getSources.d.ts +15 -0
  199. package/esm/shared/getSources.js +31 -0
  200. package/esm/shared/minorAlleleFrequencyUtils.d.ts +6 -1
  201. package/esm/shared/minorAlleleFrequencyUtils.js +5 -6
  202. package/esm/shared/sourcesGridUtils.d.ts +3 -2
  203. package/package.json +10 -9
  204. package/dist/MultiLinearVariantDisplay/components/Crosshair.d.ts +0 -7
  205. package/dist/MultiLinearVariantDisplay/components/Crosshair.js +0 -35
  206. package/dist/MultiLinearVariantMatrixDisplay/components/Crosshair.d.ts +0 -7
  207. package/dist/MultiLinearVariantMatrixDisplay/components/Crosshair.js +0 -28
  208. package/dist/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.d.ts +0 -7
  209. package/dist/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.js +0 -38
  210. package/dist/MultiLinearVariantRenderer/MultiVariantRendering.d.ts +0 -22
  211. package/dist/MultiLinearVariantRenderer/components/MultiVariantRendering.js +0 -52
  212. package/dist/VariantFeatureWidget/VariantConsequencePanel.d.ts +0 -5
  213. package/dist/VariantFeatureWidget/VariantConsequencePanel.js +0 -15
  214. package/dist/shared/components/ClusterDialog.d.ts +0 -11
  215. package/dist/shared/components/ClusterDialog.js +0 -113
  216. package/dist/shared/components/LegendBar.d.ts +0 -18
  217. package/esm/MultiLinearVariantDisplay/components/Crosshair.d.ts +0 -7
  218. package/esm/MultiLinearVariantDisplay/components/Crosshair.js +0 -30
  219. package/esm/MultiLinearVariantMatrixDisplay/components/Crosshair.d.ts +0 -7
  220. package/esm/MultiLinearVariantMatrixDisplay/components/Crosshair.js +0 -23
  221. package/esm/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.d.ts +0 -7
  222. package/esm/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.js +0 -36
  223. package/esm/MultiLinearVariantRenderer/MultiVariantRendering.d.ts +0 -22
  224. package/esm/MultiLinearVariantRenderer/MultiVariantRendering.js +0 -47
  225. package/esm/VariantFeatureWidget/VariantConsequencePanel.d.ts +0 -5
  226. package/esm/VariantFeatureWidget/VariantConsequencePanel.js +0 -9
  227. package/esm/shared/components/ClusterDialog.d.ts +0 -11
  228. package/esm/shared/components/ClusterDialog.js +0 -107
  229. package/esm/shared/components/LegendBar.d.ts +0 -18
  230. /package/dist/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.js → MultiLinearVariantMatrixRenderer.js} +0 -0
  231. /package/dist/VariantFeatureWidget/{VariantConsequenceDataGrid.d.ts → VariantConsequence/VariantConsequenceDataGrid.d.ts} +0 -0
  232. /package/dist/VariantFeatureWidget/{VariantConsequenceDataGrid.js → VariantConsequence/VariantConsequenceDataGrid.js} +0 -0
  233. /package/dist/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.d.ts → VariantConsequence/VariantConsequenceDataGridWrapper.d.ts} +0 -0
  234. /package/esm/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.js → MultiLinearVariantMatrixRenderer.js} +0 -0
  235. /package/esm/VariantFeatureWidget/{VariantConsequenceDataGrid.d.ts → VariantConsequence/VariantConsequenceDataGrid.d.ts} +0 -0
  236. /package/esm/VariantFeatureWidget/{VariantConsequenceDataGrid.js → VariantConsequence/VariantConsequenceDataGrid.js} +0 -0
  237. /package/esm/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.d.ts → VariantConsequence/VariantConsequenceDataGridWrapper.d.ts} +0 -0
@@ -1,53 +1,93 @@
1
- import { featureSpanPx } from '@jbrowse/core/util';
1
+ import { featureSpanPx, forEachWithStopTokenCheck } from '@jbrowse/core/util';
2
+ import { checkStopToken } from '@jbrowse/core/util/stopToken';
2
3
  import RBush from 'rbush';
3
4
  import { f2 } from '../shared/constants';
4
5
  import { drawColorAlleleCount } from '../shared/drawAlleleCount';
5
6
  import { drawPhased } from '../shared/drawPhased';
6
7
  import { getFeaturesThatPassMinorAlleleFrequencyFilter } from '../shared/minorAlleleFrequencyUtils';
7
8
  export async function makeImageData(ctx, props) {
8
- const { scrollTop, minorAlleleFrequencyFilter, sources, rowHeight, features, regions, bpPerPx, renderingMode, } = props;
9
+ const { scrollTop, minorAlleleFrequencyFilter, sources, rowHeight, features, regions, bpPerPx, renderingMode, stopToken, lengthCutoffFilter, referenceDrawingMode, } = props;
9
10
  const region = regions[0];
10
- const mafs = getFeaturesThatPassMinorAlleleFrequencyFilter(features.values(), minorAlleleFrequencyFilter);
11
+ checkStopToken(stopToken);
12
+ const mafs = getFeaturesThatPassMinorAlleleFrequencyFilter({
13
+ stopToken,
14
+ features: features.values(),
15
+ minorAlleleFrequencyFilter,
16
+ lengthCutoffFilter,
17
+ });
18
+ checkStopToken(stopToken);
11
19
  const rbush = new RBush();
12
- for (const { mostFrequentAlt, feature } of mafs) {
20
+ forEachWithStopTokenCheck(mafs, stopToken, ({ mostFrequentAlt, feature }) => {
13
21
  const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
14
22
  const w = Math.max(Math.round(rightPx - leftPx), 2);
15
23
  const samp = feature.get('genotypes');
16
24
  let y = -scrollTop;
17
25
  const s = sources.length;
18
- for (let j = 0; j < s; j++) {
19
- const { name, HP } = sources[j];
20
- const genotype = samp[name];
21
- const x = Math.floor(leftPx);
22
- const h = Math.max(rowHeight, 1);
23
- if (genotype) {
24
- rbush.insert({
25
- minX: x - f2,
26
- maxX: x + w + f2,
27
- minY: y - f2,
28
- maxY: y + h + f2,
29
- genotype,
30
- });
31
- const isPhased = genotype.includes('|');
32
- if (renderingMode === 'phased') {
26
+ if (renderingMode === 'phased') {
27
+ for (let j = 0; j < s; j++) {
28
+ const { name, HP } = sources[j];
29
+ const genotype = samp[name];
30
+ const x = Math.floor(leftPx);
31
+ const h = Math.max(rowHeight, 1);
32
+ if (genotype) {
33
+ const isPhased = genotype.includes('|');
33
34
  if (isPhased) {
34
35
  const alleles = genotype.split('|');
35
- drawPhased(alleles, ctx, x, y, w, h, HP);
36
+ if (drawPhased(alleles, ctx, x, y, w, h, HP, undefined, referenceDrawingMode === 'draw')) {
37
+ rbush.insert({
38
+ minX: x,
39
+ maxX: x + w,
40
+ minY: y,
41
+ maxY: y + h,
42
+ genotype,
43
+ name,
44
+ featureId: feature.id(),
45
+ });
46
+ }
36
47
  }
37
48
  else {
38
49
  ctx.fillStyle = 'black';
39
50
  ctx.fillRect(x - f2, y - f2, w + f2, h + f2);
40
51
  }
41
52
  }
42
- else {
53
+ y += rowHeight;
54
+ }
55
+ }
56
+ else {
57
+ for (let j = 0; j < s; j++) {
58
+ const { name } = sources[j];
59
+ const genotype = samp[name];
60
+ const x = Math.floor(leftPx);
61
+ const h = Math.max(rowHeight, 1);
62
+ if (genotype) {
43
63
  const alleles = genotype.split(/[/|]/);
44
- drawColorAlleleCount(alleles, ctx, x, y, w, h, mostFrequentAlt);
64
+ if (drawColorAlleleCount(alleles, ctx, x, y, w, h, mostFrequentAlt, referenceDrawingMode === 'draw', feature.get('type'), feature.get('strand'), 0.75)) {
65
+ rbush.insert({
66
+ minX: x,
67
+ maxX: x + w,
68
+ minY: y,
69
+ maxY: y + h,
70
+ genotype,
71
+ name,
72
+ featureId: feature.id(),
73
+ });
74
+ }
45
75
  }
76
+ y += rowHeight;
46
77
  }
47
- y += rowHeight;
48
78
  }
49
- }
79
+ });
50
80
  return {
51
81
  rbush: rbush.toJSON(),
82
+ featureGenotypeMap: Object.fromEntries(mafs.map(({ feature }) => [
83
+ feature.id(),
84
+ {
85
+ alt: feature.get('ALT'),
86
+ ref: feature.get('REF'),
87
+ name: feature.get('name'),
88
+ description: feature.get('description'),
89
+ length: feature.get('end') - feature.get('start'),
90
+ },
91
+ ])),
52
92
  };
53
93
  }
@@ -16,4 +16,5 @@ export interface MultiRenderArgsDeserialized extends RenderArgsDeserializedWithF
16
16
  rowHeight: number;
17
17
  scrollTop: number;
18
18
  minorAlleleFrequencyFilter: number;
19
+ lengthCutoffFilter: number;
19
20
  }
@@ -17,9 +17,11 @@ const SplitVcfTabixAdapter = ConfigurationSchema('SplitVcfTabixAdapter', {
17
17
  type: 'fileLocation',
18
18
  defaultValue: {
19
19
  uri: '/path/to/samples.tsv',
20
- description: 'tsv with header like name\tpopulation\tetc. where the first column is required, and is the sample names',
20
+ description: 'tsv with header like "name\tpopulation\tetc" where the first column is required, and corresponds to the sample names in the VCF files',
21
21
  locationType: 'UriLocation',
22
22
  },
23
23
  },
24
- }, { explicitlyTyped: true });
24
+ }, {
25
+ explicitlyTyped: true,
26
+ });
25
27
  export default SplitVcfTabixAdapter;
@@ -0,0 +1,4 @@
1
+ export default function AltFormatter({ value, ref, }: {
2
+ value: string;
3
+ ref: string;
4
+ }): string | import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { getMinimalDesc } from '../VcfFeature/util';
4
+ export default function AltFormatter({ value, ref, }) {
5
+ const [show, setShow] = useState(false);
6
+ const alt = getMinimalDesc(ref, value);
7
+ return alt !== value ? (_jsxs("div", { children: [_jsx("button", { onClick: () => {
8
+ setShow(!show);
9
+ }, children: show ? 'Show simplified ALT' : 'Show raw ALT' }), ' ', show ? value : getMinimalDesc(ref, value)] })) : (value);
10
+ }
@@ -1,12 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Checkbox, FormControlLabel } from '@mui/material';
3
- import { makeStyles } from 'tss-react/mui';
4
- const useStyles = makeStyles()({
5
- block: {
6
- display: 'block',
7
- },
8
- });
2
+ import { Checkbox, FormControlLabel, Typography } from '@mui/material';
9
3
  export default function Checkbox2({ checked, disabled, label, onChange, }) {
10
- const { classes } = useStyles();
11
- return (_jsx(FormControlLabel, { disabled: disabled, className: classes.block, control: _jsx(Checkbox, { checked: checked, onChange: onChange }), label: label }));
4
+ return (_jsx(FormControlLabel, { disabled: disabled, control: _jsx(Checkbox, { checked: checked, onChange: onChange }), label: _jsx(Typography, { variant: "body2", children: label }) }));
12
5
  }
@@ -0,0 +1,3 @@
1
+ export default function Formatter({ value }: {
2
+ value: unknown;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import copy from 'copy-to-clipboard';
4
+ export default function Formatter({ value }) {
5
+ const [show, setShow] = useState(false);
6
+ const [copied, setCopied] = useState(false);
7
+ const display = String(value);
8
+ return display.length > 100 ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
9
+ copy(display);
10
+ setCopied(true);
11
+ setTimeout(() => {
12
+ setCopied(false);
13
+ }, 700);
14
+ }, children: copied ? 'Copied to clipboard' : 'Copy' }), _jsx("button", { type: "button", onClick: () => {
15
+ setShow(val => !val);
16
+ }, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? display : `${display.slice(0, 100)}...` })] })) : (_jsx("div", { children: display }));
17
+ }
@@ -2,16 +2,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { measureGridWidth } from '@jbrowse/core/util';
4
4
  import { Checkbox, FormControlLabel, Typography } from '@mui/material';
5
- import { DataGrid, GridToolbar } from '@mui/x-data-grid';
5
+ import { DataGrid } from '@mui/x-data-grid';
6
6
  export default function VariantConsequenceDataGridWrapper({ rows, columns, }) {
7
7
  const [checked, setChecked] = useState(false);
8
8
  const widths = columns.map(e => measureGridWidth(rows.map(r => r[e.field])));
9
- return rows.length ? (_jsxs("div", { children: [_jsx(FormControlLabel, { control: _jsx(Checkbox, { checked: checked, onChange: event => {
9
+ return rows.length ? (_jsxs("div", { children: [_jsx(FormControlLabel, { label: _jsx(Typography, { variant: "body2", children: "Show options" }), control: _jsx(Checkbox, { checked: checked, onChange: event => {
10
10
  setChecked(event.target.checked);
11
- } }), label: _jsx(Typography, { variant: "body2", children: "Show options" }) }), _jsx(DataGrid, { rowHeight: 25, rows: rows, columns: columns.map((c, i) => ({
11
+ } }) }), _jsx(DataGrid, { rowHeight: 25, hideFooter: rows.length < 100, rows: rows, showToolbar: checked, columns: columns.map((c, i) => ({
12
12
  ...c,
13
13
  width: widths[i],
14
- })), slots: {
15
- toolbar: checked ? GridToolbar : null,
16
- } })] })) : null;
14
+ })) })] })) : null;
17
15
  }
@@ -4,10 +4,12 @@ import { parseBreakend } from '@gmod/vcf';
4
4
  import FeatureDetails from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails';
5
5
  import { Paper } from '@mui/material';
6
6
  import { observer } from 'mobx-react';
7
+ import AltFormatter from './AltFormatter';
8
+ import Formatter from './Formatter';
7
9
  import VariantSampleGrid from './VariantSampleGrid/VariantSampleGrid';
8
10
  import { variantFieldDescriptions } from './variantFieldDescriptions';
9
11
  const LaunchBreakendPanel = lazy(() => import('./LaunchBreakendPanel/LaunchBreakendPanel'));
10
- const VariantConsequenceDataGrid = lazy(() => import('./VariantConsequenceDataGrid'));
12
+ const VariantConsequenceDataGrid = lazy(() => import('./VariantConsequence/VariantConsequenceDataGrid'));
11
13
  function AnnPanel({ descriptions, feature, }) {
12
14
  var _a, _b, _c, _d, _e;
13
15
  const annDesc = (_b = (_a = descriptions === null || descriptions === void 0 ? void 0 : descriptions.INFO) === null || _a === void 0 ? void 0 : _a.ANN) === null || _b === void 0 ? void 0 : _b.Description;
@@ -46,10 +48,13 @@ const VariantFeatureWidget = observer(function (props) {
46
48
  const { model } = props;
47
49
  const { featureData, descriptions } = model;
48
50
  const feat = JSON.parse(JSON.stringify(featureData));
49
- const { samples, ALT, ...rest } = feat;
51
+ const { samples, ...rest } = feat;
52
+ const { REF } = rest;
50
53
  return (_jsxs(Paper, { "data-testid": "variant-side-drawer", children: [_jsx(FeatureDetails, { feature: rest, descriptions: {
51
54
  ...variantFieldDescriptions,
52
55
  ...descriptions,
56
+ }, formatter: (value, key) => {
57
+ return key === 'ALT' ? (_jsx(AltFormatter, { value: `${value}`, ref: REF })) : (_jsx(Formatter, { value: value }));
53
58
  }, ...props }), _jsxs(Suspense, { fallback: null, children: [_jsx(CsqPanel, { feature: rest, descriptions: descriptions }), _jsx(AnnPanel, { feature: rest, descriptions: descriptions }), _jsx(LaunchBreakendWidgetArea, { model: model })] }), _jsx(VariantSampleGrid, { feature: feat, ...props, descriptions: descriptions })] }));
54
59
  });
55
60
  export default VariantFeatureWidget;
@@ -0,0 +1,4 @@
1
+ import type { VariantSampleGridRow } from './types';
2
+ export default function VariantGenotypeFrequencyTable({ rows, }: {
3
+ rows: VariantSampleGridRow[];
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import DataGridFlexContainer from '@jbrowse/core/ui/DataGridFlexContainer';
4
+ import { measureGridWidth } from '@jbrowse/core/util';
5
+ import { Checkbox, FormControlLabel, Typography } from '@mui/material';
6
+ import { DataGrid } from '@mui/x-data-grid';
7
+ function toP(n) {
8
+ return n.toPrecision(3);
9
+ }
10
+ export default function VariantGenotypeFrequencyTable({ rows, }) {
11
+ const [useCounts, setUseCounts] = useState(false);
12
+ const summary = {};
13
+ if (!useCounts) {
14
+ for (const row of rows) {
15
+ const gt = row.GT;
16
+ if (!summary[gt]) {
17
+ summary[gt] = {
18
+ count: 0,
19
+ GT: row.GT,
20
+ genotype: row.genotype,
21
+ };
22
+ }
23
+ summary[gt].count++;
24
+ }
25
+ }
26
+ else {
27
+ for (const row of rows) {
28
+ const alleleCounts = {};
29
+ const alleles = row.GT.split(/[/|]/);
30
+ for (const allele of alleles) {
31
+ alleleCounts[allele] = (alleleCounts[allele] || 0) + 1;
32
+ }
33
+ const key = Object.entries(alleleCounts)
34
+ .map(([key, val]) => `${key}:${val}`)
35
+ .join(';');
36
+ if (!summary[key]) {
37
+ summary[key] = {
38
+ count: 0,
39
+ GT: key,
40
+ genotype: row.genotype,
41
+ };
42
+ }
43
+ summary[key].count++;
44
+ }
45
+ }
46
+ const gridRows = Object.entries(summary).map(([key, val]) => ({
47
+ id: key,
48
+ ...val,
49
+ count: `${val.count} / ${rows.length}`,
50
+ frequency: `${toP((val.count / rows.length) * 100)}%`,
51
+ }));
52
+ const keys = gridRows[0] ? Object.keys(gridRows[0]) : [];
53
+ const widths = keys.map(e => measureGridWidth(gridRows.map(r => `${r[e]}`)));
54
+ return (_jsxs("div", { children: [_jsx(FormControlLabel, { control: _jsx(Checkbox, { checked: useCounts }), label: _jsx(Typography, { variant: "body2", children: "Use allele counts instead of exact GT" }), onChange: (_, checked) => {
55
+ setUseCounts(checked);
56
+ } }), _jsx(DataGridFlexContainer, { children: _jsx(DataGrid, { rows: gridRows, hideFooter: true, rowHeight: 25, columnHeaderHeight: 35, columns: [
57
+ {
58
+ field: 'GT',
59
+ width: widths[0],
60
+ },
61
+ {
62
+ field: 'count',
63
+ width: widths[1],
64
+ },
65
+ {
66
+ field: 'frequency',
67
+ width: widths[2],
68
+ },
69
+ {
70
+ field: 'genotype',
71
+ width: widths[3],
72
+ },
73
+ ] }) })] }));
74
+ }
@@ -1,12 +1,6 @@
1
+ import type { VariantFieldDescriptions } from './types';
1
2
  import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
2
- interface FormatRecord {
3
- Description?: string;
4
- }
5
- interface Descriptions {
6
- FORMAT?: Record<string, FormatRecord>;
7
- }
8
- export default function VariantSamples(props: {
3
+ export default function VariantSampleGrid(props: {
9
4
  feature: SimpleFeatureSerialized;
10
- descriptions?: Descriptions | null;
5
+ descriptions?: VariantFieldDescriptions | null;
11
6
  }): import("react/jsx-runtime").JSX.Element | null;
12
- export {};
@@ -1,26 +1,50 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import BaseCard from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/BaseCard';
4
+ import { ErrorMessage } from '@jbrowse/core/ui';
5
+ import DataGridFlexContainer from '@jbrowse/core/ui/DataGridFlexContainer';
6
+ import { ErrorBoundary } from '@jbrowse/core/ui/ErrorBoundary';
4
7
  import { measureGridWidth } from '@jbrowse/core/util';
5
- import { Checkbox, FormControlLabel, Typography } from '@mui/material';
6
- import { DataGrid, GridToolbar } from '@mui/x-data-grid';
8
+ import { Typography } from '@mui/material';
9
+ import { DataGrid } from '@mui/x-data-grid';
10
+ import Checkbox2 from '../Checkbox2';
11
+ import VariantGenotypeFrequencyTable from './VariantGenotypeFrequencyTable';
7
12
  import SampleFilters from './VariantSampleFilters';
8
- export default function VariantSamples(props) {
13
+ import { areSetsEqual } from './util';
14
+ import { makeSimpleAltString } from '../../VcfFeature/util';
15
+ export default function VariantSampleGrid(props) {
9
16
  var _a;
10
17
  const { feature, descriptions = {} } = props;
11
18
  const [filter, setFilter] = useState({});
19
+ const [showOnlyGenotypeColumns, setShowOnlyGenotypeColumns] = useState(true);
20
+ const [showFilters, setShowFilters] = useState(false);
12
21
  const samples = (feature.samples || {});
13
- const preFilteredRows = Object.entries(samples);
22
+ const ALT = feature.ALT;
23
+ const REF = feature.REF;
24
+ const preFilteredRows = Object.entries(samples).map(([key, val]) => {
25
+ var _a, _b;
26
+ return [
27
+ key,
28
+ {
29
+ ...val,
30
+ GT: `${(_a = val.GT) === null || _a === void 0 ? void 0 : _a[0]}`,
31
+ genotype: makeSimpleAltString(`${(_b = val.GT) === null || _b === void 0 ? void 0 : _b[0]}`, REF, ALT),
32
+ },
33
+ ];
34
+ });
14
35
  let error;
15
36
  let rows = [];
16
37
  const filters = Object.keys(filter);
17
38
  try {
18
39
  rows = preFilteredRows
19
- .map(row => {
40
+ .map(([key, val]) => {
20
41
  return {
21
- ...Object.fromEntries(Object.entries(row[1]).map(e => [e[0], `${e[1]}`])),
22
- sample: row[0],
23
- id: row[0],
42
+ ...Object.fromEntries(Object.entries(val).map(([formatField, formatValue]) => [
43
+ formatField,
44
+ formatValue,
45
+ ])),
46
+ sample: key,
47
+ id: key,
24
48
  };
25
49
  })
26
50
  .filter(row => filters.length
@@ -33,9 +57,9 @@ export default function VariantSamples(props) {
33
57
  : true);
34
58
  }
35
59
  catch (e) {
60
+ console.error(e);
36
61
  error = e;
37
62
  }
38
- const [checked, setChecked] = useState(false);
39
63
  const keys = ['sample', ...Object.keys(((_a = preFilteredRows[0]) === null || _a === void 0 ? void 0 : _a[1]) || {})];
40
64
  const widths = keys.map(e => measureGridWidth(rows.map(r => r[e])));
41
65
  const columns = keys.map((field, index) => {
@@ -46,16 +70,13 @@ export default function VariantSamples(props) {
46
70
  width: widths[index],
47
71
  });
48
72
  });
49
- return !preFilteredRows.length ? null : (_jsxs(BaseCard, { ...props, title: "Samples", children: [error ? _jsx(Typography, { color: "error", children: `${error}` }) : null, _jsx(FormControlLabel, { control: _jsx(Checkbox, { checked: checked, onChange: event => {
50
- setChecked(event.target.checked);
51
- } }), label: _jsx(Typography, { variant: "body2", children: "Show options" }) }), checked ? (_jsx(SampleFilters, { setFilter: setFilter, columns: columns, filter: filter })) : null, _jsx("div", { style: {
52
- display: 'flex',
53
- flexDirection: 'column',
54
- }, children: _jsx(DataGrid, { rows: rows, hideFooter: rows.length < 100, columns: columns, disableRowSelectionOnClick: true, rowHeight: 25, columnHeaderHeight: 35, disableColumnMenu: true, slots: { toolbar: checked ? GridToolbar : null }, slotProps: {
55
- toolbar: {
56
- printOptions: {
57
- disableToolbarButton: true,
58
- },
59
- },
60
- } }) })] }));
73
+ const s1 = new Set(['sample', 'GT', 'genotype']);
74
+ const s2 = new Set(keys);
75
+ return !preFilteredRows.length ? null : (_jsxs(_Fragment, { children: [_jsx(BaseCard, { ...props, title: "Genotype frequencies", children: _jsx(ErrorBoundary, { FallbackComponent: ErrorMessage, children: _jsx(VariantGenotypeFrequencyTable, { rows: rows }) }) }), _jsxs(BaseCard, { ...props, title: "Samples", children: [error ? _jsx(Typography, { color: "error", children: `${error}` }) : null, _jsx(Checkbox2, { label: "Show filters", checked: showFilters, onChange: event => {
76
+ setShowFilters(event.target.checked);
77
+ } }), areSetsEqual(s1, s2) ? null : (_jsx(Checkbox2, { label: "Show only genotype columns", checked: showOnlyGenotypeColumns, onChange: event => {
78
+ setShowOnlyGenotypeColumns(event.target.checked);
79
+ } })), showFilters ? (_jsx(SampleFilters, { setFilter: setFilter, columns: columns, filter: filter })) : null, _jsx(DataGridFlexContainer, { children: _jsx(DataGrid, { rows: rows, hideFooter: rows.length < 100, columns: showOnlyGenotypeColumns
80
+ ? columns.filter(f => s1.has(f.field))
81
+ : columns, rowHeight: 25, columnHeaderHeight: 35, showToolbar: true }) })] })] }));
61
82
  }
@@ -0,0 +1,21 @@
1
+ export interface FrequencyTableEntry {
2
+ count: number;
3
+ GT: string;
4
+ genotype: string | undefined;
5
+ }
6
+ export type FrequencyTable = Record<string, FrequencyTableEntry>;
7
+ export interface VariantSampleGridRow {
8
+ sample: string;
9
+ id: string;
10
+ GT: string;
11
+ [key: string]: string;
12
+ }
13
+ export type InfoFields = Record<string, unknown[]>;
14
+ export type Filters = Record<string, string>;
15
+ interface FormatRecord {
16
+ Description?: string;
17
+ }
18
+ export interface VariantFieldDescriptions {
19
+ FORMAT?: Record<string, FormatRecord>;
20
+ }
21
+ export {};
@@ -0,0 +1 @@
1
+ export declare function areSetsEqual<T>(set1: Set<T>, set2: Set<T>): boolean;
@@ -0,0 +1,11 @@
1
+ export function areSetsEqual(set1, set2) {
2
+ if (set1.size !== set2.size) {
3
+ return false;
4
+ }
5
+ for (const item of set1) {
6
+ if (!set2.has(item)) {
7
+ return false;
8
+ }
9
+ }
10
+ return true;
11
+ }
@@ -0,0 +1,14 @@
1
+ import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
2
+ import type { ClusterGenotypeMatrixArgs } from './types';
3
+ export declare class MultiVariantClusterGenotypeMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
4
+ name: string;
5
+ execute(args: ClusterGenotypeMatrixArgs, rpcDriverClassName: string): Promise<{
6
+ clusters: {
7
+ height: number;
8
+ indexes: number[];
9
+ } | undefined;
10
+ distances: number[][];
11
+ order: number[];
12
+ clustersGivenK: number[][][];
13
+ }>;
14
+ }
@@ -0,0 +1,23 @@
1
+ import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
2
+ import { clusterData } from '@jbrowse/core/util/cluster';
3
+ import { getGenotypeMatrix } from './getGenotypeMatrix';
4
+ export class MultiVariantClusterGenotypeMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.name = 'MultiVariantClusterGenotypeMatrix';
8
+ }
9
+ async execute(args, rpcDriverClassName) {
10
+ const deserializedArgs = await this.deserializeArguments(args, rpcDriverClassName);
11
+ const matrix = await getGenotypeMatrix({
12
+ pluginManager: this.pluginManager,
13
+ args: deserializedArgs,
14
+ });
15
+ return clusterData({
16
+ data: Object.values(matrix),
17
+ stopToken: deserializedArgs.stopToken,
18
+ onProgress: progress => {
19
+ deserializedArgs.statusCallback(progress);
20
+ },
21
+ });
22
+ }
23
+ }
@@ -1,17 +1,6 @@
1
1
  import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
2
- import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
3
- import type { Region } from '@jbrowse/core/util';
2
+ import type { GetGenotypeMatrixArgs } from './types';
4
3
  export declare class MultiVariantGetGenotypeMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
5
4
  name: string;
6
- execute(args: {
7
- adapterConfig: AnyConfigurationModel;
8
- stopToken?: string;
9
- sessionId: string;
10
- headers?: Record<string, string>;
11
- regions: Region[];
12
- bpPerPx: number;
13
- }, rpcDriverClassName: string): Promise<Record<string, {
14
- name: string;
15
- genotypes: string[];
16
- }>>;
5
+ execute(args: GetGenotypeMatrixArgs, rpcDriverClassName: string): Promise<Record<string, number[]>>;
17
6
  }
@@ -1,66 +1,14 @@
1
- import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache';
2
1
  import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
3
- import { firstValueFrom, toArray } from 'rxjs';
4
- import { getFeaturesThatPassMinorAlleleFrequencyFilter } from '../shared/minorAlleleFrequencyUtils';
2
+ import { getGenotypeMatrix } from './getGenotypeMatrix';
5
3
  export class MultiVariantGetGenotypeMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
6
4
  constructor() {
7
5
  super(...arguments);
8
6
  this.name = 'MultiVariantGetGenotypeMatrix';
9
7
  }
10
8
  async execute(args, rpcDriverClassName) {
11
- const pm = this.pluginManager;
12
- const deserializedArgs = await this.deserializeArguments(args, rpcDriverClassName);
13
- const { sources, minorAlleleFrequencyFilter, regions, adapterConfig, sessionId, } = deserializedArgs;
14
- const adapter = await getAdapter(pm, sessionId, adapterConfig);
15
- const dataAdapter = adapter.dataAdapter;
16
- const feats = await firstValueFrom(dataAdapter
17
- .getFeaturesInMultipleRegions(regions, deserializedArgs)
18
- .pipe(toArray()));
19
- const genotypeFactor = new Set();
20
- const mafs = getFeaturesThatPassMinorAlleleFrequencyFilter(feats, minorAlleleFrequencyFilter);
21
- for (const { alleleCounts } of mafs) {
22
- for (const alt of alleleCounts.keys()) {
23
- genotypeFactor.add(alt);
24
- }
25
- }
26
- const rows = {};
27
- for (const { feature } of mafs) {
28
- const genotypes = feature.get('genotypes');
29
- for (const { name } of sources) {
30
- if (!rows[name]) {
31
- rows[name] = {
32
- name,
33
- genotypes: [],
34
- };
35
- }
36
- const val = genotypes[name];
37
- const alleles = val.split(/[/|]/);
38
- let genotypeStatus = '0';
39
- let nonRefCount = 0;
40
- let uncalledCount = 0;
41
- for (const l of alleles) {
42
- if (l === '.') {
43
- uncalledCount++;
44
- }
45
- else if (l !== '0') {
46
- nonRefCount++;
47
- }
48
- }
49
- if (uncalledCount === alleles.length) {
50
- genotypeStatus = '-1';
51
- }
52
- else if (nonRefCount === 0) {
53
- genotypeStatus = '0';
54
- }
55
- else if (nonRefCount === alleles.length) {
56
- genotypeStatus = '2';
57
- }
58
- else {
59
- genotypeStatus = '1';
60
- }
61
- rows[name].genotypes.push(genotypeStatus);
62
- }
63
- }
64
- return rows;
9
+ return getGenotypeMatrix({
10
+ pluginManager: this.pluginManager,
11
+ args: await this.deserializeArguments(args, rpcDriverClassName),
12
+ });
65
13
  }
66
14
  }