bedtools
Ce que ce cours n'est pas :
Vérifier que vous êtes dans votre espace projet, sous-dossier TP_croisement
pwd
/shared/ifbstor1/projects/2336_nanopore/TP_croisement
data/
et listez en le contenucd data
ls
chrs.len DEgenes.txt hsGRCh38.genes.gff3 picChip.bed variant.vcf
head -n 2 *
==> chrs.len <== 1 248956422 10 133797422 ==> DEgenes.txt <== ENSG00000004846 ENSG00000005981 ==> hsGRCh38.genes.gff3 <== 1 ensembl_havana gene 65419 71585 . + . ID=gene:ENSG00000186092;Name=OR4F5;biotype=protein_coding;description=olfactory receptor family 4 subfamily F member 5 [Source:HGNC Symbol%3BAcc:HGNC:14825];gene_id=ENSG00000186092;logic_name=ensembl_havana_gene;version=6 1 ensembl_havana gene 450703 451697 . - . ID=gene:ENSG00000284733;Name=OR4F29;biotype=protein_coding;description=olfactory receptor family 4 subfamily F member 29 [Source:HGNC Symbol%3BAcc:HGNC:31275];gene_id=ENSG00000284733;logic_name=ensembl_havana_gene;version=1 ==> picChip.bed <== 22 16192349 16192565 region_1 22 16846630 16870710 region_2 ==> variant.vcf <== ##fileformat=VCFv4.0 ##fileDate=20180418
tail -n 2 variant.vcf
Y 26614668 rs376925794 TC T . . RS=376925794;RSPOS=26614671;dbSNPBuildID=138;SSR=0;SAO=0;VP=0x050000000005000002000200;WGT=1;VC=DIV;ASP;CAF=0.9968,0.003244;COMMON=1 Y 26624486 rs771929773 T TA . . RS=771929773;RSPOS=26624486;dbSNPBuildID=144;SSR=0;SAO=0;VP=0x050000000005040024000200;WGT=1;VC=DIV;ASP;VLD;KGPhase3;CAF=0.9968,0.003244;COMMON=1
module load bedtools/2.30.0
Mes gènes différentiellement exprimés contiennent-ils plus de pics de chip qu'attendu ? (oui/non, pas de quantification)
En d'autres termes, y a-t-il plus ou moins de pics de chip-seq dans les gènes différentiellement exprimés par rapport aux gènes non différentiellement exprimés ?
Afficher les 2 premières lignes des fichiers DEgenes.txt
, picChip.bed
et hsGRCh38.genes.gff3
:
head -n 2 DEgenes.txt picChip.bed hsGRCh38.genes.gff3
==> DEgenes.txt <== ENSG00000004846 ENSG00000005981 ==> picChip.bed <== 22 16192349 16192565 region_1 22 16846630 16870710 region_2 ==> hsGRCh38.genes.gff3 <== 1 ensembl_havana gene 65419 71585 . + . ID=gene:ENSG00000186092;Name=OR4F5;biotype=protein_coding;description=olfactory receptor family 4 subfamily F member 5 [Source:HGNC Symbol%3BAcc:HGNC:14825];gene_id=ENSG00000186092;logic_name=ensembl_havana_gene;version=6 1 ensembl_havana gene 450703 451697 . - . ID=gene:ENSG00000284733;Name=OR4F29;biotype=protein_coding;description=olfactory receptor family 4 subfamily F member 29 [Source:HGNC Symbol%3BAcc:HGNC:31275];gene_id=ENSG00000284733;logic_name=ensembl_havana_gene;version=1
DEgenes.txt
est notre liste de gènes DE :
.
picChip.bed
est notre liste de pics issus du chip-seq et positionnés sur le génome :
Pour croiser ces données il faut positionner les gènes DE sur le génome, on fait cela grâce au fichier d'annotation (gènes non DE plus clairs) :
Le positionnement des données sur le génome permet maintenant de les croiser :
Le but sera de compter le nombre gène dans chacune des 4 classes possibles :
grep
) une liste de mots (-f
) contenue dans le fichier DEgenes.txt dans le fichier hsGRCh38.genes.gff3
et rediriger la sortie standard dans un fichier nommé DEgenes.gff3
grep -f DEgenes.txt hsGRCh38.genes.gff3 > DEgenes.gff3
head -n2 DEgenes.gff3
echo "-----"
wc -l DEgenes.txt
wc -l hsGRCh38.genes.gff3
wc -l DEgenes.gff3
1 ensembl_havana gene 33081104 33120530 . + . ID=gene:ENSG00000142920;Name=AZIN2;biotype=protein_coding;description=antizyme inhibitor 2 [Source:HGNC Symbol%3BAcc:HGNC:29957];gene_id=ENSG00000142920;logic_name=ensembl_havana_gene;version=16 1 ensembl_havana gene 70852353 71047808 . - . ID=gene:ENSG00000050628;Name=PTGER3;biotype=protein_coding;description=prostaglandin E receptor 3 [Source:HGNC Symbol%3BAcc:HGNC:9595];gene_id=ENSG00000050628;logic_name=ensembl_havana_gene;version=20 ----- 162 DEgenes.txt 21492 hsGRCh38.genes.gff3 162 DEgenes.gff3
Comme on va utiliser la suite d'outils que propose Bedtools, avant tout, faisons un tour sur la documentation.
Chaque sous-commande fonctionne sur le même principe :
bedtools [sub-command] [options]
Les options varient selon la commande. Il suffit de cliquer sur son nom sur le site pour avoir accès à la fonction de la commande, à ses options et à des exemples.
Les trois qui nous intéresserons dans un premier temps sont intersect
, flank
et closest
Bedtools accepte quasiment tous les formats de fichiers tabulés (GFF3, BED, etc)
Dans notre cas de figure, nous souhaitons savoir si des gènes DE contiennent des pics et obtenir le nom de ces gènes. Nous utilisons donc la sous-commande "bedtools ....." ?
Le fichier A sera celui de l'annotation des gènes DE (DEgenes.gff3
) et le B correspondra aux pics (picChip.bed
). Quelle option choisir pour obtenir uniquement les annotations du fichier A qui croisent avec le fichier B ?
Rediriger la sortie standard dans un fichier nommé intersect_DEgenes_picChip.gff3
bedtools intersect -a DEgenes.gff3 -b picChip.bed -wa -u \
> intersect_DEgenes_picChip.gff3
Nous avons obtenu la liste des gènes dans lesquels se trouvent des pics (intersect_DEgenes_picChip.gff3
). Nous avons maintenant besoin de les compter.
wc -l intersect_DEgenes_picChip.gff3
77 intersect_DEgenes_picChip.gff3
grep -v : Chercher l'inverse d'une liste de gènes dans un texte et rediriger la sortie standard dans un fichier nommé notDEgenes.gff3
On récupère donc tous les gènes dont le nom n'est pas dans la liste des gènes DE.
grep -v -f DEgenes.txt hsGRCh38.genes.gff3 > notDEgenes.gff3
wc -l notDEgenes.gff3
21330 notDEgenes.gff3
Faire l'intersection entre le fichier gff3 des gènes non DE et les pics de Chip-seq et écrire la sortie dans un fichier intersect_notDEgenes_picChip.gff3
bedtools intersect -a notDEgenes.gff3 -b picChip.bed -wa -u \
> intersect_notDEgenes_picChip.gff3
wc -l intersect_notDEgenes_picChip.gff3
9438 intersect_notDEgenes_picChip.gff3
Afin de pouvoir ensuite faire des ratios "nb de gène avec au moins un chevauchements/nb de gène" nous devons connaitre les valeurs suivantes :
wc -l DEgenes.gff3
wc -l intersect_DEgenes_picChip.gff3
wc -l notDEgenes.gff3
wc -l intersect_notDEgenes_picChip.gff3
162 DEgenes.gff3 77 intersect_DEgenes_picChip.gff3 21330 notDEgenes.gff3 9438 intersect_notDEgenes_picChip.gff3
Résumons nos informations :
Ratios | avec pics | sans pic | total |
---|---|---|---|
gene DE | 77 | 162-77 | 162 |
gene non DE | 9438 | 21330-9438 | 21330 |
total | 21492 |
Par simple calcul de pourcentage nous obtenons le tableau suivant :
Ratios | avec pics | sans pic | total |
---|---|---|---|
gene DE | 47.53% | 52.47% | 162 |
gene non DE | 44.24% | 55.76% | 21330 |
total | 21492 |
En conclusion : On peut noter une légère hausse du nombre de pics dans les gènes DE vs non DE.
/!\ En revanche on ne peut pas affirmer ou infirmer que cela soit significatif /!\
tail -n2 DEgenes.gff3 variant.vcf
==> DEgenes.gff3 <== 9 havana gene 133098121 133163914 . - . ID=gene:ENSG00000285245;Name=AL162417.1;biotype=protein_coding;description=novel protein;gene_id=ENSG00000285245;logic_name=havana;version=1 X ensembl_havana gene 71107404 71112108 . - . ID=gene:ENSG00000147168;Name=IL2RG;biotype=protein_coding;description=interleukin 2 receptor subunit gamma [Source:HGNC Symbol%3BAcc:HGNC:6010];gene_id=ENSG00000147168;logic_name=ensembl_havana_gene;version=12 ==> variant.vcf <== Y 26614668 rs376925794 TC T . . RS=376925794;RSPOS=26614671;dbSNPBuildID=138;SSR=0;SAO=0;VP=0x050000000005000002000200;WGT=1;VC=DIV;ASP;CAF=0.9968,0.003244;COMMON=1 Y 26624486 rs771929773 T TA . . RS=771929773;RSPOS=26624486;dbSNPBuildID=144;SSR=0;SAO=0;VP=0x050000000005040024000200;WGT=1;VC=DIV;ASP;VLD;KGPhase3;CAF=0.9968,0.003244;COMMON=1
.
Nous allons avoir besoin d'une autre sous-commande de bedtools : bedtools flank
Regardez bien ses options.
Notons qu'il y a une option obligatoire, -g
pour communiquer à l'outil la taille des chromosomes. Pourquoi ?
Lancer la commande et écrire la sortie standard dans un fichier flank2kDEgenes.gff3
bedtools flank -i DEgenes.gff3 -g chrs.len -l 2000 -r 0 -s \
> flank2kDEgenes.gff3
head -n2 flank2kDEgenes.gff3
1 ensembl_havana gene 33079104 33081103 . + . ID=gene:ENSG00000142920;Name=AZIN2;biotype=protein_coding;description=antizyme inhibitor 2 [Source:HGNC Symbol%3BAcc:HGNC:29957];gene_id=ENSG00000142920;logic_name=ensembl_havana_gene;version=16 1 ensembl_havana gene 71047809 71049808 . - . ID=gene:ENSG00000050628;Name=PTGER3;biotype=protein_coding;description=prostaglandin E receptor 3 [Source:HGNC Symbol%3BAcc:HGNC:9595];gene_id=ENSG00000050628;logic_name=ensembl_havana_gene;version=20
Maintenant, c'est du déjà-vu : Trouver tous les variants chevauchant les régions trouvées précedemment. Renvoyer la sortie standard dans un fichier nommé intersect_flank2kDEgenes_variant.txt
N'oubliez pas de regarder les options qui nous intéressent ici et visualisez les 2 premières lignes du fichier quand celui ci est généré
bedtools intersect -a variant.vcf -b flank2kDEgenes.gff3 -wa -u \
> intersect_flank2kDEgenes_variant.txt
head -n 2 intersect_flank2kDEgenes_variant.txt
echo "-----"
wc -l intersect_flank2kDEgenes_variant.txt
1 33079702 rs10712676 GA G . . RS=10712676;RSPOS=33079703;dbSNPBuildID=137;SSR=0;SAO=0;VP=0x0501000a0005170126000200;GENEINFO=AZIN2:113451|LOC105378635:105378635;WGT=1;VC=DIV;SLO;INT;R5;ASP;VLD;G5A;G5;GNO;KGPhase3;CAF=0.8706,0.1294;COMMON=1;TOPMED=0.96872610856269113,0.03127389143730886 1 74197393 rs201749320 TTC T . . RS=201749320;RSPOS=74197394;dbSNPBuildID=137;SSR=0;SAO=0;VP=0x0500000a000504003e000200;GENEINFO=LRRIQ3:127255|FPGT-TNNI3K:100526835|FPGT:8790;WGT=1;VC=DIV;INT;R5;ASP;VLD;KGPhase1;KGPhase3;CAF=0.9958,0.004193;COMMON=1;TOPMED=0.99698967889908256,0.00301032110091743 ----- 405 intersect_flank2kDEgenes_variant.txt
Pour aller plus loin avec bedtools intersect
, on peut se demander combien y a-t-il de SNP par promoteur ?
Stocker l'information dans un fichier intersect_flanck2kDEgenes_n_variant.txt
et visualiser les 2 premières lignes
bedtools intersect -a flank2kDEgenes.gff3 -b variant.vcf -c \
> intersect_flanck2kDEgenes_n_variant.txt
head -n 2 intersect_flanck2kDEgenes_n_variant.txt
1 ensembl_havana gene 33079104 33081103 . + . ID=gene:ENSG00000142920;Name=AZIN2;biotype=protein_coding;description=antizyme inhibitor 2 [Source:HGNC Symbol%3BAcc:HGNC:29957];gene_id=ENSG00000142920;logic_name=ensembl_havana_gene;version=16 1 1 ensembl_havana gene 71047809 71049808 . - . ID=gene:ENSG00000050628;Name=PTGER3;biotype=protein_coding;description=prostaglandin E receptor 3 [Source:HGNC Symbol%3BAcc:HGNC:9595];gene_id=ENSG00000050628;logic_name=ensembl_havana_gene;version=20 0
Quels sont les gènes différentiellement exprimés les plus proches des pics ChIP ET qui contiennent une mutation ?
Afficher les 2 dernières lignes des fichiers DEgenes.gff3
, variant.vcf
et picChip.bed
:
tail -n2 DEgenes.gff3 variant.vcf picChip.bed
==> DEgenes.gff3 <== 9 havana gene 133098121 133163914 . - . ID=gene:ENSG00000285245;Name=AL162417.1;biotype=protein_coding;description=novel protein;gene_id=ENSG00000285245;logic_name=havana;version=1 X ensembl_havana gene 71107404 71112108 . - . ID=gene:ENSG00000147168;Name=IL2RG;biotype=protein_coding;description=interleukin 2 receptor subunit gamma [Source:HGNC Symbol%3BAcc:HGNC:6010];gene_id=ENSG00000147168;logic_name=ensembl_havana_gene;version=12 ==> variant.vcf <== Y 26614668 rs376925794 TC T . . RS=376925794;RSPOS=26614671;dbSNPBuildID=138;SSR=0;SAO=0;VP=0x050000000005000002000200;WGT=1;VC=DIV;ASP;CAF=0.9968,0.003244;COMMON=1 Y 26624486 rs771929773 T TA . . RS=771929773;RSPOS=26624486;dbSNPBuildID=144;SSR=0;SAO=0;VP=0x050000000005040024000200;WGT=1;VC=DIV;ASP;VLD;KGPhase3;CAF=0.9968,0.003244;COMMON=1 ==> picChip.bed <== 18 78005736 78005857 region_52421 18 78016442 78016675 region_52422
Rien de neuf sous le soleil, nous stockons l'output dans un fichier picVariant.bed
.
bedtools intersect -a picChip.bed -b variant.vcf -u > picVariant.bed
L'option -u permet de garder l'ensemble de l'information des pics sans ajouter celle des variants
head -n 5 picVariant.bed
22 16846630 16870710 region_2 22 17070620 17114004 region_4 22 17128021 17136091 region_5 22 17147545 17173488 region_6 22 17192673 17206732 region_7
Nous avons besoin d'une nouvelle sous-commande : bedtools closest
Attention, bien prendre note du message suivant :
L'output est à stocker dans un fichier nommé picVariant_sorted.bed
sort -k1,1 -k2,2n picVariant.bed > picVariant_sorted.bed
Nous tentons un essai en paramètre par défaut. Rediriger la sortie dans un fichier DEgenes_closest_picVariant.bed
bedtools closest -a picVariant_sorted.bed -b DEgenes.gff3 \
> DEgenes_closest_picVariant.bed
Et si on prenait en compte le brin ?
bedtools closest -a picVariant_sorted.bed -b DEgenes.gff3 -s \
> DEgenes_closest_picVariant.bed
Compter le nombre de lignes
wc -l DEgenes_closest_picVariant.bed
28080 DEgenes_closest_picVariant.bed
Ce dernier bonus est l'occasion de voir des commandes qui peuvent être utiles mais que nous n'avons pas pu aborder précédemment
.DEgenes_all.gff3
(ls -la
pour le voir). Voici comment récupérer uniquement les annotations de gènes :awk 'BEGIN {OFS=FS="\t"} $3 == "gene" {print}' ".DEgenes_all.gff3" \
> DEgenes.gff3
FS
et OFS
: Permettent de définir le séparateur de champ du fichier$3 == "gene"
: Permet de vérifier si la colonne 3 est une annotation de gèneprint
: Imprime à l'écran la ligne quand la condition est vraieintersect_flanck2kDEgenes_n_variant.txt
contient le nombre de variants par promoteur. Comment s'assurer que nous avons bien pris en compte les 405 variants initialement trouvés en bonus 1 ?awk -F '\t' 'BEGIN{s=0}{s+=$NF}END{print s}' \
intersect_flanck2kDEgenes_n_variant.txt
405
-F
: Permet de définir le séparateur de champ dans l'inputs=0
: Initialisation d'une variable s qui vaut 0 avant de lire le fichiers+=$NF
: Pour chaque ligne, on ajoute la valeur de la dernière colonne à la somme sprint s
: Une fois l'ensemble du fichier parcouru, on imprime la dernière valeur de la somme sDans l'exercice, point D, on utilise grep -v
pour extraire les coordonnées génomiques des gènes non DE.
Il était aussi possible de le faire avec la commande intersect
.
Trouverez vous comment ?
Attention aux options !
bedtools intersect -a hsGRCh38.genes.gff3 -b DEgenes.gff3 \
-v -f 1 -F 1 -s -wa > notDEgenes.gff3
wc -l notDEgenes.gff3
21492 notDEgenes.gff3
L'option la plus importante pour cette question est donc l'option -v
.
Mais par défaut, intersect
valide une intersection dès qu'il y a une base en commun entre les 2 régions. Dans ce cas d'usage où l'on traite des gènes en entier, il suffit que quelques gènes se chevauchent pour qu'ils soient exclus à tort. La façon correcte est donc de préciser que l'on veut valider les chevauchements que si les gènes se chevauchent à 100% entre eux. Les options pour spécifier un % de chavauchement (exprimés entre [0-1]
, 1 pour 100%) sont -F
pour le fichier A et -f
pour le fichier B. Il faut aussi que les 2 gènes soient sur le même brin (option -s
).