2016-08-08 22 views
4

Ich habe ein Programm, das Allel-Sequenzen analysiert. Ich versuche, einen Code zu schreiben, der bestimmt, ob das Allel vollständig ist oder nicht. Dazu muss ich die Anzahl der Brüche in der Referenzsequenz zählen. Eine Pause wird durch eine Kette von '-' angezeigt. Wenn es mehr als eine Pause gibt, möchte ich, dass das Programm "Unvollständiges Allel" sagt.Finden Sie die Anzahl der Brüche in einer Sequenz

Wie kann ich herausfinden, wie die Anzahl der Brüche in der Sequenz gezählt wird? Hier

ist ein Beispiel für eine „gebrochene“ Sequenz:

>DQB1*04:02:01 
------------------------------------------------------------ 
------------------------------------------------------------ 
------------------------------------------------------------ 
--ATGTCTTGGAAGAAGGCTTTGCGGAT-------CCCTGGAGGCCTTCGGGTAGCAACT 
GTGACCTT----GATGCTGGCGATGCTGAGCACCCCGGTGGCTGAGGGCAGAGACTCTCC 
CGAGGATTTCGTGTTCCAGTTTAAGGGCATGTGCTACTTCACCAACGGGACCGAGCGCGT 
GCGGGGTGTGACCAGATACATCTATAACCGAGAGGAGTACGCGCGCTTCGACAGCGACGT 
GGGGGTGTATCGGGCGGTGACGCCGCTGGGGCGGCTTGACGCCGAGTACTGGAATAGCCA 
GAAGGACATCCTGGAGGAGGACCGGGCGTCGGTGGACACCGTATGCAGACACAACTACCA 
GTTGGAGCTCCGCACGACCTTGCAGCGGCGA----------------------------- 
----------------------------------------------------- 
------------------------------------------------------------ 
------------------------------------------------------------ 
---GTGGAGCCCACAGTGACCATCTCCCCATCCAGGACAGAGGCCCTCAACCACCACAAC 
CTGCTGGTCTGCTCAGTGACAGATTTCTATCCAGCCCAGATCAAAGTCCGGTGGTTTCGG 
AATGACCAGGAGGAGACAACTGGCGTTGTGTCCACCCCCCTTATTAGGAACGGTGACTGG 
ACCTTCCAGATCCTGGTGATGCTGGAAATGACTCCCCAGCGTGGAGACGTCTACACCTGC 
CACGTGGAGCACCCCAGCCTCCAGAACCCCATCATCGTGGAGTGGCGGGCTCAGTCTGAA 
TCTGCCCAGAGCAAGATGCTGAGTGG----CATTGGAGGCTTCGTGCTGGGGCTGATCTT 
CCTCGGGCTGGGCCTTATTATC--------------CATCACAGGAGTCAGAAAGGGCTC 
CTGCACTGA--------------------------------------------------- 
------------------------------------------------------------ 
------------------------------------------------------------ 
------------------------------------------------------------ 

Der Code, den ich bisher haben sich wie folgt:

idx=[] 
for m in range(len(sequence)): 
    for n in re.finditer('-',sequence[0]): 
     idx.append(n.start()) 
counter=0 
min_val=[] 
for n in range(len(idx)): 
    if counter==idx[n]: 
     counter=counter+1 
    elif counter !=0: 
     min_val.append(idx[n-1]) 
     counter=0 

Meine Argumentation für den obigen Code wurde, wenn ich finden konnte, die Startpositionen des '-' dann kann ich sehen, wie oft sie innerhalb der Sequenz erscheinen und ob sie die Sequenz überhaupt unterbrechen. Ich weiß jedoch, dass es in dem obigen Code einige Fehler gibt.

+0

Was definiert "eine Sequenz"? Wie viele Sequenzen und wie viele Pausen sind in Ihrem Beispiel? –

+0

Sie verwenden nicht 'm' in Ihrer Schleife, sondern testen nur' sequence [0] 'für' m' Iterationen; meinst du "sequenz [m]"? Außerdem nehme ich an: idx [n ['sollte' idx [n] 'sein? –

+0

@ Two-BitAlchemist Das obige Beispiel ist eine Sequenz und es gibt fünf Unterbrechungen. Der Teil meines Programms, den ich nicht gezeigt habe, liest Dateien und ordnet sie einem Sequenz-Array zu. Ich suche nur nach Brüchen innerhalb der ersten Sequenz, die die Referenzsequenz ist oder "> DQB1 * 04: 02: 01". Da ich nur die erste Sequenz betrachte, teste ich deshalb die Sequenz [0] für m Iterationen. –

Antwort

0

Es scheint, wie Sie nur die occurrances von -+, das heißt eine Folge von eine oder mehrere- Symbole zählen. Das einzige Problem sind die Zeilenumbrüche, aber Sie können diese entweder in die Regex einbinden oder sie aufteilen und der Zeichenfolge vor dem Abgleich beitreten.

>>> sequence = """>DQB1*04:02:01.....""" 
>>> joined = ''.join(sequence.splitlines()) 
>>> sum(1 for m in re.finditer("-+", joined)) 
7 

Hinweis: Dies beinhaltet die - am Anfang und Ende der Sequenz.

Oder den Ansatz umkehren: Statt die Lücken zu zählen, die Gruppen zählen:

>>> sum(1 for m in re.finditer("[GATC]+", joined)) 
6 
0

ich denke, das tun sollte:

def test(sequence): 
    sequence = ''.join(sequence.splitlines()[1:]) # remove first line (header and line breaks) 
    S = [segments for segments in sequence.split('-') if block != ''] 
    if len(S)>2: # len(S) should be the number of remaining segments 
     print "Incomplete Allele." 
+0

Ich habe das versucht, aber ich habe die Sequenz nicht als unvollständig gelesen. –

+0

Wirklich? was "len (S)" bekommst du? – Julien

+0

Das funktioniert bei mir mit 'sequenz = s = '--ATAG - TCG - GAT --- CCTT - GG - TAGCAACT' zum Beispiel. Können Sie die genaue Zeichenfolge zum Testen angeben, enthält sie neue Zeilenzeichen? – Julien

1

Sie könnten einfach alle herauszufiltern ‚-‘ Zeichen und auf der Grundlage der Anzahl der verbleibenden Segmente bestimmen Anzahl von Brüchen.

str_list = filter(None, sequence.split('-')) 
if len(str_list) > 2: 
    return "Incomplete Allele" 
else: 
    return "Complete Allele" 
+0

Das einzige Problem, das Sie damit haben können, ist, wenn Sie sich kümmern über ---- 's oder Trailing ---' s –

+0

Sie müssen auch den Header und die Zeilenumbrüche loswerden. –

+0

Ich konnte von der Frage nicht sagen, ob das ein Problem ist, OP könnte antworten und ich würde mehr als glücklich die Dinge für die Einschränkungen anpassen. –