Soru:
FAŞTA'yı BED'e dönüştürme
SmallChess
2017-05-18 05:14:58 UTC
view on stackexchange narkive permalink

Bir FASTA dosyam var:

  > Sequence_1GCAATGCAAGGAAGTGATGGCGGAAATAGCGTTAGATGTATGTGTAGCGGTCCC ... > Sequence_2GCAATGCAAGGAAGTGATGCGGCGAcode  Her dizi için BED dosyası şunun gibi:  
  Sıra_1 0 1500 Sıra_2 0 1700  

YAT bölgeleri basitçe dizilerin boyutu olacaktır.

S: Bunu daha önce tek satırlık bir komutla yaptım. Bunun ne olduğunu hatırlamıyorum, Biostars'taydı. Gönderiyi şimdi bulamıyorum. Dönüşümü yapmanın en basit yolu nedir?

Bu biostars gönderisini mi kastediyorsun? https://www.biostars.org/p/15476/
@Greg Gönderi bana istediğimi yapmam için tek satırlık bir komut vermiyor. Bir süre önce bistarlarda gördüğüme% 100 eminim, ancak bunu yapabilen programın adını hatırlamıyorum.
Peki ya bu? https://www.biostars.org/p/15476/#189089
@Greg Bir Python programıydı. Adı hatırlamıyorum ve bu yüzden nasıl arayacağımı bilmiyorum.
Yeni bir etiket, belki "format-dönüştürme", "dosya-dönüştürme" gibi bir şey oluşturmamız gerekir mi? Beklediğim gibi, "X'ten Y formatına" türü sorular çok daha fazla dönüşecektir.
Yedi yanıtlar:
#1
+13
bli
2017-05-18 16:33:24 UTC
view on stackexchange narkive permalink

Bunu, biyoinformatiği kolaylaştıran ek özelliklere sahip bir awk sürümü olan bioawk ile kolayca yapabilirsiniz:

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

-c fastx programa verilerin fasta veya fastq biçiminde ayrıştırılması gerektiğini söyler . Bu, $ name ve $ seq değişkenlerini awk komutlarında kullanılabilir hale getirir.

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

FASTA ’nızın dizine eklenmesi iyi bir uygulamadır, böylece büyük olasılıkla sahip olduğunuz .fai ’ den yararlanabilirsiniz. Değilse, samtools ile dizini oluşturabilir ve BED:

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

Bu, sekme ayrımını koruyacaktır ancak BEGIN ifadesini bırakabilirsiniz boşluk kullanmak için. BED spesifikasyonu, basit BED biçimi için yalnızca "boşluk" gerektirir.

#3
+6
neilfws
2017-05-18 06:01:14 UTC
view on stackexchange narkive permalink

Bu awk tek satırlık uyarlayabilirsiniz. Sıra kimliklerinin 100 karakterden uzun olmadığını ve başlık satırında sıra kimliğini izleyen hiçbir açıklama olmadığını varsaydığına dikkat edin.

  cat myseqs.fasta | awk '$ 0 ~ ">" {print c; c = 0; printf substr (0,2,100 ABD doları) "\ t0 \ t"; } $ 0! ~ ">" {c + = uzunluk ($ 0);} END {print c; } ' 

Aksi takdirde, herhangi bir Bio * kitaplığı (Perl, Python, Ruby), sıra kimliklerini ve uzunluklarını çıkaran FASTA biçim ayrıştırıcıları sağlar.

Belirtmek istiyorum Bu, BED'e benzese de, kesinlikle değildir, çünkü BED bir kromozom veya daha uzun bir dizi nesnesi üzerindeki koordinatları eşleştirir.

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

Okuma uzunluğu dağılımlarıyla ilgili bir soruya bu yanıttan esinlenerek bunu Biopython ile yapabilirsiniz:

  Bio.SeqIO import parsewith open ("region .bed "," w ") yatak olarak: ayrıştırmada kayıt için (" region.fasta "," fasta "): yazdır (kayıt.id, 0, len (kayıt.seq), sep =" \ t ", dosya = yatak)  
