Question:
Convertir les alignements locaux en alignements épissés dans le fichier SAM
aechchiki
2017-08-30 18:24:42 UTC
view on stackexchange narkive permalink

J'ai mappé les lectures d'ARN sur le génome de référence, en utilisant LAST en mode fractionné, et j'ai converti l'alignement MAF en SAM avec maf-convert.

Mon problème est que les transcriptions ne sont pas rapportées de manière épissée, ce qui signifie qu'un transcript_ID est signalé plusieurs fois dans le fichier SAM d'alignement avec un drapeau bit à bit identique dans 2 $ . D'après ce que je comprends, cela est dû au fait que seuls les exons sont mappés (un exon par ligne) et signalés comme des alignements locaux, car le logiciel ne peut pas gérer (encore) la combinaison de modèles d'épissage exon-intron, dont le comportement est clair la ficelle CIGAR.

Pour un exemple plus concret et visuel, considérons le mappage du transcript FBtr0344900 au génome de référence tel que donné par LAST:

  $ cat last_aln .sam | grep FBtr0344900FBtr0344900 0 4 42 774 100 384 = 144H * 0 0 TGCGACATTGTTCTACGATGACTACAAAAAATGACCAATAACTTCTATAAACCAATACGATATGTCAGGAGTTTCGGTCCCATACGAAGTCGCCGACTTAAGTATTTTATttttattttgatATGTGTTTGCTATTTTACCTTGTCGAATGCTTCCACACGCTATGAGAATACCATCGTGAGCGTAGCTTACTACTAGAATTTTGTTGAAGTTATTGACAAGCGATGTCTCAATATCTTCCGGACAGCCTCCAGCGTGACATTGCGGGGAATCATGTAACGGCCCAGTAACAGCCTCGGCCAGCACTCGAAGGTTTTCGTTAAGTTTAAGTATTTTATTTGTAGCACCCGCAAACAAAACATTGTGCATAAAGTCGAAGCTCAT * NM: i: 0 AS: i: 2304FBtr0344900 0 4 43 231 100 384H144 = * 0 0 CTGGAAGCTGTTGATTGAACTGGTATTGATGGCAAGTTAAACTGGGCGACTATGTCATTTAAGGGAGATAACGCCTGAGCCGGCAGTTCTTCAATGCAGTTAACGCAATAATGCTGAGAACCGAGTATGATAATAATACACAGT * NM: i: 0 AS: i: 864  

Et voici le mappage du même transcript FBtr0344900 que celui donné par STAR - logiciel qui rapporte l'alignement comme j'en ai besoin:

  chat star_aln.sam | grep FBtr0344900
FBtr0344900 0 4 42774 255 384M73N144M * 0 * NH: i: 1 HI: i: 1 NM: i: 0 MD: Z: 528  

De la discussion avec l'auteur, il semble que je ne puisse pas obtenir ce dont j'ai besoin directement à partir de la dernière version actuelle, et ce n'est pas un problème technique. Je dois donc modifier moi-même la sortie. Le but serait d'obtenir au moins une ligne CIGAR représentant une transcription complète.

Ma question est la suivante: connaissez-vous un logiciel pour faire cela? Ce dont j'aurais besoin est un fichier contenant une ligne par transcription mappée de manière unique, comportant trois champs: transcript_ID , position de départ et chaîne CIGAR . p>

De mon côté, j'ai procédé comme ceci:

1) extraire les champs dont j'ai besoin pour l'intéressé du fichier SAM:

  $ cut -f1,4,6FBtr0344900 42774384 = 144HFBtr0344900 43231 384H144 =  

2) diviser la ligne CIGAR pour supprimer les éléments qui ne m'intéressent pas - Je simplifie la commande ici, en supposant simplement que je n'ai correspondances parfaites (qui m'intéressent) et hard-clipping (qui ne m'intéressent pas):

  $ cut -f3 | sed 's / H / _ / g' | sed 's / = / = / g' | sed 's / \ w * _ \ s * //' | sed 's / = // g'384144  

3) collez le CIGAR modifié dans le fichier d'origine, avec collez , ce qui donne:

  $ coller (1) (2) | coupe -f1,2,4FBtr0344900 42774 384FBtr0344900 43231144  

