Kérdés:
Hogyan találhatok azonos szekvenciákat egy FASTA fájlban?
Cleb
2017-11-10 21:28:12 UTC
view on stackexchange narkive permalink

Szeretnék létrehozni egy adatbázist egy proteomikai tanulmányhoz. Ezért az adott szekvenciáról a protein ID-re való leképezésnek egyedinek kell lennie. Kíváncsi vagyok, van-e már beépített funkció a Biopythonban ehhez, de nem találtam ilyet. A duplikált szekvenciák kellene összevonni egyetlen belépési és ott saját ID kell csak összefűzve (lásd a várt eredményt alább).

A következő példa bemenet

  >prot_id_1MAWIGLDISKLFVENSRDAAA>prot_id_2MENVSRIWRYQQRRVLSRAFTHWYLMGLTKHNHPS>prot_id_3MRTRPSRDFHYIVGRITRESPEEKGIFYVFH>prot_id_4MEMVLSSANPSTTFADSYVV>prot_id_5MAWIGLDISKLFVENSRDAAA>prot_id_6MENVSRIWRYQQRRVLSRAFTHWYLMGLTKHNHPS>prot_id_7MAWIGLDISKLFVENSRDAAA  kód> 

Jelenleg a következőképpen csinálom:

  a Bio fájlból importálja a SeqIOimport számot, mint npfrom a Bio fájlból. A Seq importálja a Bio.SeqRecord fájlt a Bio.SeqRecord fájlból a Bio.Alphabet importból IUPAC # Read bejegyzések a szótárba, gi: sequencerecord_dict = SeqIO.to_dict (SeqIO.parse ("test.fasta", "fasta")) # Sorozat kibontása stringrecord_dict = {gi: str (record_dict [gi] .seq) gi számára a record_dict} # Ellenőrizze a duplikált sequencesseq_id_dict = {} k, v értékét a record_dict.items () fájlban: seq_id_dict.setdefault (v, []). addend (k) # Egyszer többször megjelenő szűrőszekvenciákfilter_dict = {seqi: li for seqi, li a seq_id_dict.items () if len (li) > 1} # Azonosítók egyesítése a single onemerged_ids = {"_". join (sorted (li)): seqi for seqi, li in filter_dict.items ()} # Távolítsa el az összes bejegyzést, amely a gi duplikált azonosítóihoz van társítva )):: record_dict.pop (gi, None) # Az összevont azonosítók felvétele ismétrecord_dict.update (merged_ids) # Lista létrehozása a Seq Objectsfinal_seq = [SeqRecord (Seq (seqi, IUPAC.protein), id = gi, name = '' , description = '') a gi-hez, seqi a record_dict.items ()] fájlban kívánt kimenet: 
  >prot_id_4MEMVLSSANPSTTFADSYVV>prot_id_1_prot_id_5_prot_id_7MAWIGLDISKLFVENSRDAAA>prot_id_3MRTRPSRDFHYIVGRITRESPEEKGIFYVFH>prot_id_2_prot_id_6MENVSRIWRYQQRRVLSRAFTHWYLMGLTKHNHPS  

Van egy intelligensebb módon ennek megvalósítására?

Hat válaszokat:
Bioathlete
2017-11-10 21:45:20 UTC
view on stackexchange narkive permalink

A trükk az lenne, ha kicserélnénk a szótár kulcsát, hogy az maga a szekvencia legyen.

Azt is javasolnám, hogy használjon egy másik elválasztót, amely "_", mivel a jelenlegi azonosítóknak ez van, hogy Ön könnyen elkülönítheti az egyes azonosítókat a összefűzött azonosítóktól. Pipát használtam "|" ebben a példában. Szintén csak kézzel írtam a FASTA kimenetet, ahelyett, hogy a Biopython-ot használtam volna rá.

  a Bio importból SeqIOfrom gyűjteményekből import defaultdictdedup_records = defaultdict (lista) a SeqIO.parse ("test.fasta") rekordhoz , "fasta"): # Használja a sorrendet kulcsként, majd adjon meg egy azonosító listát a dedup_records [str (record.seq)] értékként. addend (record.id) with open ("Output.fasta", 'w ') kimenetként: a seq esetében az azonosítók a dedup_records.items () -ben: # Csatlakozzon az azonosítókhoz, és írja ki őket a fasta output.write ("> {} \ n" .format (' | '.join (ids)) fájlba ) output.write (seq + "\ n")  
