Fråga:
How to convert FASTA to BED
SmallChess
2017-05-18 05:14:58 UTC
view on stackexchange narkive permalink

Jag har en FASTA-fil:

  > Sequence_1GCAATGCAAGGAAGTGATGGCGGAAATAGCGTTAGATGTATGTGTAGCGGTCCC ... > Sequence_2GCAATGCAAGGAAGGGGGGGGGGGGGGG BED-fil för varje sekvens som:  
  Sequence_1 0 1500Sequence_2 0 1700  

BED-regionerna kommer helt enkelt att vara storleken på sekvenserna.

F: Jag gjorde det tidigare med ett enradskommando. Jag kommer inte ihåg vad det är, det var på Biostars. Jag kan inte hitta inlägget nu. Vad är det enklaste sättet att göra omvandlingen?

Menar du detta biostars inlägg? https://www.biostars.org/p/15476/
@Greg Inlägget ger mig inte enradskommando för att göra vad jag vill. Jag är 100% säker på att jag såg det någonstans på biostjärnor för ett tag sedan, men jag kommer inte ihåg namnet på programmet som kan göra det.
Vad sägs om den här? https://www.biostars.org/p/15476/#189089
@Greg Det var ett Python-program. Jag kommer inte ihåg namnet och därmed ingen aning om hur jag ska söka.
Skulle vi behöva skapa en ny tagg, kanske något som "formatkonvertering", "filkonvertering"? Som jag förväntar mig kommer det att finnas många fler konverteringar från frågorna "X till Y-format".
Sju svar:
bli
2017-05-18 16:33:24 UTC
view on stackexchange narkive permalink

Du kan göra det enkelt med bioawk, som är en version av awk med tillagda funktioner som underlättar bioinformatik:

  bioawk -c fastx '{print $ name " \ t0 \ t "längd ($ seq)} 'test.fa  

-c fastx säger till programmet att data ska analyseras som fasta- eller fastq-format . Detta gör variablerna $ name och $ seq tillgängliga i awk-kommandon.

Sam Nicholls
2017-05-18 13:40:08 UTC
view on stackexchange narkive permalink

Det är bra praxis att ha din FASTA indexerad så att du kan använda .fai som du sannolikt redan har. Om inte, kan du bara skapa indexet med samtools och använda lite awk för att skapa din BED:

  samtools faidx $ fastaawk 'BEGIN {FS = "\ t"}; {skriv ut $ 1 FS "0" FS $ 2} '$ fasta.fai > $ fasta.bed  

Detta bibehåller flikseparationen men du kan släppa BEGIN uttalandet att använda mellanslag. BED-specifikationen kräver endast "blanksteg" för det enkla BED -formatet.

neilfws
2017-05-18 06:01:14 UTC
view on stackexchange narkive permalink

Du kan anpassa det här awk one-liner. Observera att det antas att sekvens-ID: n inte är längre än 100 tecken och att det inte finns någon beskrivning som följer sekvens-ID: n på rubrikraden.

  cat myseqs.fasta | awk '$ 0 ~ ">" {tryck c; c = 0; printf substr ($ 0,2100) "\ t0 \ t"; } $ 0! ~ ">" {c + = längd ($ 0);} SLUT {print c; } ' 

Annars tillhandahåller alla Bio * -bibliotek (Perl, Python, Ruby) FASTA-format parsers som extraherar sekvens-ID och längder.

Jag skulle påpeka att även om detta liknar BED så är det inte strängt taget, eftersom BED kartlägger till koordinater på en kromosom eller något längre sekvensobjekt.

Scott Gigante
2017-05-18 06:08:32 UTC
view on stackexchange narkive permalink

Inspirerad av detta svar på en relaterad fråga om läslängdsdistributioner kan du göra detta med Biopython:

  från Bio.SeqIO import parsmed öppna ("regioner .bädd "," w ") som säng: för post i parse (" regions.fasta "," fasta "): print (record.id, 0, len (record.seq), sep =" \ t ", fil = säng)  
