Dit is wat ik zou doen in Python. Er zijn een paar extra controles die ik heb toegevoegd, en mijn definities van een paar gevallen zijn anders dan die van Heng Li hierboven, @ user172818. De uitvoering is redelijk vergelijkbaar.
def create_cigar (reference, alignment): '' 'Construeer CIGAR van referentie en uitlijning' '' ## als referentie en uitlijning ongelijke lengtes hebben, stop dan als len (referentie)! = len ( alignment): raise Exception ('Error: reference and alignment are of unequal length') ## vervang '-' en '*' naar '_' reference = reference.translate (bytes.maketrans (b "* -", b "__")) alignment = alignment.translate (bytes.maketrans (b "* -", b "__")) ### maakt een string met een CIGAR-symbool voor elke positie met zip () vergelijk_strings = '' .join ( ['=', 'X'] [ref == '_'] if ref == algn else 'X' if ref! = '_' En algn! = '_' Else ['I', 'D'] [algn == '_' en ref! = '_'] voor ref, algn in zip (referentie, uitlijning)) ## nu, ontleed string in CIGAR-formaat; sneller dan itertools total_match = 0 # totaal aantal aangrenzende overeenkomsten current_base = vergelijk_strings [0] # huidig teken wordt verwerkt resultaat = '' # resultaat van functie voor i binnen bereik (len (vergelijk_strings)): if vergelijk_strings [i] == huidige_reeks : total_match + = 1 else: result + = str (total_match) + current_base current_base = vergelijk_strings [i] total_match = 1 resultaat + = str (total_match) + current_base-resultaat
In het voorbeeld :
print (create_cigar ('ACGTAT-CT', 'ACGT-TGGA'))
welke uitvoert:
4 = 1D1 = 1I2X
(1) Ik standaard de ingangen, zodat hiaten -
, _
, of *
. (Gebruikers kunnen hun eigen toevoegen.)
(2) Er zijn geen N
, overgeslagen regio's, hoewel ik op basis van de use case kon zien dat gebruikers dit schrijven, bijv. een schrapping> = grootte een aantal zou kunnen werken.
(3) Harde en zachte vulling hebben in deze context geen zin. Deze worden geclassificeerd als X
.
(4) Volgens mijn definitie hierboven, als er een gat is in de referentie en de uitlijning, is dit een opvulling P
.