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]);