# [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`.