Igen, ez jól működik és tömörebb, mint az én megoldásom (a "dedup_records" megegyezik a "seq_id_dict" -vel). De igaz, minden további szűrésre nincs szükség; Péntek délután... :)
(Várok egy darabig elfogadással, hogy lássam, van-e már valamiféle beépített eszköz erre)
Nincs olyan beépített funkció, amelyről tudom, hogy az id összefűzné. Ha létezne, valószínűleg ugyanazt a logikát követné el.
Jó megközelítésnek tűnik, ha a fájl memóriába illesztése rendben van, de miért ne használná a biopython-t is az íráshoz? Ez az aszimmetria furcsának tűnik, ráadásul így nem fogja az összes szekvenciát egyetlen sorba dobni
Elsősorban azért, mert a BioPython felületet nehézkesnek találom, ha egy sorozatot ki akarok írni fasta formátumban, amikor az adatok még nem Seq objektumok. @cleb használhatja a Biopython-t, ha azt akarja, hogy a fő változtatások az alapértelmezett parancs használatával történjenek a kicserélt kulccsal.
Úgy látom, még mindig fontolja meg a record.description not record.id használatát annak biztosítása érdekében, hogy megkapja az egész fejlécet. Emellett memóriát is spórolhat, ha a sorozatokat hashként tárolja, nem pedig a teljes sorozatokat
Az OP a protein ID-re hivatkozott, így amit használtam. Egyetértek azzal, hogy a kivonatok hasznosak lehetnek a nagy beviteli mennyiségek kezeléséhez.
@Chris_Rands: Mind hozzáadva a hash megoldást !? Esetemben csak az azonosítókkal rendelkezem, nincs további leírás, de ha részletesebb választ adna hozzá, akkor örömmel voksolom.
@Cleb Azt akartam mondani, hogy nem adtam hozzá hash megoldást, mert trükkös lenne megoldani a hash ütközéseket (bár nagyon ritkák lennének)
@Chris_Rands: Semmi gond, a kifüggesztett megoldások jelenleg elegendőek; csak egy "jól látható" típusú dolog lett volna ...
Cleb
2017-11-13 14:14:38 UTC
view on stackexchange narkive permalink

Csak egy kis variáció a @ Bioathlete válaszához abban az esetben, ha a fasta-t a Biopython segítségével szeretné megírni (pl. nevek és leírás hozzáadásához):

  a Bio-tól import SeqIOfrom Bio.Seq import Seqfrom Bio.SeqRecord import SeqRecordfrom Bio.Alphabet import IUPACfrom gyűjtemények import defaultdictdedup_records = defaultdict (lista) a SeqIO.parse rekordhoz ("test.fasta", "fasta"): # Használja a sorrendet kulcsként és ezután az azonosítók listája legyen a dedup_records [str (record.seq)] érték. append (record.id) # ez létrehoz egy generátort; ha fizikai listára van szüksége, cserélje ki a külső "(", ")" -et "[" és "]" -re, illetve final_seq = (SeqRecord (Seq (seqi, IUPAC.protein), id = "|" .csatlakozzon (gi) , name = "", description = "" a seqi, gi számára a dedup_records.items ()) # write fileSeqIO.write (final_seq, 'test_output_final.fasta', 'fasta')  

Ez adja meg a kívánt kimenet:

  >prot_id_1 | prot_id_5 | prot_id_7MAWIGLDISKLFVENSRDAAA>prot_id_2 | prot_id_6MENVSRIWRYQQRRVLSRAFTHWYLMGLTKHNHPS>prot_id_4MEMVLSSANPSTTFADSYVV>prot_id_3MRTRPSRDFHYIVGRITRESPEEKGIFYVFH  
