Comment DeepVariant construit-il des images RVB à partir de séquences d'ADN ?
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' 3xNxN
image.
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
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)
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