2014-07-17 3 views
1

Y a-t-il un moyen d'obtenir le numéro de position de la discordance à partir du résultat BLAT suivant en utilisant Python?Python de sortie UCSC BLAT

00000001 taaaagatgaagtttctatcatccaaaaaatgggctacagaaacc 00000045 
<<<<<<<< ||||||||||||||||||||||||||| |||||||||||||||| <<<<<<<< 
41629392 taaaagatgaagtttctatcatccaaagtatgggctacagaaacc 41629348 

Comme nous pouvons le voir, il y a deux discordances dans la sortie ci-dessus. Pouvons-nous obtenir le numéro de position de la discordance/mutation en utilisant Python. C'est ainsi qu'il apparaît dans le code source aussi. Donc, je suis un peu confus sur la façon de procéder. Merci.

+0

Voulez-vous la position dans la séquence du haut ou du bas? Tous les deux? – sirlark

+0

Je le veux de la séquence du bas. – user3783999

Répondre

0

Vous pouvez trouver les discordances en utilisant la méthode .find d'une chaîne. Les discordances sont indiquées par un espace (''), donc nous cherchons cela dans la ligne médiane de la sortie blat. Je ne sais pas blat personnellement, donc je ne suis pas sûr si la sortie vient toujours dans les lignes triplet, mais en supposant que ce soit le cas, la fonction suivante retournera une liste de positions incompatibles, chaque position représentée comme un tuple de la position mésappariée dans la séquence supérieure et la même dans la séquence inférieure.

blat_src = """00000001 taaaagatgaagtttctatcatccaaaaaatgggctacagaaacc 00000045 
<<<<<<<< ||||||||||||||||||||||||||| |||||||||||||||| <<<<<<<< 
41629392 taaaagatgaagtttctatcatccaaagtatgggctacagaaacc 41629348""" 

def find_mismatch(blat): 
    #break the blat input into lines 
    lines = blat.split("\n") 

    #give some firendly names to the different lines 
    seq_a = lines[0] 
    seq_b = lines[2] 

    #We're not interested in the '<' and '>' so we strip them out with a slice 
    matchstr = lines[1][9:-9] 

    #Get the integer values of the starts of each sequence segment 
    pos_a = int(seq_a[:8]) 
    pos_b = int(seq_b[:8]) 

    results = [] 

    #find the index of first space character, mmpos = mismatch position 
    mmpos = matchstr.find(" ") 
    #if a space exists (-1 if none found) 
    while mmpos != -1: 
     #the position of the mismatch is the start position of the 
     #sequence plus the index within the segment 
     results.append((posa+mmpos, posb+mmpos)) 
     #search the rest of the string (from mmpos+1 onwards) 
     mmpos = matchstr.find(" ", mmpos+1) 
    return results 

print find_mismatch(blat_src) 

Qui produit

[(28, 41629419), (29, 41629420)] 

spécifié nous positions 28 et 29 (indexées conformément à la séquence du haut) ou des positions 41629419 et 41629420 (indexées conformément à la séquence du bas) ne correspondent pas.