Azt hiszem, úgy érted, hogy generátort hoz létre, nem iterátort.
@Bioathlete: Természetesen javítva, köszönöm, hogy észrevetted.
Pierre
2017-12-05 19:44:02 UTC
view on stackexchange narkive permalink

a datamash és néhány awk használatával

  $ cat input.fa | paszta - - | \ cut -c2- | sort -t $ '\ t' -k2,2 | \ datamash összeomlás 1 -g 2 | tr "" "_" | \ awk '{printf ( ">% s \ n% s \ n", $ 2, $ 1);}' >prot_id_1_prot_id_5_prot_id_7MAWIGLDISKLFVENSRDAAA>prot_id_4MEMVLSSANPSTTFADSYVV>prot_id_2_prot_id_6MENVSRIWRYQQRRVLSRAFTHWYLMGLTKHNHPS>prot_id_3MRTRPSRDFHYIVGRITRESPEEKGIFYVFH  
Tom
2017-12-05 19:14:46 UTC
view on stackexchange narkive permalink

Ez meglehetősen egyszerűen megtehető az awk használatával is:

awk '{if (NR% 2) {printf ("% s \ t", $ 1)} else {print}} 'fájlnév | sort -k2,2 | awk '{if ($ 2 == SEQ) {gsub (">", "", $ 1); ID = ID "|" $ 1} else {if (SEQ! = "") {printf ("% s \ n% s \ n ", ID, SEQ);} SEQ = $ 2; ID = $ 1;}} END {printf ("% s \ n% s \ n ", ID, SEQ)} '

Az első awk átalakítja a fasta fájlt tabulátorral elválasztott fájlokká, amelynek formátuma ID \ tSequence , amelyet ezután sorrend szerint rendeznek sort szerint. . Az utolsó awk a rendezett fájlon megy keresztül a szekvenciákat nézve: ha az aktuális sor szekvenciája megegyezik az előző soréval, akkor hozzáfűzi azonosítóját az ID változóhoz. Egyébként (vagyis új szekvenciával találkoztunk) kinyomtatja a korábbi összefűzött azonosítókat és a megfelelő szekvenciát.

Eslam Ibrahim
2019-04-18 18:06:16 UTC
view on stackexchange narkive permalink

Itt van az ingyenes programom a Github Sequence database kurator on ( https://github.com/Eslam-Samir-Ragab/Sequence-database-curator)

Ez egy nagyon gyors program, és képes kezelni:

  1. nukleotidszekvenciákat
  2. fehérjeszekvenciákat

működhet operációs rendszerek alatt: / p>

  1. Fasta formátum
  2. Fastq formátum

Üdvözlettel

Hello Eslam, köszönöm a hozzájárulást. Jó lenne, ha beleírnád azt is, hogyan használhatod a programodat annak elérésére, amit az eredeti poszter kért ... Itt próbálunk a lehető legkonkrétabban megjelenni mind a kérés, mind a válaszadás során :-).
Egyetértek az @KamilSJaron:-vel. Kérjük, mutassa meg, hogyan használja csomagját a probléma fentről történő megoldására (ideális esetben ugyanazzal a bemenettel). Ez segít másoknak a kezdésben. Köszönöm!
Paulo Sergio Schlogl
2020-01-20 05:17:46 UTC
view on stackexchange narkive permalink

Ha nagyon nagy fasta fájlja van (60 GB), miért használja a SeqIO.parse fájlt, és a kimeneti fájlt a biopython segítségével írja?

Miért nem használja inkább a SimpleFastaParser programot (kap egy duplát (név, szekvencia) ), és nem kell addig várni, amíg az elemzőt és a Seqrecords-ot használod.

Mit gondolsz róla srácok?

Köszönöm

Paulo

Típusa:

  a Bio.SeqIO.FastaIO fájlból importálja a SimpleFastaParser-t kulcsként, majd adjon meg egy azonosítók listáját a dedup_records [seq]] értékként. addout (név) outputként open (fájlnév, 'w') kimenetként: seq esetén az idup a dedup_records.items () -ben: # Csatlakozzon az azonosítókhoz és írja ki őket a fasta output.write ("> {} \ n" .format ('|' .join (ids))) output.write (seq + "\ n")  


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...