Python'u seviyorum. Bu cevabı sadece Python'da olduğu ve 2017'de kullanmamız gereken şey olduğu için tercih ediyorum. Ama bu neden Perl'e çok benziyor? Okunabilirlik önemlidir. Daha temiz bir snippet önermek istedim, ancak yorumların koda izin vermediği görülüyor. Cevabınızı düzenlemek iyi bir üslup olarak kabul edilir mi?
Alınan nokta! Denedim, ama onu geliştirebilirsin. Şu anda sitede bir düzenlemeyi kabul edecek kadar itibara sahip kimse yok. Yorumlar aracılığıyla bir düzenleme önermekten veya gönderiyi düzenlemekten ve birinin 350 tekrara ulaşmasını beklemekten mutluluk duyuyorum. Düzenleme yapıldıktan sonra meta yorumları silebiliriz.
TAMAM! Cevabı düzenledim; Sonuçta bir şeyler yapmanın bir StackExchange-y yolu gibi görünüyor.
Python'u da seviyorum, ama bunun kadar önemsiz bir şey yapmak için bir komut dosyası yazmanıza gerek yok gibi hissediyorum - bunu daha hızlı bir şekilde gerçekleştirebilecek birçok komut satırı aracı var.
@SamStudio8 Yüzey seviyesinde katılıyorum. Aynı zamanda, bir kişinin sürekli açık bir Python REPL'i varsa (ki bu pek çok insan), bunun minimum ek yükü vardır ve benim mütevazı görüşüme göre, bu meslekte hızlı algoritmik düşünme her zaman teşvik edilmelidir. Dahası, bu dönüşüm bir Snakemake ardışık düzeninin parçasıysa, shell () çağırmaktan veya bir kabuk bloğu yazmaktan daha doğal olabilir.
@KirillG Genelde bir REPL açıkım ama yine de "awk" (veya böyle) kullanmayı tercih ederim. Yıllar önce farklı bir hikâyeydi, ancak "awk" nin temellerini nasıl kullanacağımı öğrenmek, Linux'u kullanmaya başladığımdan beri yaptığım en üretkenliği artıran şeylerden biri oldu. Ama elbette, bu daha büyük bir komut dosyasının veya ardışık düzeninin bir parçasıysa kesinlikle katılıyorum, "kabuk" demeye cesaret edemem. Muhtemelen "biopython" yerine "pysam" kullansam da, bu sadece kişisel tercih :)
@KirillG Muhtemelen daha okunabilir / pythonic olan ve tüm girdi dosyasını belleğe koymayan bir BioPython çözümü yazdım https://bioinformatics.stackexchange.com/a/106/104
@Chris_Rands' cevabı benimkinden çok daha iyi, lütfen ona oy verin!
Teşekkürler Scott, @KirillG's ile cevabınız da daha pitonik olsa da! Bununla birlikte, BioPython'un yalnızca daha yeni sürümleri, "SeqIO.parse" için girdi olarak bir dizeye izin verir (bir dosya tanıtıcısı yerine) ve BioPython'un bu durumda girdi dosyası tutamacını açıkça kapattığını düşünmüyorum?
Hmm. Biopython sürümü hakkında iyi bir nokta - Python 2.7.11 ve 3.5.1'de yalnızca en son sürümü test ettim. Dosya tanıtıcılarını kapatmak konusunda da biraz gergindim, ancak SeqIO.parse bir dosya değil bir jeneratör döndürüyor, bu yüzden StopIteration'a ulaştığımızda tanıtıcıyı otomatik olarak kapatmaz mı? (feragatname - buna dair kanıtım yok!)
#5
+4
Chris_Rands
2017-05-18 13:04:25 UTC
view on stackexchange narkive permalink

İşte BioPython ile bir yaklaşım. with ifadesi, hem girdi hem de çıktı dosyası tutamaçlarının kapatılmasını ve yalnızca tek bir fasta kaydının tutulabilmesi için tembel bir yaklaşımın benimsenmesini sağlar büyük girdi dosyaları için kötü bir fikir olan tüm dosyayı belleğe okumak yerine bir seferde bellek. Çözüm, sekans kimliği uzunlukları veya dizilerin yayıldığı satır sayısı hakkında hiçbir varsayımda bulunmaz:

  in_f, open ('gibi open (' sequences.fasta ') ile Bio import SeqIO'dan sequences.bed ',' w ') out_f olarak: SeqIO.parse'de kayıt için (in_f,' fasta '): out_f.write (' {} \ t0 \ t {} \ n'.format (kayıt.id, len (kayıt)))  
#6
+4
SmallChess
2017-05-19 10:14:21 UTC
view on stackexchange narkive permalink

Pek çok mükemmel cevabımız var! Bu, gelecekteki kullanıcılar için mükemmel bir referans olacak.

Sorumda tam olarak ne sorduğumu buldum:

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

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

Bu, sorduğum tek satırlık komut. Diğer cevaplar da işe yarıyor, ancak kendi cevabımı kabul etmek istiyorum.

Pyfaidx'in geliştiricisi burada. Tam da bu cevabı yazmak üzereydim ve daha telaffuz edilebilir veya akılda kalıcı bir paket adı seçmediğim için üzüldüm.
#7
  0
gringer
2017-05-18 06:04:49 UTC
view on stackexchange narkive permalink

FAŞTA dizilerinin tümü tek bir satır üzerindeyse, aşağıdaki perl tek satırlık çalışmalıdır:

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

Açıklama:

  • Satır '>' ile başlıyorsa, her şeyi ilk boşluğa kadar yazdırın (ancak sonuna satır sonu koymayın)
  • Aksi takdirde, yazdırın "0", ardından satırın uzunluğu ve ardından satır sonu


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...