Küsimus:
Rekonstrueeritud joonduse genereerimine BAM-ist
ShanZhengYang
2018-03-01 10:07:12 UTC
view on stackexchange narkive permalink

Mul on (väike) BAM-fail CIGAR ja MD väljadega.

1. küsimus: millised tööriistad on Pythonis ja / või R-is olemas, et rekonstrueerida viite ja loetud viimist BAM-is? Arvestades, et see on väga tavapärane analüüs, arvan, et peaks olema R-pakette või Pythoni teeke, millel on funktsioonid, mis seda ülesannet BAM-sisendiga teevad ...

Minu eesmärk oli luua * tsv-fail kahe veeruga, millest üks on rekonstrueeritud joondusega ja teine ​​vastava järjestusega. See oleks minu analüüsis kasulik. (Ma kasutaksin Pythonis kas R data.table-i või pandasid.)

Siit on lugeda ja viidata:

  CGGGCCGGTCCCCCCCCGCCGGGTCCGCCCCCCGGC |||||||||| |||||| |||||||||||||||| CGGGCCGGTCCCCCCC-GCCGGGTCCGCCCCCGGG  

Siin on soovitud väljundandmete kaader (ainult ühe näitereaga). Võiksime kasutada R data.table / data.frame või pandas DataFrame. Veerg 1 on joondused (s.o CIGAR- ja MD-stringidel põhineva võrdluse ja loetu vahelise joonduse rekonstrueerimine), veerg 2 on vastavad järjestused. :

  ReadAligned Reference CGGGCCGGTCCCCCCC-GCCGGGTCCGCCCCCGGG CGGGCCGGTCCCCCCCCCCGGCCGGGTCCGCCCCCGGC ... ....  
sigar või pysam sigari parsimisfunktsioonid
Kas saaksite oma küsimust täpsustada: kas soovite joondusi maatriksisse salvestada? Või CIGAR-vormingus maatriksis?
@Llopis Kahe veeruga tsv / csv-fail: esimeses veerus on joondused, teises veerus on järjestus. Kas see on loogiline?
Kas soovite, et sam2pairwise genereeriks teie jaoks joondused või soovite ise sigariskeeli sõeluda R / pythonis? Sigariparsaatori kirjutamine on tüütu, kuid sellega saab hakkama. Võib olla lihtsam, kui kasutate iga lugemise joonduste väljaandmiseks lihtsalt sam2pairwise, siis sõelute selle tabelisse.
Nüüd on teie küsimus vähendatud sigari "kuidas lugeda sisestuste ja kustutuste arvu", mis on palju lihtsam. Perli puhul on see lihtsalt ühe liiniga kaja 78M2I10M5D30M | perl -ne 's / (\ d +) ([ID]) / $ h {$ 2} + = $ 1 / nt; printige "$ h {I} \ t $ h {D} \ n" "". Keegi postitab tõenäoliselt pythoni vastused.
@user172818 Olen proovinud seda muuta täpsemaks. Kas see on rohkem organiseeritud? Teine probleem on lihtsam; Mind motiveerib eelkõige esimene probleem, mis on seotud.
Kolm vastused:
heathobrien
2018-03-02 00:42:45 UTC
view on stackexchange narkive permalink

Kui soovite vaid sisestuste / kustutuste arvu, saate selle teabe väljavõtmiseks kasutada seda:

  sigari impordist Cigarc = c = Sigar ( '20M5I10M3I5M') num_insertions = len (loend (filter (lambda x: x [1] == 'I', c.items ()))) insert_length = summa ([x [0] x loendis (filter (lambda) x: x [1] == 'I', c.items ()))]])  

Kustutamised oleksid sama mis 'D' 'I'

koht
Kas on olemas tavaline meetod, kuidas haarata string pythonis BAM-ist? Tundub, et see parsitakse automaatselt koos pysamiga
Püsam oleks vist tavaline viis
user172818
2018-03-02 12:29:51 UTC
view on stackexchange narkive permalink

Vastan küsimusele 1. Kuna Python pole mulle tuttav, pakun javascripti lahenduse ainult põhiloogika kuvamiseks. Koodi proovimiseks peate installima node.js ja käivitama selle sõlme this-script.js abil.

