Qu'est-ce qu'un site d'initiation de la transcription ?

Comment je me suis posé la question.

Chez les euca­ryotes, l'ADN est orga­ni­sé en domaines plus ou moins com­pac­tés, avec des taux de trans­crip­tion plus ou moins éle­vés, et qui sont mar­qués dif­fé­ren­tiel­le­ment par un cer­tain nombre de marques épi­gé­né­tiques (méthy­la­tion de l'ADN, modi­fi­ca­tions post-tra­duc­tion­nelles des his­tones, variants d'histones, etc.). Il est fré­quent d'essayer de cor­ré­ler le niveau d'expression des gènes avec la pré­sence ou l'absence d'une marque épi­gé­né­tique à proxi­mi­té des sites d’initiations de la trans­crip­tion (rac­cour­cis en TSS, pour trans­crip­tion start sites). Par exemple, pour reprendre la carte de cha­leur de la figure 1C de l'article pré­sen­tant la suite d'outils deepTools2 :

Exemple de pile de profil epigénétiques centrés sur les sites d'initiations de la transcription.
Figure 1C issue de l'article pré­sen­tant la suite d'outils deepTools2. Piles de pro­fils épi­gé­né­tiques H3K4me3, H3K27me3 et H3K36me3 (tri-méthy­la­tions des lysines 4, 27 et 36 des his­tones 3) cen­trés sur les TSS, répar­ti par clus­te­ring en un groupe actif et un groupe inac­tif.

Pour géné­rer ce type de figures, il est néces­saire d'être en pos­ses­sion d'une liste de sites d’initiation de la trans­crip­tion. Et donc, de se poser cette ques­tion fon­da­men­tale :

Qu'est-ce qu'un site d’initiation de la transcription ?

La défi­ni­tion est tri­viale : un site d'initiation de la trans­crip­tion désigne une posi­tion géno­mique où le pro­ces­sus de trans­crip­tion (syn­thèse d'un ARN depuis une matrice d'ADN) s'initie. En géné­ral, il est sur­tout fait réfé­rence aux sites d'initiations de la trans­crip­tion des gènes, et/​ou d'éléments trans­po­sables. Sou­vent l'ARN pro­duit est coif­fé au niveau de la base cor­res­pon­dante au site d'initiation de la trans­crip­tion. Il ne faut pas confondre le site d’initiation de la trans­crip­tion avec le site d'initiation de la tra­duc­tion : les deux étant sépa­rés sur les ARN mes­sa­gers par la région 5' non tra­duite (ou 5' untrans­la­ted region, 5'UTR).