4) fusionner les lignes commençant par le même transcript_id :

  $ awk -F '\ t' -v OFS = '\ t' '{x = 1 $; $ 1 = ""; a [x] = a [x] $ 0} END {for (x in a) print x, a [x]} '| FBtr0344900 42774 384 43231 144 

5) calculer le nouveau cigare, en calculant la longueur d'intron comme la formule arithmétique intron_length = (next_exon_start_coordinate - exon_length - previous_exon_start_coordinate) , dans ce cas simple ci-dessus: intron_length = 43231-384-42774

  $ awk '{printf ("% s", $ 1)}; {pour (i = 4; i< = NF; i + = 2) {printf ("% s% d% s% d", OFS, $ (i-1), OFS, $ i - $ (i-1) - $ (i-2))}}; {printf ("% s% d% s% s", OFS, $ NF, OFS, RS)} 'FBtr0344900 384 73 144  

6) idéalement, avec une méthode que je vais comprendre, je vais modifier la chaîne CIGAR (en ajoutant un autre M, N à la fin de chaque champ sauf le premier), voici à quoi le fichier final devrait ressembler:

  FBtr0344900 42774 384M73N144M  

Le problème de mon approche de base est que:

  1. Je ne sais pas comment rendre compte du SAM basé sur 1: dois-je ajouter + 1 à chaque exon_start_coordinate ? Cela ne ressemble pas, car la sortie STAR a exactement la même chaîne de cigare que j'ai calculée sur la sortie STAR.
  2. GRAND problème: Cela ne fonctionnera que pour les lectures mappées dans le brin avant: comment le rendre réalisable avec des lectures mappées dans le brin inverse? Si je garde mon approche actuelle, j'aurai des tailles d'introns négatives ...

Toute suggestion est la bienvenue!

Je vous encourage fortement à ne pas faire cela avec des outils Unix normaux et à coder quelque chose en python (ou dans le langage que vous préférez).
J'utiliserais un aligneur qui produit un SAM approprié, tel que star, gmap, spaln ou minimap2.
oui, je lance déjà le même alignement avec GMAP, STAR. nous soupçonnons que LAST pourrait très bien fonctionner, mais comme pour le moment, la sortie n'est pas directement utile. Je vais essayer minimap2 (c'est bien de savoir que vous pouvez également l'utiliser pour l'ARN)
@user172818 minimap2 fonctionne incroyablement bien ... merci beaucoup de m'avoir redirigé vers lui
Un répondre:
winni2k
2018-11-18 14:35:09 UTC
view on stackexchange narkive permalink

Utilisez simplement minimap2 en mode d'alignement divisé pour réaligner les lectures.

Si ce n'est pas une option, vous pouvez essayer d'utiliser pysam pour modifier les chaînes CIGAR. Je ne le recommande pas, car il existe de nombreuses possibilités de bogues subtils car la spécification SAM est complexe. Vous devrez:

  1. Trier le BAM sur l'ID de lecture afin de pouvoir récupérer efficacement les lectures que vous souhaitez fusionner
  2. Itérer dans le BAM avec pysam lors du chargement de toutes les lectures du même ID de lecture
  3. Pour chaque ensemble de lectures avec le même ID de lecture:
    1. Trier les lectures du même ID de lecture par le nombre de bases écrêtées au début de la chaîne CIGAR.
    2. Construire une nouvelle chaîne CIGAR à partir des chaînes CIGAR ordonnées
    3. Fusionner les balises meta des lectures ordonnées
    4. Ecrire un lecture unique, fusionnée
Je l'ai fait à la fin. À l'époque, je voulais juste reformater les alignements non épissés de LAST (par exemple) en alignements épissés. Pourquoi? Benchmark le plus d'outils possible. Mais ça va, j'ai abandonné à la fin et j'ai juste utilisé des outils qui donnaient déjà cet alignement épissé directement.
C'est génial. Cependant, le but de SE est également d'aider d'autres personnes qui pourraient avoir des problèmes similaires à l'avenir en fournissant des réponses aux questions afin que les utilisateurs puissent voter pour de bonnes réponses. Si vous estimez que ma réponse est bonne à la question que vous avez posée, envisagez de voter et de l’accepter.
Si vous pensez que cette réponse ne répond pas à la question que vous vous posiez réellement, pensez à réécrire votre question pour plus de clarté.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...