Arvestades, et see on väga standard analüüs

Kaldun arvama, et see on väga haruldane analüüs. Olen seda näinud ainult kaks korda tehtud. CIGAR + MD teisendamine polsterdatud joonduseks on kodeerimisel keeruline, kuna peate järjestust, sigarit ja MD kogu aeg sünkroonis hoidma. Allolev kood genereerib korraga kaks stringi. Viite ja päringustringide eraldi genereerimine võib olla loogiliselt lihtsam.

Üldiselt on MD halvasti määratletud. Sellega on liiga raske töötada. Kui võimalik, vältige seda silti. CIGARi ja NM-i kombinatsiooniga saate teha palju asju.

  function md2pad (CIGAR, MD, SEQ) {var m, re_cigar = / (\ d +) ([MIDSHNX =]) / g, re_MD = / (\ d +) | (\ ^ [A-Za-z] +) | ([A-Za-z]) / g; var sigar = []; while ((m = re_cigar.exec (CIGAR))! = null) // parsige CIGAR massiiviks, kui (m [2]! = 'H') // ei tee kõvaks lõikamiseks midagi, kuna sellel pole sigari mõju. tõuge ([parseInt (m [1]), m [2]]); var k = 0, sx = "", sy = ""; // k: k-s sigarioperaator; x: ref; y: päring // cx / cy: sigari [k] alguskoordinaat ref / päringus; mx / my: praeguse MD algus op var cx = 0, cy = 0, mx = 0, my = 0; samas ((m = re_MD.exec (MD))! = null) {if (m [2]! = null) {// kustutamine võrdlusest var len = m [2] .pikkus - 1; // kustutamise pikkus sx + = m [2] .substr (1), sy + = massiiv (len + 1) .liitu ("-"); mx + = len, cx + = len, ++ k; // tarbida kustutus D viidust} muu {// koopia või mittevastavus var ml = m [1]! = null? parseInt (m [1]): 1; // selle MD operatsiooni pikkus samas (k < sigar.pikkus && sigar [k] [1]! = 'D') {var cl = sigar [k] [0], op = sigar [k] [1];
kui (op == 'M' || op == 'X' || op == '=') {kui (minu + ml < cy + cl) {// MD lõpeb sigari M keskel if ( ml > 0) {if (m [3]! = null) sx + = m [3], sy + = SEQ [my]; muu sx + = SEQ substr (minu, ml), sy + = SEQ substr (minu, ml); } mx + = ml, minu + = ml, ml = 0; murda; } muu {var dl = cy + cl - minu; sx + = SEQ substr (minu, dl), sy + = SEQ substr (minu, dl); cx + = cl, cy + = cl, ++ k; // tarbime M-operaatorit mx + = dl, my + = dl, ml - = dl; }} else if (op == 'I') {sy + = SEQ.substr (cy, cl), sx + = Array (cl + 1) .liitu ("-"); cy + = cl, minu + = cl, ++ k; // tarbige lisamiseks I lisaaega ref}} if (op == 'S') {cy + = cl, my + = cl, ++ k; // tarbi pehmelt lõigatavat S} else throke Error ("vastuoluline MD"); // ei tööta N-ga} if (ml! = 0) viskeviga ("vastuoluline MD"); }} if (cx! = mx || cy! = minu) viskeviga ("vastuoluline MD"); tagasipöördumise [sx, sy];} var sigari = '16025H3M2I55M1D108M306H'; var MD = '7T15C24T9 ^ C0G2T6T16T3A1A7G21T17G6C1T6T5A4'; var järgnevates = 'GATCACAGGCCTATCACCCTATTAATCACTCACGGGAGCTCTCCATGCATCTGGTATTTTTTCGGGGGGGGATGCACGCGATAGCATCGCGGGCCGCTGGAACCGGAGCACCCTATGTCGCAGGATCTGTCTTTGATTCCTACCTCATGCCATTATTAATCGCGCCTA'; var s = md2pad (sigari, MD, järgnevates); console.log (s [0 ]); console.log (s [1]);  
Colin D
2018-11-26 07:59:37 UTC
view on stackexchange narkive permalink

See C ++ versioonis olev programm suudab täita ülesannet https://github.com/mlafave/sam2pairwise



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...