Structure des gènes eukaryotes
Struc­ture des gènes euca­ryotes (tra­duit d'après une image Wiki­me­dia Com­mons CC BY 4.0). TSS : site d'initiation de la trans­crip­tion (Trans­crip­tion Start Site).

Petite sub­ti­li­té : si la pre­mière base trans­crite se désigne par le "+1" de trans­crip­tion, la base la pré­cé­dant sur le brin d'ADN est par conven­tion appe­lée le "-1" de trans­crip­tion, donc sans base "0" de trans­crip­tion.

Comment identifier les sites d'initiations de la transcription ?

Je connais prin­ci­pa­le­ment deux méthodes expé­ri­men­tales d'identification de ces sites. Sans ren­trer dans les détails :

  • la labo­rieuse méthode d'extension d'amorces, à faible débit.
  • la plus récente méthode CAGE, pour Cap Ana­ly­sis Gene Expres­sion, un acro­nyme dési­gnant un pro­ces­sus de cap­ture des extré­mi­tés coif­fées des ARN, sui­vi de leur séquen­çage haut débit. C'est cette méthode qui a été pri­vi­lé­giée par le for­mi­dable consor­tium Fantom5.

Les deux approches ont leurs limites. Outre la dif­fé­rence évi­dente de débit, citons le fort taux de décro­chage des trans­crip­tases inverses, fac­teur limi­tant de la méthode d'extension d'amorce, mais aus­si la com­plexi­té du pro­to­cole expé­ri­men­tal du CAGE, ain­si que son inca­pa­ci­té à détec­ter les sites d'initiations non coif­fés au niveau des ARNs.

Oui, ça OK, mais on la télécharge où la liste des TSS ?

Je recon­nais bien là votre prag­ma­tisme de bio­in­for­ma­ti­ciens. Pour nous, nul besoin de réflexions bio-phi­lo­so­phiques pous­sées : un gène, c'est ce qui est pré­sent dans notre fichier d'annotation des gènes, et cette approche nous convient la plu­part du temps ! Et les sites d'initiations de la trans­crip­tion se trouvent au début des gènes.

(Ouvrons une paren­thèse tout de même, pour rap­pe­ler qu'il est indis­pen­sable de bien connaître les limites actuelles de ces anno­ta­tions. Ain­si, si l'humain a envi­ron 20 000 ARN longs non-codants (lncR­NA) et l’opos­sum seule­ment 8 000, ce n'est sans doute pas que nos 12 000 lncR­NA de plus nous rendent supé­rieu­re­ment intel­li­gents, mais plu­tôt que de nom­breux lncR­NA ne sont pas encore iden­ti­fiés chez l'opossum !)

Pour les espèces sur les­quelles j'ai le plus tra­vaillé (humain, sou­ris), la source de réfé­rence des anno­ta­tions des gènes est l'organisation GENCODE, dont les anno­ta­tions sont uti­li­sées par Ensem­bl.

Mais, et c'est là où je vou­lais en venir en com­men­çant cet article : avec l'amélioration des anno­ta­tions, les modèles de gènes com­portent de plus en plus de trans­crits dif­fé­rents. Pre­nons par exemple le cas du gène BRCA1 (pour BReast CAn­cer 1, un gène connu pour son impli­ca­tion dans les can­cers du sein et de l'ovaire).

Où est le TSS de BRCA1 ?

Regar­dons à quoi res­semble les modèles de trans­crits du gène BRCA1 dans la ver­sion actuelle des anno­ta­tions Gen­code (la 27). C'est un gène situé sur le brin moins, son début est donc sur la droite, et il est trans­crit vers la gauche. D'après l'image Ensem­bl :

Vu Ensembl du gène BRCA1 dans le génome humain.
Vu Ensem­bl du gène BRCA1 dans le génome humain.

J'ai dénom­bré à l’œil 30 trans­crits dif­fé­rents, aux­quels cor­res­pondent 7 sites d'initiation de la trans­crip­tion dif­fé­rents !

Sites d'initiations de la transcription du gènes BRCA1, annotés à l'aide de gracieuses flèches oranges dedans et marron autour.
Les sept sites d'initiations de la trans­crip­tion du gène BRCA1, anno­tés à l'aide de gra­cieuses flèches orange dedans et mar­ron autour.

Une approche pos­sible pour­rait être de gar­der chaque site d'initiation de chaque trans­crit pour nos figures, mais cela abou­tit à une explo­sion du nombre de TSS : 200 401 dans la ver­sion 27 humaine de GENCODE ! Une autre approche serait de gar­der uni­que­ment les sites d'initiation uniques, soit envi­ron 7 pour BRCA1. Mais c'est alors faire peser autant un TSS uti­li­sé par des dizaines de modèles de trans­crits avec des TSS alter­na­tifs uti­li­sés par de rares trans­crits alter­na­tifs. L'approche favo­rite des bio­in­for­ma­ti­ciens est donc assez sou­vent de ne gar­der qu'un seul site d’initiation de la trans­crip­tion par gène.

Par faci­li­té, cer­tains s'en sortent en ne gar­dant que les lignes de type "gene" dans le fichier d'annotation GENCODE (pour plus de détails, voir par exemple cet article). Une ligne par gène, un seul TSS, pro­blème réso­lu !

Or la ligne gene de GENCODE part du nucléo­tide le plus en amont par­mi tous les trans­crit  jusqu'au nucléo­tide le plus en aval par­mi tout les trans­crits (pas néces­sai­re­ment dans le même trans­crit, d'ailleurs), ce qui nous fera un TSS de BRCA1 ici :

Position du TSS de BRCA1 d'après la ligne "gene" des annotation GENCODE.
Posi­tion du TSS de BRCA1 d'après la ligne "gene" des anno­ta­tions GENCODE.

Alors qu'intuitivement, en sui­vant une règle majo­ri­taire, j'aurais plu­tôt ten­dance à pri­vi­lé­gier ce site d'initiation là :

Le principal TSS de BRCA1, d'après votre serviteur.
Le prin­ci­pal TSS de BRCA1, d'après votre ser­vi­teur.

Uti­li­ser les lignes "gene" de fichier d'annotation GENCODE pour obte­nir une liste d'un unique site d'initiation de la trans­crip­tion par gène me semble donc assez mal­adroit pour un nombre impor­tant de gènes.

Pour ma part, je prends plu­tôt le site d'initiation médian de tout les trans­crits d'un gène, excluant ain­si les quelques trans­crits sus­pi­cieux com­men­çant soit très tôt, soit très tard. Dans les cas où il y a un nombre pair de trans­crit, je ne prends pas la moyenne des coor­don­nées des deux TSS du milieu, mais bien l'un des deux (en l’occurrence, le TSS du pre­mier des deux "trans­crits du milieu").

Voi­ci par exemple le petit script R que je me suis fait, qui part du fichier GFF3 four­nit par GENCODE (pour plus de détails, voir cet article), et retourne un fichier .bed d'un unique TSS par gène. Le script n'est pas des plus rapides mal­heu­reu­se­ment, mais je n'ai à le faire tour­ner qu'une seule fois par fichier d'annotation.

library(rtracklayer)
library(tidyverse)

# l'import peu prendre 2 minutes en fonction de votre configuration
gencode <- import("gencode.v27.annotation.gff3.gz", format = "GFF") %>%
# import() retourne un objet GRanges, nous le convertissons en tibble
as_tibble

transcript <- filter(gencode, type == "transcript")

# fonction retournant le transcrit du milieu parmi tous les transcrits du gène 'gene'
getMiddleLineFor <- function(gene) {
tempt <- dplyr::filter(transcript, gene_id == gene)
if(tempt$strand[1] == "+") {
# si le gène est '+', le TSS est au 'start'
tempt <- dplyr::arrange(tempt, start)
} else if(tempt$strand[1] == "-") {
# si le gène est '-', le TSS est au 'end'
tempt <- dplyr::arrange(tempt, end)
}
# retourne la ligne du mileur
dplyr::slice(tempt, ceiling(nrow(tempt)/2))
}

# puis j'applique la fonction à tous les gènes
# environ 20 minutes...
midTranscript <- map_dfr(
unique(transcript$gene_id),
getMiddleLineFor
)

write.table(
select(midTranscript, seqnames, start, end, gene_id,level, strand, gene_type, gene_name),
file = "gencode.v27.annotation.middleTSStranscript.bed",
quote = FALSE, row.names = FALSE, col.names = FALSE, sep = "\t"
)

Si je ne veux que la position des TSS et pas le start et le end du transcrit du milieu, je rajoute cette étape :

mutate(
midTranscript,
start = if_else(strand == "+", start, end - 1L),
end = if_else(strand == "+", start + 1L, end)
)

La fonction est facilement adaptable lorsqu'on en souhaite non pas le site d'initiation de la transcription du milieu, mais le site de terminaison de la transcription du milieu !

Après intense réflexion, au lieu de prendre le TSS médian, il pourrait être judicieux de retenir le mode des TSS des transcrits d'un gène ? Il faut cependant une implémentation maline qui traite judicieusement les cas où il y a autant de TSS différents que de transcrits...

Pour aller plus loin

Je vous ai donc proposé une méthode simple pour sélectionner un seul site d'initiation de la transcription par gène. Il est fort probable que pour un certain nombre de gènes, le site d'initiation "majoritaire" soit variable en fonction du tissu : tel TSS sera favorisé dans un type cellulaire, mais un autre TSS le sera dans un autre tissu. Une autre méthode, beaucoup plus lourde, mais plus maline, pourrait donc consister à identifier le TSS majoritaire de vos types cellulaires d’intérêts d'après les données CAGE du consortium Fantom5 (du moins, pour l'humain et la souris).

