Tady je to, co bych dělal v Pythonu. Existuje několik dalších kontrol, které jsem zahrnul, a moje definice několika případů se liší od výše uvedených Heng Li, @ user172818. Výkon je docela podobný.
def create_cigar (reference, alignment): '' 'Zkonstruujte CIGAR z reference a alignmentu' '' ## pokud reference a alignment mají nestejnou délku, stop if len (reference)! = len ( alignment): raise Exception ('Error: reference and alignment are of nestable length') ## replace any '-' and '*' to '_' reference = reference.translate (bytes.maketrans (b "* -", b "__")) alignment = alignment.translate (bytes.maketrans (b "* -", b "__")) ### vytvoří řetězec se symbolem CIGAR pro každou pozici pomocí zip () compare_strings = '' .join ( ['=', 'X'] [ref == '_'] if ref == algn else 'X' if ref! = '_' And algn! = '_' Else ['I', 'D'] [algn == '_' and ref! = '_'] pro ref, algn v zipu (reference, zarovnání)) ## now, parse string into CIGAR format; rychlejší než itertools total_match = 0 # celkový počet sousedních zápasů current_base = compare_strings [0] # aktuální zpracovávaný znak result = '' # výsledek funkce pro i v rozsahu (len (compare_strings)): if compare_strings [i] == current_base : total_match + = 1 else: result + = str (total_match) + current_base current_base = compare_strings [i] total_match = 1 result + = str (total_match) + current_base návratový výsledek
Podle příkladu :
print (create_cigar ('ACGTAT-CT', 'ACGT-TGGA'))
které výstupy:
4 = 1D1 = 1I2X
(1) Standardizuji vstupy, takže mezery mohou být buď -
, _
, nebo *
. (Uživatelé si mohou přidat své vlastní.)
(2) Neexistují žádné vynechané oblasti N
, i když na základě případu použití jsem viděl uživatele, kteří to píší, např. vymazání> = velikost, některé číslo může fungovat.
(3) Tvrdé a měkké polstrování v tomto kontextu nedává smysl. Ty budou klasifikovány jako X
.
(4) Podle mé definice výše, pokud existuje mezera v odkazu a zarovnání, jedná se o výplň P
.