@molgenis/vip-report-template 7.1.3 → 8.0.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 (155) hide show
  1. package/.gitattributes +3 -1
  2. package/README.md +13 -0
  3. package/eslint.config.mjs +6 -1
  4. package/package.json +6 -5
  5. package/scripts/validateConfig/README.txt +5 -0
  6. package/scripts/validateConfig/compileValidator.ts +17 -0
  7. package/scripts/validateConfig/createSchema.ts +6 -0
  8. package/scripts/validateConfig/schema.ts +370 -0
  9. package/src/App.tsx +2 -1
  10. package/src/components/DatasetDropdown.tsx +1 -1
  11. package/src/components/GenomeBrowser.tsx +14 -4
  12. package/src/components/RecordsTable.tsx +23 -6
  13. package/src/components/VariantConsequenceContainer.tsx +9 -2
  14. package/src/components/VariantInfoTable.tsx +1 -1
  15. package/src/components/VariantsContainer.tsx +47 -9
  16. package/src/components/VariantsContainerHeader.tsx +1 -8
  17. package/src/components/field/composed/FieldGenotype.tsx +1 -1
  18. package/src/components/field/composed/FieldGenotypeStr.tsx +18 -10
  19. package/src/components/field/composed/FieldGnomAd.tsx +1 -1
  20. package/src/components/field/composed/FieldInheritanceModes.tsx +1 -4
  21. package/src/components/field/composed/FieldVkgl.tsx +1 -1
  22. package/src/components/field/typed/FieldCategorical.tsx +1 -1
  23. package/src/components/field/typed/FieldCharacter.tsx +1 -1
  24. package/src/components/field/typed/FieldFlag.tsx +1 -1
  25. package/src/components/field/typed/FieldFloat.tsx +1 -1
  26. package/src/components/field/typed/FieldInteger.tsx +1 -1
  27. package/src/components/field/typed/FieldString.tsx +1 -1
  28. package/src/components/filter/Filter.tsx +1 -0
  29. package/src/components/filter/composed/FilterAllelicImbalance.tsx +1 -0
  30. package/src/components/filter/composed/FilterComposed.tsx +7 -0
  31. package/src/components/filter/composed/FilterDeNovo.tsx +1 -0
  32. package/src/components/filter/composed/FilterHpo.tsx +1 -0
  33. package/src/components/filter/composed/FilterInheritance.tsx +1 -0
  34. package/src/components/filter/composed/FilterLocus.tsx +17 -3
  35. package/src/components/filter/composed/FilterPick.tsx +30 -0
  36. package/src/components/filter/composed/FilterVipC.tsx +1 -0
  37. package/src/components/filter/composed/FilterVipCS.tsx +1 -0
  38. package/src/components/filter/fixed/FilterFixed.tsx +7 -0
  39. package/src/components/filter/typed/FilterCategorical.tsx +18 -1
  40. package/src/components/filter/typed/FilterFlag.tsx +2 -0
  41. package/src/components/filter/typed/FilterInterval.tsx +29 -1
  42. package/src/components/filter/typed/FilterString.tsx +8 -1
  43. package/src/components/filter/typed/FilterTyped.tsx +1 -0
  44. package/src/components/form/ButtonApply.tsx +6 -2
  45. package/src/mocks/GRCh38/README.txt +15 -0
  46. package/src/mocks/GRCh38/decisionTree.json +201 -0
  47. package/src/mocks/GRCh38/family.ped +6 -0
  48. package/src/mocks/GRCh38/field_metadata.json +36 -11
  49. package/src/mocks/GRCh38/sample1.ped +1 -0
  50. package/src/mocks/GRCh38/static.ts +36 -148
  51. package/src/mocks/GRCh38/str.ped +1 -0
  52. package/src/mocks/GRCh38/vcf/family.db.blob +0 -0
  53. package/src/mocks/GRCh38/vcf/family.vcf +312 -0
  54. package/src/mocks/GRCh38/vcf/fixPaths.sql +7 -0
  55. package/src/mocks/GRCh38/vcf/no_vep.db.blob +0 -0
  56. package/src/mocks/GRCh38/vcf/{no_vep.vcf.blob → no_vep.vcf} +1 -1
  57. package/src/mocks/GRCh38/vcf/samples_0.db.blob +0 -0
  58. package/src/mocks/GRCh38/vcf/samples_1.db.blob +0 -0
  59. package/src/mocks/GRCh38/vcf/samples_100.db.blob +0 -0
  60. package/src/mocks/GRCh38/vcf/{samples_100.vcf.blob → samples_100.vcf} +6 -6
  61. package/src/mocks/GRCh38/vcf/str.db.blob +0 -0
  62. package/src/mocks/GRCh38/vcf/{str.vcf.blob → str.vcf} +17 -17
  63. package/src/mocks/MockApiClient.ts +60 -226
  64. package/src/mocks/config_cram.json +4 -0
  65. package/src/mocks/config_default_values.json +722 -0
  66. package/src/mocks/config_vcf.json +15 -1
  67. package/src/mocks/sql-wasm.wasm.blob +0 -0
  68. package/src/types/config.d.ts +9 -5
  69. package/src/types/configCells.d.ts +1 -0
  70. package/src/types/configFilter.d.ts +1 -0
  71. package/src/types/configFilterComposed.d.ts +3 -0
  72. package/src/utils/api.ts +21 -49
  73. package/src/utils/config/configCellsComposed.ts +1 -1
  74. package/src/utils/config/configCellsField.ts +2 -0
  75. package/src/utils/config/configFiltersComposed.ts +7 -0
  76. package/src/utils/config/configFiltersField.ts +3 -2
  77. package/src/utils/config/configFiltersFixed.ts +7 -0
  78. package/src/utils/config/configValidator.precompiled.ts +83402 -0
  79. package/src/utils/config/configValidator.ts +3 -368
  80. package/src/utils/csq.ts +5 -10
  81. package/src/utils/decisionTree.ts +8 -9
  82. package/src/utils/query/query.ts +3 -2
  83. package/src/utils/query/queryFilter.ts +2 -3
  84. package/src/utils/query/queryFilterComposed.ts +12 -12
  85. package/src/utils/query/queryFilterField.ts +14 -7
  86. package/src/utils/query/queryFilterFixed.ts +5 -5
  87. package/src/utils/query/querySample.ts +15 -4
  88. package/src/utils/query/selector.ts +5 -20
  89. package/src/utils/query/sort.ts +4 -4
  90. package/src/utils/vcf.ts +20 -11
  91. package/src/views/Help.tsx +2 -2
  92. package/src/views/SampleVariant.tsx +4 -1
  93. package/src/views/Samples.tsx +10 -3
  94. package/src/views/data/data.tsx +2 -2
  95. package/tests/utils/config/configFiltersComposed.test.ts +2 -0
  96. package/tests/utils/config/configFiltersField.test.ts +4 -2
  97. package/tests/utils/config/configFiltersFixed.test.ts +23 -6
  98. package/tests/utils/query/query.test.ts +34 -6
  99. package/tests/utils/query/queryFilter.test.ts +4 -31
  100. package/tests/utils/query/queryFilterComposed.test.ts +13 -13
  101. package/tests/utils/query/queryFilterField.test.ts +5 -5
  102. package/tests/utils/query/queryFilterFixed.test.ts +5 -5
  103. package/tests/utils/query/querySample.test.ts +50 -10
  104. package/tests/utils/query/sort.test.ts +1 -1
  105. package/tests/utils/vcf.test.ts +1 -0
  106. package/vite.config.mts +2 -1
  107. package/src/mocks/GRCh37/alignment.cram.blob +0 -0
  108. package/src/mocks/GRCh37/alignment.cram.crai.blob +0 -0
  109. package/src/mocks/GRCh37/decisionTree.json +0 -355
  110. package/src/mocks/GRCh37/fasta/1-10042288-10042788.fasta.gz.blob +0 -0
  111. package/src/mocks/GRCh37/fasta/1-152520538-152521038.fasta.gz.blob +0 -0
  112. package/src/mocks/GRCh37/fasta/1-16375333-16375833.fasta.gz.blob +0 -0
  113. package/src/mocks/GRCh37/fasta/1-16376162-16376662.fasta.gz.blob +0 -0
  114. package/src/mocks/GRCh37/fasta/1-17348965-17349469.fasta.gz.blob +0 -0
  115. package/src/mocks/GRCh37/fasta/1-17348969-17349469.fasta.gz.blob +0 -0
  116. package/src/mocks/GRCh37/fasta/1-17354844-17355344.fasta.gz.blob +0 -0
  117. package/src/mocks/GRCh37/fasta/10-126091249-126091749.fasta.gz.blob +0 -0
  118. package/src/mocks/GRCh37/fasta/11-134013975-134014475.fasta.gz.blob +0 -0
  119. package/src/mocks/GRCh37/fasta/13-77569878-77570378.fasta.gz.blob +0 -0
  120. package/src/mocks/GRCh37/fasta/14-105167610-105168110.fasta.gz.blob +0 -0
  121. package/src/mocks/GRCh37/fasta/14-89307588-89308088.fasta.gz.blob +0 -0
  122. package/src/mocks/GRCh37/fasta/14-89309945-89310445.fasta.gz.blob +0 -0
  123. package/src/mocks/GRCh37/fasta/14-89336157-89336657.fasta.gz.blob +0 -0
  124. package/src/mocks/GRCh37/fasta/17-29555814-29556314.fasta.gz.blob +0 -0
  125. package/src/mocks/GRCh37/fasta/17-29585172-29585672.fasta.gz.blob +0 -0
  126. package/src/mocks/GRCh37/fasta/17-29663629-29664129.fasta.gz.blob +0 -0
  127. package/src/mocks/GRCh37/fasta/17-29675976-29676476.fasta.gz.blob +0 -0
  128. package/src/mocks/GRCh37/fasta/17-29683733-29684233.fasta.gz.blob +0 -0
  129. package/src/mocks/GRCh37/fasta/19-11215896-11216396.fasta.gz.blob +0 -0
  130. package/src/mocks/GRCh37/fasta/19-11223801-11224301.fasta.gz.blob +0 -0
  131. package/src/mocks/GRCh37/fasta/19-17449149-17449649.fasta.gz.blob +0 -0
  132. package/src/mocks/GRCh37/fasta/19-17451747-17452247.fasta.gz.blob +0 -0
  133. package/src/mocks/GRCh37/fasta/2-47635417-47635917.fasta.gz.blob +0 -0
  134. package/src/mocks/GRCh37/fasta/20-62326742-62327242.fasta.gz.blob +0 -0
  135. package/src/mocks/GRCh37/fasta/22-50627343-50627843.fasta.gz.blob +0 -0
  136. package/src/mocks/GRCh37/fasta/22-50721296-50721796.fasta.gz.blob +0 -0
  137. package/src/mocks/GRCh37/fasta/4-106320044-106320544.fasta.gz.blob +0 -0
  138. package/src/mocks/GRCh37/fasta/7-42017061-42017561.fasta.gz.blob +0 -0
  139. package/src/mocks/GRCh37/fasta/7-42064707-42065207.fasta.gz.blob +0 -0
  140. package/src/mocks/GRCh37/fasta/8-145140250-145140750.fasta.gz.blob +0 -0
  141. package/src/mocks/GRCh37/fasta/8-61764893-61765393.fasta.gz.blob +0 -0
  142. package/src/mocks/GRCh37/fasta/9-107546383-107546883.fasta.gz.blob +0 -0
  143. package/src/mocks/GRCh37/fasta/9-107584614-107585114.fasta.gz.blob +0 -0
  144. package/src/mocks/GRCh37/fasta/MT-15076-15576.fasta.gz.blob +0 -0
  145. package/src/mocks/GRCh37/fasta/X-48932771-48933271.fasta.gz.blob +0 -0
  146. package/src/mocks/GRCh37/fasta/Y-2655391-2655891.fasta.gz.blob +0 -0
  147. package/src/mocks/GRCh37/field_metadata.json +0 -794
  148. package/src/mocks/GRCh37/genes.gff.gz.blob +0 -0
  149. package/src/mocks/GRCh37/sampleTree.json +0 -143
  150. package/src/mocks/GRCh37/static.ts +0 -189
  151. package/src/mocks/GRCh37/vcf/family.vcf.blob +0 -134
  152. package/src/mocks/GRCh38/vcf/family.vcf.blob +0 -272
  153. package/src/mocks/static.ts +0 -1636
  154. /package/src/mocks/GRCh38/vcf/{samples_0.vcf.blob → samples_0.vcf} +0 -0
  155. /package/src/mocks/GRCh38/vcf/{samples_1.vcf.blob → samples_1.vcf} +0 -0
