---
# System prepended metadata

title: '[MBI] Ćwiczenie 3: Resekwencjonowanie genomu człowieka'

---

# [MBI] Ćwiczenie 3: Resekwencjonowanie genomu człowieka

**Data: 15.05.2022**

## Skład zespołu

* Rafał Kulus (300249)
* Kamil Przybyła (300254)

## Mapowanie

### Q&A:

**Sprawdź zawartość wygenerowango pliku SAM. Jaka jest typowa
długość odczytów?**

Odczyty są długości wynoszącej około 76 symboli.

**Jak jest różnica w wielkości plików FASTQ, BAM, SAM?**

| Plik | Rozmiar | 
| -------- | -------- | 
| FASTQ    | 57MB     | 
| BAM      | 14.1MB   | 
| SAM      | 75.9MB   | 

**Uwaga:** Wielkości plików podane zostały w megabajtach ($10^6$ bajtów), a nie mebibajtach ($2^20$ bajtów).

## Wizualizacja zawartości pliku BAM w programie IGV

### Q&A:

**Jaka jest pozycja tego wariantu? Ile odczytów wskazuje na wariant a ile na referencje? Czy jest to wariant homo czy heterozygotyczny?**

Pozycja wariantu: chr1:156.518.379

Na wariant wskazuje 230 odczytów.

Na referencję wskazuje 1 odczyt.

Jest to wariant homozygotyczny, ponieważ na danej pozycji znajdują się identyczne allele.