Une des découvertes de ce consortium a d'ailleurs été que l'idée d'un site d'initiation de la transcription bien défini n'était sans doute pas valide pour tous les gènes. Les promoteurs riches en CpG auraient plutôt une "zone" diffuse d'initiation de la transcription [1].

Enfin, si l'on s’embête tant avec ces histoires de TSS unique par gène, c'est que bien souvent nous ne possédons une mesure d'expression qu'au niveau du gène. Mais les progrès techniques et algorithmiques en RNA-seq font que la quantification au niveau des transcrits directement est de plus en plus fiable [2]. Raisonner avec des transcrits permet d'éviter tous ces détours méthodologiques à la recherche de la "bonne liste" des TSS.

Remerciements

Un grand merci à mes relectrices et relecteurs : Clémence, Nisaea, Yoann M. et Gwenaelle !

Références :

[1] A promoter-level mammalian expression atlas. FANTOM Consortium and the RIKEN PMI and CLST (DGT). DOI: 10.1038/nature13182

[2] Gene-level differential analysis at transcript-level resolution. Lynn Yi, Harold Pimentel, Nicolas L. Bray, Lior Pachter. DOI: 10.1101/190199



Pour continuer la lecture :


Commentaires

2 réponses à “Qu'est-ce qu'un site d'initiation de la transcription ?”

  1. Yop !

    J'ajoute une petite infor­ma­tion com­plé­men­taire : Récem­ment chez E.coli les TSS ont pu être map­pés, et les résul­tats sont dis­po­nibles sur ce site : https://​science​.nichd​.nih​.gov/​c​o​n​f​l​u​e​n​c​e​/​d​i​s​p​l​a​y​/​s​e​g​r​/​G​e​n​o​m​e​+​B​r​o​w​ser

    Et l'article est dis­po­nible ici : https://​www​.ncbi​.nlm​.nih​.gov/​p​u​b​m​e​d​/​2​5​2​6​6​388

    Force & hon­neur \o

  2. Avatar de lelouar
    lelouar

    Salut,

    j'ai vou­lu essayer de faire une ver­sion avec data table. Le cal­cul prend en moins de 20 sec (18.6 sec pour lire le fichier GENCODE et 0.9 sec pour créer le fichier .bed):

    library(data.table)

    Lec­ture du fichier (en sup­pri­mant les lignes com­men­çant par #)

    gen­code <- fread("zcat ~/commun/ref/hg38/annotations/gencode.v27.annotation.gff3.gz | grep ‑v '^#'")

    fil­trer les lignes trans­cript

    gencode.transcript <- gencode[V3 == "trans­cript"]

    crée la colonne gene_​id column en uti­li­sant une expres­sion regu­lière

    gencode.transcript[, gene_​id := sub(".gene_​id=([^;]+).", "\1", V9)]

    Selec­tionne et renomme les colonnes d'interêt

    gencode.transcript <- gencode.transcript[, .(seq­names = V1, start = V4, end = V4, strand = V7, gene_​id)]

    On compte les posi­tions (start et end) par genes

    gencode.transcript.start <- gencode.transcript[, .N, by = .(seq­names, start, gene_​id)]
    gencode.transcript.end <- gencode.transcript[, .N, by = .(seq­names, end, gene_​id)]

    Fonc­tion qui sélec­tionne les start et end par gènes (tous les gènes d'un coup)

    get­MaxOr­Midd­le­Trans­cript <- function(DT, posi­tion){
    # Sélec­tion­ner la posi­tion avec le max de trans­cript et ordon­ner par posi­tion
    DT[, test := N == max(N), by = gene_​id]
    DT <- DT[test == T, ][order(seqnames, eval(parse(text = posi­tion)))]

    # Selec­tionne le trans­cript du milieu
    DT[, nb := .N, gene_​id]
    DT[, select := ceiling(nb/2)]
    DT[, count := 1:.N, gene_​id]
    DT[, test := select == count, gene_​id]
    DT <- DT[test == T, .(seq­names, eval(parse(text = posi­tion)), gene_​id)]
    setnames(DT, "V2", posi­tion)

    return(DT)
    }

    On lance la com­mande pour le start et le end

    gencode.transcript.start <- getMaxOrMiddleTranscript(gencode.transcript.start, "start")
    gencode.transcript.end <- getMaxOrMiddleTranscript(gencode.transcript.end, "end")

    On récu­père le strand des trans­cripts

    gencode.transcript.strand <- unique(gencode.transcript[,.(gene_id, strand)])

    On génère les clé pour fusion­ner les 3 tables

    setkey(gencode.transcript.start, gene_​id)
    setkey(gencode.transcript.end, gene_​id)
    setkey(gencode.transcript.strand, gene_​id)

    on fusionne les tables pour géné­rer le fichier bed

    mid­Trans­cript <- gencode.transcript.start[gencode.transcript.end][gencode.transcript.strand]

    fwrite(
    mid­Trans­cript[, .(seq­names, start, end, gene_​id, 0, strand)],
    file = "gencode.v27.annotation.middleTSStranscript.bed",
    quote = FALSE, col.names = FALSE, sep = "\t"
    )

    Voi­là.

    Qu'en pense tu ? Je me demande com­ment tu fait pour sélec­tion­ner le max d’occurrence dans ta fonc­tion.

    ++

Laisser un commentaire