@@ -23,7 +23,7 @@ describe("query filter fixed", () => {
23
23
  const value = ["x"];
24
24
  vi.mocked(createQueryFilterString).mockReturnValue(query);
25
25
  expect(createQueryFilterField(config, value)).toStrictEqual(query);
26
- expect(createQueryFilterString).toHaveBeenCalledWith(["n", "f"], value, false, false);
26
+ expect(createQueryFilterString).toHaveBeenCalledWith(["n", "f"], value, false);
27
27
  });
28
28
 
29
29
  test("CHARACTER count=1 info", () => {
@@ -32,7 +32,7 @@ describe("query filter fixed", () => {
32
32
  const value = ["x"];
33
33
  vi.mocked(createQueryFilterString).mockReturnValue(query);
34
34
  expect(createQueryFilterField(config, value)).toStrictEqual(query);
35
- expect(createQueryFilterString).toHaveBeenCalledWith(["n", "f"], value, false, false);
35
+ expect(createQueryFilterString).toHaveBeenCalledWith(["n", "f"], value, false);
36
36
  });
37
37
 
38
38
  test("STRING count=* info nested", () => {
@@ -41,17 +41,17 @@ describe("query filter fixed", () => {
41
41
  const value = ["x"];
42
42
  vi.mocked(createQueryFilterString).mockReturnValue(query);
43
43
  expect(createQueryFilterField(config, value)).toStrictEqual(query);
44
- expect(createQueryFilterString).toHaveBeenCalledWith(["n", "p", "c"], value, true, true);
44
+ expect(createQueryFilterString).toHaveBeenCalledWith(["n", "p", "c"], value, true);
45
45
  });
46
46
 
47
47
  test("STRING count=* genotype", () => {
48
48
  const field = { id: "f", type: "STRING", number: { type: "OTHER" } } as FieldMetadata;
49
- const sample = { item: { data: { index: 1 } } } as SampleContainer;
49
+ const sample = { item: { id: 1, data: { index: 1 } } } as SampleContainer;
50
50
  const config = { type: "genotype", id: "filter", field, sample } as ConfigFilterFormat;
51
51
  const value = ["x"];
52
52
  vi.mocked(createQueryFilterString).mockReturnValue(query);
53
53
  expect(createQueryFilterField(config, value)).toStrictEqual(query);
54
- expect(createQueryFilterString).toHaveBeenCalledWith(["s", 1, "f"], value, true, false);
54
+ expect(createQueryFilterString).toHaveBeenCalledWith(["s", 1, "f"], value, true);
55
55
  });
56
56
 
57
57
  test("FLOAT count=1 info", () => {
@@ -27,7 +27,7 @@ describe("query filter fixed", () => {
27
27
  const value = ["chr1"];
28
28
  vi.mocked(createQueryFilterString).mockReturnValue(query);
29
29
  expect(createQueryFilterFixed(config, value)).toStrictEqual(query);
30
- expect(createQueryFilterString).toHaveBeenCalledWith(["c"], value, false, false);
30
+ expect(createQueryFilterString).toHaveBeenCalledWith(["c"], value, false);
31
31
  });
32
32
 
33
33
  test("pos", () => {
@@ -43,7 +43,7 @@ describe("query filter fixed", () => {
43
43
  const value = ["id0"];
44
44
  vi.mocked(createQueryFilterString).mockReturnValue(query);
45
45
  expect(createQueryFilterFixed(config, value)).toStrictEqual(query);
46
- expect(createQueryFilterString).toHaveBeenCalledWith(["i"], value, true, false);
46
+ expect(createQueryFilterString).toHaveBeenCalledWith(["i"], value, true);
47
47
  });
48
48
 
49
49
  test("ref", () => {
@@ -51,7 +51,7 @@ describe("query filter fixed", () => {
51
51
  const value = ["C"];
52
52
  vi.mocked(createQueryFilterString).mockReturnValue(query);
53
53
  expect(createQueryFilterFixed(config, value)).toStrictEqual(query);
54
- expect(createQueryFilterString).toHaveBeenCalledWith(["r"], value, false, false);
54
+ expect(createQueryFilterString).toHaveBeenCalledWith(["r"], value, false);
55
55
  });
56
56
 
57
57
  test("alt", () => {
@@ -59,7 +59,7 @@ describe("query filter fixed", () => {
59
59
  const value = ["C"];
60
60
  vi.mocked(createQueryFilterString).mockReturnValue(query);
61
61
  expect(createQueryFilterFixed(config, value)).toStrictEqual(query);
62
- expect(createQueryFilterString).toHaveBeenCalledWith(["a"], value, true, false);
62
+ expect(createQueryFilterString).toHaveBeenCalledWith(["a"], value, true);
63
63
  });
64
64
 
65
65
  test("qual", () => {
@@ -75,7 +75,7 @@ describe("query filter fixed", () => {
75
75
  const value = ["filter0"];
76
76
  vi.mocked(createQueryFilterString).mockReturnValue(query);
77
77
  expect(createQueryFilterFixed(config, value)).toStrictEqual(query);
78
- expect(createQueryFilterString).toHaveBeenCalledWith(["f"], value, true, false);
78
+ expect(createQueryFilterString).toHaveBeenCalledWith(["f"], value, true);
79
79
  });
80
80
 
81
81
  test("invalid", () => {
@@ -1,11 +1,12 @@
1
1
  import { afterEach, describe, expect, test, vi } from "vitest";
2
2
  import { createQuerySample } from "../../../src/utils/query/querySample.ts";
3
3
  import { ConfigVip } from "../../../src/types/config";
4
- import { SampleContainer } from "../../../src/utils/api.ts";
4
+ import { MetadataContainer, SampleContainer, VcfMetadataContainer } from "../../../src/utils/api.ts";
5
5
  import { FieldMetadata } from "@molgenis/vip-report-vcf";
6
6
  import { createQueryFilterFieldCategorical } from "../../../src/utils/query/queryFilterField.ts";
7
7
  import { createSelectorSample } from "../../../src/utils/query/selector.ts";
8
8
  import { Query } from "@molgenis/vip-report-api";
9
+ import { FieldMetadataWrapper } from "../../../src/utils/vcf.ts";
9
10
 
10
11
  describe("query sample", () => {
11
12
  vi.mock(import("../../../src/utils/query/selector.ts"));
@@ -23,21 +24,51 @@ describe("query sample", () => {
23
24
  number: { type: "NUMBER", count: 1 },
24
25
  categories: {},
25
26
  } as FieldMetadata;
26
- const classes = "VUS,LP,P";
27
+ const classes = "U1,U2";
27
28
  const config = { filter_field, params: { vcf: { filter_samples: { classes } } } } as ConfigVip;
28
- const sample = { item: { data: { index: 1 } } } as SampleContainer;
29
-
29
+ const sample = { item: { id: 7, data: {} } } as SampleContainer;
30
+ const fieldMetadata = { id: "GT", number: { type: "NUMBER", count: 1 } } as FieldMetadataWrapper;
31
+ const vcfMetadata = {
32
+ format: { GT: fieldMetadata },
33
+ } as Partial<VcfMetadataContainer> as VcfMetadataContainer;
34
+ const meta = {
35
+ app: {},
36
+ records: vcfMetadata,
37
+ variantTypeIds: { }
38
+ } as MetadataContainer
30
39
  const selector = ["x"];
31
- const query: Query = { selector, operator: "==", args: "y" };
40
+ const completeQuery: Query = {
41
+ args: [
42
+ {
43
+ args: "y",
44
+ operator: "==",
45
+ selector: ["x",],
46
+ },
47
+ {
48
+ args: [
49
+ "HOM_REF",
50
+ "NO_CALL",
51
+ "UNAVAILABLE",
52
+ ],
53
+ operator: "!in",
54
+ selector: ["s",7,"GT_type",],
55
+ },
56
+ ],
57
+ operator: "and",
58
+ };
59
+ const query: Query = {
60
+ args: "y",
61
+ operator: "==",
62
+ selector: ["x",],
63
+ };
32
64
  vi.mocked(createSelectorSample).mockReturnValue(selector);
33
65
  vi.mocked(createQueryFilterFieldCategorical).mockReturnValue(query);
34
66
 
35
- expect(createQuerySample(config, sample)).toStrictEqual(query);
67
+ expect(createQuerySample(config, sample, meta)).toStrictEqual(completeQuery);
36
68
  expect(createSelectorSample).toHaveBeenCalledWith(sample, filter_field);
37
69
  expect(createQueryFilterFieldCategorical).toHaveBeenCalledWith(selector, filter_field, [
38
- "VUS",
39
- "LP",
40
- "P",
70
+ "U1",
71
+ "U2",
41
72
  "__null",
42
73
  ]);
43
74
  });
@@ -46,7 +77,16 @@ describe("query sample", () => {
46
77
  const classes = "VUS,LP,P";
47
78
  const config = { filter_field: null, params: { vcf: { filter_samples: { classes } } } } as ConfigVip;
48
79
  const sample = { item: { data: { index: 1 } } } as SampleContainer;
49
- expect(createQuerySample(config, sample)).toStrictEqual(null);
80
+ const fieldMetadata = { id: "GT", number: { type: "NUMBER", count: 1 } } as FieldMetadataWrapper;
81
+ const vcfMetadata = {
82
+ format: { GT: fieldMetadata },
83
+ } as Partial<VcfMetadataContainer> as VcfMetadataContainer;
84
+ const meta = {
85
+ app: {},
86
+ records: vcfMetadata,
87
+ variantTypeIds: { }
88
+ } as MetadataContainer
89
+ expect(createQuerySample(config, sample, meta)).toStrictEqual(null);
50
90
  });
51
91
  });
52
92
  });
@@ -65,7 +65,7 @@ describe("sort utilities", () => {
65
65
  test("create record sort order from params sort order with nested path", () => {
66
66
  expect(
67
67
  createRecordSort(metadata, {
68
- property: ["n", "n_object0", 1],
68
+ property: ["n", "n_object0", "n_string2"],
69
69
  compare: "asc",
70
70
  }),
71
71
  ).toStrictEqual({ orders: [{ field: nString2Meta, direction: DIRECTION_ASCENDING }] });
@@ -32,6 +32,7 @@ describe("vcf", () => {
32
32
  a: ["C", "T"],
33
33
  q: null,
34
34
  f: [],
35
+ g: "TEST",
35
36
  n: {},
36
37
  s: [],
37
38
  },
package/vite.config.mts CHANGED
@@ -10,6 +10,7 @@ export default defineConfig(({ command }) => ({
10
10
  pure: command === "build" ? ["console.log"] : [],
11
11
  },
12
12
  build: {
13
+ target: 'es2022',
13
14
  modulePreload: false,
14
15
  reportCompressedSize: false,
15
16
  // inline plugin build options
@@ -24,7 +25,7 @@ export default defineConfig(({ command }) => ({
24
25
  test: {
25
26
  coverage: {
26
27
  include: ["src/**"],
27
- exclude: [...coverageConfigDefaults.exclude, "src/mocks/**"],
28
+ exclude: [...coverageConfigDefaults.exclude, "src/mocks/**", "**/*.precompiled.ts"],
28
29
  // TODO add .tsx once component tests are added
29
30
  extension: [".ts"],
30
31
  thresholds: {
@@ -1,355 +0,0 @@
1
- {
2
- "rootNode": "filter",
3
- "nodes": {
4
- "filter": {
5
- "label": "filter",
6
- "type": "BOOL",
7
- "description": "All filters passed",
8
- "query": {
9
- "field": "FILTER",
10
- "operator": "==",
11
- "value": ["PASS"]
12
- },
13
- "outcomeTrue": {
14
- "nextNode": "vkgl"
15
- },
16
- "outcomeFalse": {
17
- "nextNode": "exit_lq"
18
- },
19
- "outcomeMissing": {
20
- "nextNode": "vkgl"
21
- }
22
- },
23
- "spliceAI": {
24
- "label": "spliceAI",
25
- "type": "BOOL_MULTI",
26
- "fields": [
27
- "INFO/CSQ/SpliceAI_pred_DS_AG",
28
- "INFO/CSQ/SpliceAI_pred_DS_AL",
29
- "INFO/CSQ/SpliceAI_pred_DS_DG",
30
- "INFO/CSQ/SpliceAI_pred_DS_DL"
31
- ],
32
- "outcomes": [
33
- {
34
- "operator": "OR",
35
- "queries": [
36
- {
37
- "field": "INFO/CSQ/SpliceAI_pred_DS_AG",
38
- "operator": ">",
39
- "value": 0.42
40
- },
41
- {
42
- "field": "INFO/CSQ/SpliceAI_pred_DS_AL",
43
- "operator": ">",
44
- "value": 0.42
45
- },
46
- {
47
- "field": "INFO/CSQ/SpliceAI_pred_DS_DG",
48
- "operator": ">",
49
- "value": 0.42
50
- },
51
- {
52
- "field": "INFO/CSQ/SpliceAI_pred_DS_DL",
53
- "operator": ">",
54
- "value": 0.42
55
- }
56
- ],
57
- "outcomeTrue": {
58
- "nextNode": "exit_lp"
59
- }
60
- }
61
- ],
62
- "outcomeDefault": {
63
- "nextNode": "annotSV"
64
- },
65
- "outcomeMissing": {
66
- "nextNode": "annotSV"
67
- }
68
- },
69
- "vkgl": {
70
- "label": "VKGL",
71
- "type": "CATEGORICAL",
72
- "description": "VKGL classification",
73
- "field": "INFO/CSQ/VKGL_CL",
74
- "outcomeMap": {
75
- "P": {
76
- "nextNode": "exit_p"
77
- },
78
- "LP": {
79
- "nextNode": "exit_lp"
80
- },
81
- "LB": {
82
- "nextNode": "exit_lb"
83
- },
84
- "B": {
85
- "nextNode": "exit_b"
86
- }
87
- },
88
- "outcomeMissing": {
89
- "nextNode": "clinVar"
90
- },
91
- "outcomeDefault": {
92
- "nextNode": "clinVar"
93
- }
94
- },
95
- "annotSV": {
96
- "label": "AnnotSV",
97
- "type": "CATEGORICAL",
98
- "description": "VKGL classification",
99
- "field": "INFO/CSQ/ASV_ACMG_class",
100
- "outcomeMap": {
101
- "5": {
102
- "nextNode": "exit_p"
103
- },
104
- "4": {
105
- "nextNode": "exit_lp"
106
- },
107
- "2": {
108
- "nextNode": "exit_lb"
109
- },
110
- "1": {
111
- "nextNode": "exit_b"
112
- }
113
- },
114
- "outcomeMissing": {
115
- "nextNode": "impact"
116
- },
117
- "outcomeDefault": {
118
- "nextNode": "impact"
119
- }
120
- },
121
- "gnomad": {
122
- "label": "GnomAD",
123
- "type": "BOOL_MULTI",
124
- "description": "gnomAD_AF < 0.02 && gnomAD_HN < 5",
125
- "fields": ["INFO/CSQ/gnomAD_AF", "INFO/CSQ/gnomAD_HN"],
126
- "outcomes": [
127
- {
128
- "operator": "OR",
129
- "queries": [
130
- {
131
- "field": "INFO/CSQ/gnomAD_AF",
132
- "operator": ">=",
133
- "value": 0.02
134
- },
135
- {
136
- "field": "INFO/CSQ/gnomAD_HN",
137
- "operator": ">=",
138
- "value": 5
139
- }
140
- ],
141
- "outcomeTrue": {
142
- "nextNode": "exit_lb"
143
- }
144
- }
145
- ],
146
- "outcomeDefault": {
147
- "nextNode": "effect"
148
- },
149
- "outcomeMissing": {
150
- "nextNode": "effect"
151
- }
152
- },
153
- "effect": {
154
- "label": "Effect",
155
- "type": "BOOL",
156
- "description": "Consequence contains 'missense'",
157
- "query": {
158
- "field": "INFO/CSQ/Consequence",
159
- "operator": "contains",
160
- "value": "missense_variant"
161
- },
162
- "outcomeTrue": {
163
- "nextNode": "sift"
164
- },
165
- "outcomeFalse": {
166
- "nextNode": "spliceAI"
167
- },
168
- "outcomeMissing": {
169
- "nextNode": "spliceAI"
170
- }
171
- },
172
- "clinVar": {
173
- "label": "ClinVar",
174
- "type": "BOOL_MULTI",
175
- "fields": ["INFO/CSQ/CLIN_SIG"],
176
- "outcomes": [
177
- {
178
- "queries": [
179
- {
180
- "field": "INFO/CSQ/CLIN_SIG",
181
- "operator": "contains_any",
182
- "value": [
183
- "conflicting_interpretations_of_pathogenicity",
184
- "conflicting_data_from_submitters",
185
- "uncertain_significance"
186
- ]
187
- }
188
- ],
189
- "outcomeTrue": {
190
- "nextNode": "gnomad"
191
- }
192
- },
193
- {
194
- "queries": [
195
- {
196
- "field": "INFO/CSQ/CLIN_SIG",
197
- "operator": "contains_any",
198
- "value": ["likely_benign", "benign"]
199
- }
200
- ],
201
- "outcomeTrue": {
202
- "nextNode": "exit_lb"
203
- }
204
- },
205
- {
206
- "queries": [
207
- {
208
- "field": "INFO/CSQ/CLIN_SIG",
209
- "operator": "contains_any",
210
- "value": ["likely_pathogenic", "pathogenic"]
211
- }
212
- ],
213
- "outcomeTrue": {
214
- "nextNode": "exit_lp"
215
- }
216
- }
217
- ],
218
- "outcomeDefault": {
219
- "nextNode": "gnomad"
220
- },
221
- "outcomeMissing": {
222
- "nextNode": "gnomad"
223
- }
224
- },
225
- "sift": {
226
- "label": "SIFT",
227
- "description": "SIFT qualitative prediction",
228
- "type": "BOOL",
229
- "query": {
230
- "field": "INFO/CSQ/SIFT",
231
- "operator": "<",
232
- "value": 0.05
233
- },
234
- "outcomeTrue": {
235
- "nextNode": "exit_lp"
236
- },
237
- "outcomeFalse": {
238
- "nextNode": "polyphen"
239
- },
240
- "outcomeMissing": {
241
- "nextNode": "polyphen"
242
- }
243
- },
244
- "polyphen": {
245
- "label": "PolyPhen",
246
- "description": "PolyPhen qualitative prediction",
247
- "type": "BOOL_MULTI",
248
- "fields": ["INFO/CSQ/PolyPhen"],
249
- "outcomes": [
250
- {
251
- "queries": [
252
- {
253
- "field": "INFO/CSQ/PolyPhen",
254
- "operator": "<",
255
- "value": 0.15
256
- }
257
- ],
258
- "outcomeTrue": {
259
- "nextNode": "exit_lb"
260
- }
261
- },
262
- {
263
- "operator": "AND",
264
- "queries": [
265
- {
266
- "field": "INFO/CSQ/PolyPhen",
267
- "operator": ">",
268
- "value": 0.15
269
- },
270
- {
271
- "field": "INFO/CSQ/PolyPhen",
272
- "operator": "<",
273
- "value": 0.85
274
- }
275
- ],
276
- "outcomeTrue": {
277
- "nextNode": "exit_vus"
278
- }
279
- },
280
- {
281
- "queries": [
282
- {
283
- "field": "INFO/CSQ/PolyPhen",
284
- "operator": ">",
285
- "value": 0.85
286
- }
287
- ],
288
- "outcomeTrue": {
289
- "nextNode": "exit_lp"
290
- }
291
- }
292
- ],
293
- "outcomeDefault": {
294
- "nextNode": "impact"
295
- },
296
- "outcomeMissing": {
297
- "nextNode": "impact"
298
- }
299
- },
300
- "impact": {
301
- "label": "IMPACT",
302
- "type": "CATEGORICAL",
303
- "description": "IMPACT rating",
304
- "field": "INFO/CSQ/IMPACT",
305
- "outcomeMap": {
306
- "MODIFIER": {
307
- "nextNode": "exit_lb"
308
- },
309
- "LOW": {
310
- "nextNode": "exit_lb"
311
- },
312
- "MODERATE": {
313
- "nextNode": "exit_vus"
314
- },
315
- "HIGH": {
316
- "nextNode": "exit_lp"
317
- }
318
- },
319
- "outcomeMissing": {
320
- "nextNode": "exit_vus"
321
- }
322
- },
323
- "exit_rm": {
324
- "label": "Remove",
325
- "description": "Low quality variants.",
326
- "type": "LEAF",
327
- "class": "LQ"
328
- },
329
- "exit_b": {
330
- "label": "Benign",
331
- "type": "LEAF",
332
- "class": "B"
333
- },
334
- "exit_lb": {
335
- "label": "Likely Benign",
336
- "type": "LEAF",
337
- "class": "LB"
338
- },
339
- "exit_vus": {
340
- "label": "Unknown Significance",
341
- "type": "LEAF",
342
- "class": "VUS"
343
- },
344
- "exit_lp": {
345
- "label": "Likely Pathogenic",
346
- "type": "LEAF",
347
- "class": "LP"
348
- },
349
- "exit_p": {
350
- "label": "Pathogenic",
351
- "type": "LEAF",
352
- "class": "P"
353
- }
354
- }
355
- }