Jag älskar Python. Jag föredrar det här svaret helt enkelt för att det finns i Python och det är vad vi ska använda 2017. Men varför ser det så mycket ut som Perl? Läsbarhet räknas. Jag ville föreslå ett renare utdrag, men det ser ut som att kommentarer inte tillåter kod. Skulle det anses vara en bra ton att redigera ditt svar?
Jag förstår! Jag har gett det en tur, men du är välkommen att förbättra det. För närvarande finns det ingen på webbplatsen med tillräckligt rykte för att acceptera en redigering. Jag är glad att du föreslår en redigering genom kommentarer, eller redigerar inlägget och väntar tills någon träffar 350 rep. Vi kan radera metakommentarerna efter att redigeringen är klar.
ok! Jag redigerade svaret; verkar som ett StackExchange-y sätt att göra saker trots allt.
Jag älskar också Python, men jag känner att du inte behöver skriva ett manus för att göra något så trivialt som det här - det finns många kommandoradsverktyg som kan göra detta snabbare.
@SamStudio8 På ytnivån håller jag med. Samtidigt, om en person har en Python REPL ständigt öppen (vilket är många människor), har detta minimala omkostnader, och enligt min ödmjuka åsikt bör snabbt algoritmiskt tänkande främjas i detta yrke. Dessutom, om denna konvertering är en del av en Snakemake-pipeline, kan det vara ännu mer naturligt än att ringa shell () eller skriva ett skalblock.
@KirillG Jag har vanligtvis en REPL öppen, men jag tror fortfarande att jag skulle vilja använda "awk" (eller sådant). För flera år sedan var en annan historia, men att lära mig hur man använder grunderna i `awk 'har varit en av de mest produktivitetsförbättrande saker jag har gjort sedan jag bytte till Linux. Men visst, jag håller definitivt med om detta är en del av ett större manus eller pipeline, jag vågar inte kalla "shell". Även om jag antagligen skulle använda `pysam` framför` biopython`, men det är bara personlig preferens :)
@KirillG Jag skrev en BioPython-lösning som förmodligen är mer läsbar / pythonic och inte lägger hela inmatningsfilen i minnet https://bioinformatics.stackexchange.com/a/106/104
@Chris_Rands' svaret är mycket bättre än mitt, snälla uppröst det!
Tack Scott, men med @KirillG's redigera är ditt svar också mer pythoniskt! Men endast nyare versioner av BioPython tillåter en sträng som inmatning för `SeqIO.parse` (snarare än ett filhandtag) och jag tror inte att BioPython någonsin uttryckligen stänger inmatningsfilhandtaget i det här fallet?
Hmm. Bra poäng om Biopython-versionen - Jag har bara testat den senaste versionen på Python 2.7.11 och 3.5.1. Jag var också lite nervös för att stänga filhandtag, men SeqIO.parse returnerar en generator, inte en fil, så skulle den inte automatiskt stänga handtaget när vi når StopIteration? (ansvarsfriskrivning - jag har inget bevis på detta!)
Chris_Rands
2017-05-18 13:04:25 UTC
view on stackexchange narkive permalink

Här är ett tillvägagångssätt med BioPython . Uttrycket med säkerställer att både inmatnings- och utdatafilhandtagen stängs och en lat metod tas så att endast en enda fasta-post hålls i minne åt gången, snarare än att läsa hela filen i minnet, vilket är en dålig idé för stora inmatningsfiler. Lösningen gör inga antaganden om sekvens-ID-längderna eller antalet rader som sekvenserna är spridda över:

  från Bioimport SeqIOwith open ('sequences.fasta') som in_f, open (' sequences.bed ',' w ') som out_f: för post i SeqIO.parse (in_f,' fasta '): out_f.write (' {} \ t0 \ t {} \ n'.format (record.id, len (post)))  
SmallChess
2017-05-19 10:14:21 UTC
view on stackexchange narkive permalink

Vi har många utmärkta svar! Detta kommer att vara en utmärkt referens för framtida användare.

Jag hittade exakt vad jag frågade i min fråga:

https: //www.biostars. org / p / 191052 /

  $ pip install pyfaidx $ faidx --transform bed test.fasta > test.bed  

Detta är det enradiga kommandot jag frågade. De andra svaren fungerar också, men jag vill acceptera mitt eget svar.

Utvecklare av pyfaidx här. Jag var precis på väg att skriva detta svar och beklagade att jag inte valde ett mer uttalbart eller minnesvärt paketnamn.
gringer
2017-05-18 06:04:49 UTC
view on stackexchange narkive permalink

Om FASTA-sekvenserna är på en enda rad, ska följande perl one-liner fungera:

  cat myseqs.fasta | perl -ne 'if (/ ^ > ([^] +) /) {print $ 1} else {print "0", length, "\ n"}'  

Förklaring:

  • Om raden börjar med ett '>', skriv ut allt upp till första mellanslaget (men lägg inte till ett radbryt i slutet) "0", följt av radens längd, följt av en radbrytning


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...