> For the complete documentation index, see [llms.txt](https://help.connected.illumina.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.connected.illumina.com/annotation/core-functionality/variant-classification.md).

# Variant Classification

### Introduction

Illumina Connected Annotation follows the [VCF Specification](https://samtools.github.io/hts-specs/VCFv4.5.pdf) when parsing the VCF files. VCF files classify the variants based on alleles and certain `INFO` fields.

While the VCF variant type does not depend on the size of the variant, (both a `ATG->A` and `A-><DEL>` are `deletion`) for the purpose of annotation, it is useful to classify variants into small and structural (large) variants. This is due to the realization that reporting annotations for a deletion like `1-1000-ATG-A` from `ClinVar` for a 20kbp `<DEL>` at that same location is not helpful and vice versa. Following guidelines are used by Illumina Connected Annotations.

{% hint style="info" %}
Structural variants are treated as intervals when providing supplementary annotations such as ClinVar, gnomAD etc.
{% endhint %}

#### Non-Informative Alleles

Before classification, the following non-informative ALT alleles are filtered out and skipped entirely:

| Allele      | Source                           |
| ----------- | -------------------------------- |
| `<NON_REF>` | GATK gVCF reference block        |
| `<*>`       | Symbolic non-ref                 |
| `*`         | Missing due to upstream deletion |
| `<M>`       | Missing allele                   |

#### Classification Overview

The primary boundary between small and structural variants is the **50bp threshold** applied to nucleotide-only alleles.

| Category        | Criteria                                                                            | Example                                 |
| --------------- | ----------------------------------------------------------------------------------- | --------------------------------------- |
| SmallVariant    | Nucleotide-only allele AND length <= 50bp                                           | `G -> A` SNV, `T -> TAA` insertion      |
| SmallVariant    | Non-symbolic allele with no SV metadata (`SVTYPE`, `SVLEN`, `IMPRECISE` all absent) | `ACGT -> A` without any INFO SV fields  |
| SV\_COMPLETE    | Symbolic `<INS>` with `SVINSSEQ` or `DUPSVINSSEQ`+`SVLEN` in INFO                   | `<INS>` with `SVINSSEQ=ACGTACGT...`     |
| SV\_COMPLETE    | Precise nucleotide allele exceeding the 50bp threshold                              | 200bp explicit ALT with `SVTYPE=DEL`    |
| SV\_INCOMPLETE  | Breakend notation (`[` or `]` in ALT)                                               | `N[chr10:1234567[`                      |
| SV\_INCOMPLETE  | Symbolic allele without sufficient sequence information                             | `<DEL>` with `SVTYPE=DEL`               |
| CNV             | `SVTYPE=CNV` or `SVTYPE=LOH`, or `LOHTYPE` present                                  | `<DEL>` with `SVTYPE=CNV`               |
| RepeatExpansion | ALT starts with `<STR` (repeat count embedded)                                      | `<STR12>`                               |
| ROH             | ALT is exactly `<ROH>`                                                              | `<ROH>` with `SVTYPE=ROH`               |
| SINGLE\_BND     | `SVTYPE=BND`, or ALT uses dot notation                                              | `.G` or `G.`                            |
| Reference       | `globalMajorAllele` is non-null (ref-minor site)                                    | Ref-minor position from population data |

### Variant Categories

#### SmallVariant

**Trigger (either condition):**

* Alt allele is nucleotide-only (A/C/G/T) AND max allele length (`max(ref allele length, alt allele length)`) is less than or equal to 50.
* No SV metadata: `SVTYPE` is absent, `SVLEN` is absent, `IMPRECISE` is false, and allele is not symbolic

The specific `VariantType` is determined after normalization (left-alignment and padding-base trimming):

| Condition                                      | VariantType |
| ---------------------------------------------- | ----------- |
| ref and alt same length, length = 1            | SNV         |
| ref and alt same length, length > 1            | MNV         |
| ref longer than alt (alt is empty after trim)  | deletion    |
| alt longer than ref (ref is empty after trim)  | insertion   |
| Different lengths, neither is empty after trim | delins      |

***

#### SV\_COMPLETE (Complete Structural Variants)

**Trigger (any):**

* Symbolic `<INS>` with non-empty `SVINSSEQ` in INFO
* Symbolic `<INS>` with non-empty `DUPSVINSSEQ` and `SVLEN` in INFO
* Non-symbolic (precise nucleotide sequence) alt allele that exceeds the 50bp threshold

**Meaning:** The exact breakpoint or inserted sequence is known. Full transcript annotation is performed.

**Variant types resolved from `SVTYPE`:**

| SVTYPE            | VariantType                                                     |
| ----------------- | --------------------------------------------------------------- |
| DEL               | deletion (or copy\_number\_loss if CN field present)            |
| INS               | insertion                                                       |
| DUP               | tandem\_duplication (or copy\_number\_gain if CN field present) |
| DUP:TANDEM / TDUP | tandem\_duplication                                             |
| INV               | inversion                                                       |
| BND               | translocation                                                   |
| ALU / LINE1 / SVA | mobile\_element\_insertion                                      |
| UPD               | UPD                                                             |

***

#### SV\_INCOMPLETE (Incomplete Structural Variants)

**Trigger:**

* Alt allele contains `[` or `]` (breakend notation, e.g. `G]17:198982]`)
* Symbolic allele (e.g. `<DEL>`, `<DUP>`) without sufficient sequence information to classify as complete

**Meaning:** Imprecise or incomplete structural variant. Reduced transcript annotation is applied because exact boundaries are uncertain.

***

#### CNV

**Trigger (any):**

* `SVTYPE` is `"CNV"` or `"LOH"`
* `LOHTYPE` field is non-empty

**Sub-type resolution:**

| Condition                 | VariantType             |
| ------------------------- | ----------------------- |
| `<LOH>` + LOHTYPE=CNLOH   | copy\_number\_neutral   |
| `<LOH>` + LOHTYPE=GAINLOH | copy\_number\_gain      |
| `<LOH>` + LOHTYPE=LOSSLOH | copy\_number\_loss      |
| `<DEL>` or copyNumber < 1 | copy\_number\_loss      |
| `<DUP>` or copyNumber > 1 | copy\_number\_gain      |
| Otherwise                 | copy\_number\_variation |

***

#### RepeatExpansion

**Trigger:** Alt allele starts with `<STR` (e.g. `<STR12>`). The repeat count is parsed from the digits following `STR`.

**Variant type:** `short_tandem_repeat_variation`.

***

#### ROH (Run of Homozygosity)

**Trigger:** Alt allele is exactly `<ROH>`.

**Variant type:** `run_of_homozygosity`.

***

#### SINGLE\_BND (Single Breakend)

**Trigger (either):**

* `SVTYPE` is `"BND"`
* Alt allele starts or ends with `.` (dot notation, e.g. `G.` or `.G`)

**Variant type:** `translocation`.

***

#### Reference (Ref-Minor)

**Trigger:** `globalMajorAllele` is non-null (ref-minor site where the reference allele is the minor allele in the population).

Handled by delegating to `SmallVariantCreator` with `isRefMinor = true`.

### Annotation Behavior

Each variant category is assigned an annotation behavior that determines the scope of transcript and supplementary annotations applied.

| Category              | Annotation Behavior          |
| --------------------- | ---------------------------- |
| SmallVariant          | SmallVariants                |
| Reference (Ref-Minor) | SmallVariants                |
| SV\_COMPLETE          | CompleteStructuralVariants   |
| SV\_INCOMPLETE        | IncompleteStructuralVariants |
| CNV                   | IncompleteStructuralVariants |
| ROH                   | RunsOfHomozygosity           |
| SINGLE\_BND           | BreakendVariants             |
| RepeatExpansion       | IncompleteStructuralVariants |

#### Annotation Behavior Descriptions

| Annotation Behavior          | Description                                                                                                                                                                     |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SmallVariants                | Full annotation including transcript consequences, CDS/protein positions, HGVS notation, and supplementary data sources (ClinVar, gnomAD, etc.)                                 |
| CompleteStructuralVariants   | Full annotation including transcript consequences, CDS/protein positions, HGVS notation. Supplementary annotations are matched by interval overlap (e.g. gnomAd SV, ClinVar SV) |
| IncompleteStructuralVariants | Reduced transcript annotation because exact boundaries are uncertain. Supplementary annotations are matched by interval overlap (e.g. gnomAd SV, ClinVar SV)                    |
| RunsOfHomozygosity           | Minimal annotation since ROH is a zygosity observation, not a sequence change                                                                                                   |
| BreakendVariants             | Breakend-specific annotation                                                                                                                                                    |

### Alt Allele Resolution

Before categorization, symbolic `<INS>` alleles are resolved to concrete sequences when possible:

1. **SVINSSEQ present** -- ALT becomes `refAllele[0] + SVINSSEQ` (anchoring base + inserted sequence).
2. **DUPSVINSSEQ + SVLEN present** -- Represents a tandem duplication followed by novel insertion:
   * Duplication length = `SVLEN - DUPSVINSSEQ.Length`
   * Duplicated sequence fetched from the reference at POS
   * ALT = `refAllele[0] + duplicatedSequence + DUPSVINSSEQ`

If neither field is available, `<INS>` remains symbolic and categorizes as `SV_INCOMPLETE`.

### Normalization

After categorization, variants are normalized (left-aligned and padding bases trimmed) against the reference sequence.

**Exception:** `SINGLE_BND` variants skip normalization. Since single breakends use dot notation (`.G` or `G.`), trimming the padding base would make it impossible to reconstruct the original allele.

For `SmallVariant` and `Reference` categories, the `end` position is recalculated after normalization as `shiftedStart + shiftedRef.Length - 1`.

### Examples

#### Small Variants

**SNP**

**Input Data:**

```vcf
chr1    1234567    .    G    A    .    PASS    .
```

**Classification:**

* This is a single nucleotide polymorphism (SNP)
* It does not contain breakend notation or symbolic alleles
* It does not contain `SVTYPE` or `SVLEN` in the `INFO` field

**Short Indel**

**Input Data:**

```vcf
chr2    8901234    .    T    TAA    .    PASS    .
```

**Classification:**

* This is an insertion of 2 base pairs
* The length of change is small (3bp), so it falls under small variant
* It does not contain `SVTYPE` or `SVLEN` in the `INFO` field

**Multiallelic SNP**

**Input Data:**

```vcf
chr7    2345678    .    G    A,C    .    PASS    .
```

**Classification:**

* This represents a multiallelic SNP, where two different alternative alleles exist (`A` and `C`)
* Each allele is processed independently through the classification pipeline
* It does not contain `SVTYPE` or `SVLEN` in the `INFO` field

#### Structural Variants

**Deletion (symbolic)**

**Input Data:**

```vcf
chr3    3456789    .    N    <DEL>    .    PASS    SVTYPE=DEL;END=3457890
```

**Classification:**

* The alternate allele (`<DEL>`) is symbolic
* The `SVTYPE=DEL` confirms it is a structural variant
* Category: `SV_INCOMPLETE` (no precise sequence available)

**Deletion with explicit alleles**

**Input Data:**

```vcf
chr1    934064    .    AGGGGAGGCGGCTGCGTTACAGGTGGGCAGGGGAGGCGGCTCCGTTACAGGTGGGCAGGGGAGGCGGCTGCGTTACA    A    .    .    END=934904;SVTYPE=DEL
```

**Classification:**

* The alternate and reference alleles are precise but `SVTYPE=DEL` indicates it is a structural variant
* Category: `SV_COMPLETE` (precise nucleotide allele exceeding 50bp)

**Run Of Homozygosity**

**Input Data:**

```vcf
1   4000000    .    N    <ROH>    .    ROHLC    SVTYPE=ROH;END=4001000    GT    .    .    1
```

**Classification:**

* The alternate allele (`<ROH>`) is symbolic
* Category: `ROH`

**Repeat Expansion**

**Input Data:**

```vcf
chrX    9876543    .    CAG    <STR12>    .    PASS    SVTYPE=STR;REPEAT_UNIT=CAG
```

**Classification:**

* The alternate allele `<STR12>` indicates a repeat expansion with 12 repeats
* Category: `RepeatExpansion`

**Copy Number Variation**

**Input Data:**

```vcf
chr7    110541589    .    N    <DEL>    27    cnvLength    SVTYPE=CNV;END=110548681;REFLEN=7092
```

**Classification:**

* The alternate allele `<DEL>` is symbolic
* `SVTYPE=CNV` confirms it is a copy number variant (copy\_number\_loss)
* Category: `CNV`

**Translocation**

**Input Data:**

```vcf
chr4    5678901    .    N    N[chr10:1234567[    .    PASS    SVTYPE=BND
```

**Classification:**

* The alternate allele contains `[` and `]`, signifying a breakend
* `SVTYPE=BND` confirms this is a structural variant (translocation)
* Category: `SV_INCOMPLETE`


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://help.connected.illumina.com/annotation/core-functionality/variant-classification.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
