Comment DeepVariant construit-il des images RVB à partir de séquences d'ADN ?

Aug 19 2020

DeepVariant est un pipeline permettant d'appeler des variants génétiques à partir de données de séquençage d'ADN.

Une étape majeure, avant d'alimenter le CNN, est de traduire ces séquences d'ADN en images. On ne sait pas pourquoi et comment Google construit les images RVB à partir des données ADN. De toute évidence, l'ADN est une chaîne sur un alphabet avec les caractères : {A, T, C, G}.

Il est même difficile de comprendre comment fonctionne le mapping en se basant sur le code source de leurs tests unitaires .

Dans leur figure du papier : A est rouge, C est vert, G est bleu et T est jaune (G+R), mais on ne sait toujours pas comment ils construisent l' 3xNxNimage.


EDIT du blog de Google :

Dans cet article, nous allons montrer les six canaux d'affilée, mais dans DeepVariant, ils sont codés en six couches dans la troisième dimension, donnant à chaque tenseur une forme de (100, 221, 6) correspondant à (hauteur, largeur, canaux). La variante en question est toujours au centre de chaque image pileup, ici marquée d'un petit trait en haut.

Les canaux sont affichés en niveaux de gris ci-dessous dans l'ordre suivant :

Base de lecture : différentes intensités représentent A, C, G et T.

Qualité de la base : définie par la machine de séquençage. Le blanc est de meilleure qualité.

Qualité de mappage : définie par l'aligneur. Le blanc est de meilleure qualité.

Brin d'alignement : Noir est en avant ; le blanc est inversé.

La lecture prend en charge la variante : le blanc signifie que la lecture prend en charge l'allèle alternatif donné, le gris signifie que ce n'est pas le cas.

La base diffère de la réf : Blanc signifie que la base est différente de la référence, gris foncé signifie que la base correspond à la référence.

Réponses

1 SmallChess Aug 26 2020 at 07:03

En fait, le journal a clairement expliqué comment ils l'ont fait. Il vous suffit de lire les documents supplémentaires de plus près.

Dans leur figure du papier : A est rouge, C est vert, G est bleu et T est jaune (G+R), mais on ne sait toujours pas comment ils ont l'image 3xNxN.

En RVB, chaque dimension est une image NxN. Puisque vous avez trois dimensions, c'est donc 3xNxN. La dimension rouge a été utilisée pour coder les bases nucléotidiques. La dimension verte a été utilisée pour coder les scores de qualité. Enfin, la dimension bleue a été utilisée pour coder les informations sur le brin.

De toute évidence, l'ADN est une chaîne sur un alphabet avec les caractères : {A, T, C, G}.

C'est facile. Beaucoup de façons. Vous pouvez faire un encodage one-hot ou ce que DeepVariant a utilisé :

def get_base_color(base):
    base_to_color = {'A': 250, 'G': 180, 'T': 100, 'C': 30}
    return base_to_color.get(base, 0)
0x90 Aug 23 2020 at 22:48

Sur la base du matériel supplémentaire mentionné dans un commentaire de Devon Ryan :

La deuxième phase de DeepVariant encode la référence et le support de lecture pour chaque variante candidate dans une image RVB. Le pseudo-code de ce composant est présenté ci-dessous ; il contient toutes les opérations clés pour construire l'image, en laissant de côté pour plus de clarté la gestion des erreurs, le code pour traiter les cas extrêmes comme lorsque des variants se produisent près du début ou de la fin du chromosome, et la mise en œuvre de non essentiels et/ou évidents les fonctions.

Voici la fonction principale

WIDTH = 221
HEIGHT = 100;
def create_pileup_images(candidate_variants):
 for candidate in candidate_variants:
 for biallelic_variant in split_into_biallelics(candidate):
 start = biallelic_variant.start - (WIDTH-1) / 2
 end = WIDTH - span_start
 ref_bases = reference.get_bases(start, end)
 image = Image(WIDTH, HEIGHT)
 row_i = fill_reference_pixels(ref, image)
 for read in reads.get_overlapping(start, end):
 if row_i < HEIGHT and is_usable_read(read):
 add_read(image, read, row_i)
 row_i += 1
 yield image

def fill_reference_pixels(ref, image):
 for row in range(5):
 for col in range(WIDTH):
 alpha = 0.4
 ref_base = ref[col]
 red = get_base_color(ref_base)
 green = get_quality_color(60) # The reference is high quality
 blue = get_strand_color(True) # The reference is on the positive strand
 image[row, col] = make_pixel(red, green, blue, alpha)
 return 5