![](https://i.imgur.com/5kiJq2F.png)

## Wykrywanie wariantów

### Q&A:

**Ile wariantów zawiera plik?**

Plik zawiera 6050 wariantów.

**Ile wariantów zostało po filtracji? Jakich innych parametrów możemy użyć do dalszej filtracji liczby wariantów?**

Po filtracji zostało 241 wariantów.

Do dalszej filtracji można wykorzystać dowolny z paramerów wypisanych z listy, tworząc wyrażenia filtrujące, które spełniać będą musiały interesujące nas warianty:

```
##INFO=<ID=INDEL,Number=0,Type=Flag,Description="Indicates that the variant is an INDEL.">
##INFO=<ID=IDV,Number=1,Type=Integer,Description="Maximum number of reads supporting an indel">
##INFO=<ID=IMF,Number=1,Type=Float,Description="Maximum fraction of reads supporting an indel">
##INFO=<ID=DP,Number=1,Type=Integer,Description="Raw read depth">
##INFO=<ID=VDB,Number=1,Type=Float,Description="Variant Distance Bias for filtering splice-site artefacts in RNA-seq data (bigger is better)",Version="3">
##INFO=<ID=RPB,Number=1,Type=Float,Description="Mann-Whitney U test of Read Position Bias (bigger is better)">
##INFO=<ID=MQB,Number=1,Type=Float,Description="Mann-Whitney U test of Mapping Quality Bias (bigger is better)">
##INFO=<ID=BQB,Number=1,Type=Float,Description="Mann-Whitney U test of Base Quality Bias (bigger is better)">
##INFO=<ID=MQSB,Number=1,Type=Float,Description="Mann-Whitney U test of Mapping Quality vs Strand Bias (bigger is better)">
##INFO=<ID=SGB,Number=1,Type=Float,Description="Segregation based metric.">
##INFO=<ID=MQ0F,Number=1,Type=Float,Description="Fraction of MQ0 reads (smaller is better)">
##FORMAT=<ID=PL,Number=G,Type=Integer,Description="List of Phred-scaled genotype likelihoods">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##INFO=<ID=ICB,Number=1,Type=Float,Description="Inbreeding Coefficient Binomial test (bigger is better)">
##INFO=<ID=HOB,Number=1,Type=Float,Description="Bias in the number of HOMs number (smaller is better)">
##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes for each ALT allele, in the same order as listed">
##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
##INFO=<ID=DP4,Number=4,Type=Integer,Description="Number of high-quality ref-forward , ref-reverse, alt-forward and alt-reverse bases">
##INFO=<ID=MQ,Number=1,Type=Integer,Description="Average mapping quality">
```

Jak widać filtrować możemy na przykład po jakości mapowania, wynikach różnych testów statystycznych czy liczbie alleli.


## Adnotacje wariantów

### Q&A:

**Jaki typ wariantu przeważa?**

Przeważa wariant typu *intron_variant* (35%), czyli wariant występujący w intronie (transcript variant occurring within an intron).

![](https://i.imgur.com/NyLbzy5.png)


**Załącz do sprawozdania wiersze odpowiadające temu wariantowi. Czy
jest to wariant w części kodującej?**

```
.	1:156518379-156518379	A	missense_variant	MODERATE	IQGAP3	ENSG00000183856	Transcript	ENST00000361170.2	protein_coding	17/38	-	-	-	1998	1987	663	R/C	Cgt/Tgt	rs744224,COSV63249352	-	-1	-HGNC	20669	-	-	-	-	tolerated(0.13)	benign(0)	0.4071	-	0,1	0,1	-	-	-	-	-	-

.	1:156518379-156518379	A	missense_variant,NMD_transcript_variant	MODERATE	IQGAP3	ENSG00000183856	Transcript	ENST00000491900.1	nonsense_mediated_decay	16/38	-	-	-	1974	1858	620	R/C	Cgt/Tgt	rs744224,COSV63249352	-	-1	-	HGNC	20669	-	-	-	-	tolerated(0.13)	benign(0)	0.4071	-	0,1	0,1	-	-	-	-	-	-
```

Jest to wariant w części kodującej, o czym świadczy istnienie wartości dla pól `Exon`, `cDNA position`, `CDS position`, `Protein position`, `Amino acids` oraz `Codons`.

## Zadanie implementacyjne

```python
import pandas as pd
import pyranges as pr


def main():
    header_names = ['geneName', 'name', 'chrom', 'strand', 'txStart', 'txEnd',
                    'cdsStart', 'cdsEnd', 'exonCount', 'exonStarts', 'exonEnds']
    df = pd.read_csv('refFlat.txt', header=None, names=header_names, sep="\t")
    df = df.rename(columns={'chrom': 'Chromosome', 'txStart': 'Start', 'txEnd': 'End'})
    prdf = pr.PyRanges(df)

    vcf_header_names = ['CHROM', 'POS', 'ID', 'REF', 'ALT', 'QUAL',
                        'FILTER', 'INFO', 'FORMAT', 'coriell_chr1.bam']
    df_vcf = pd.read_csv('coriell_chr1.vcf', header=None,
                         names=vcf_header_names, sep="\t", comment='#')
    df_vcf = df_vcf.rename(columns={'CHROM': 'Chromosome', 'POS': 'Start'})
    df_vcf['End'] = df_vcf['Start']
    prdf_vcf = pr.PyRanges(df_vcf)

    # We have only 1. chromosome
    prdf_chr1 = prdf[prdf.Chromosome == 'chr1']

    genes = prdf_chr1.geneName.unique()
    counts = len(genes) * [0]

    for idx, gene in enumerate(genes):
        prdf_gene = prdf_chr1[prdf_chr1.geneName == gene]
        intersections = prdf_vcf.intersect(prdf_gene, how='containment')
        if(len(intersections)):
            counts[idx] = len(intersections.Start.unique())

    result = pd.DataFrame({'Gene': genes, 'Count': counts})
    result.to_csv('result.csv', header=None, index=None, sep='\t')
    print(result)


if __name__ == '__main__':
    main()

```

3669

3290

```
MIR6859-1	0
MIR6859-2	0
MIR6859-3	0
MIR6859-4	0
MIR1302-2	0
MIR1302-9	0
MIR1302-10	0
MIR1302-11	0
FAM138A	3
FAM138F	3
FAM138C	3
LOC729737	0
LOC100132287	0
LOC100132062	0
LOC101928626	0
FAM87B	0
LINC00115	0
FAM41C	0
LINC02593	1
CENPS	1
CD5L	1
LOC100288175	0
MIGA1	2
LINC01342	0
(...)
```

W sumie w poszczególnych genach znajduje się 3669 wariantów (z 6050 wariantów dostępnych w pliku `coriell_chr1.vcf`), ale tylko 3290 unikalnych (wartość wyliczona inną wersją skryptu, "na piechotę"). Oznacza to zatem, że współrzędne (Start, End) niektórych genów na siebie nachodzą. 

W `counts[idx] = len(intersections.Start.unique())` są dodawane tylko unikalne warianty z tego względu, że `geneName` nie jest wartością unikalną i w efekcie jeden wariant potrafi zostać zaliczony do kilku przedziałów o tym samym `geneName`. Gdyby zliczać także duplikaty, suma wystąpień wariantów we wszystkich genach wyniosłaby ponad 11 tysięcy, co przekracza prawie dwukrotnie liczbę dostępnych wariantów w pliku `coriell_chr1.vcf`.
