Wyszukiwanie wzorca w sekwencji (pewnych liter w całości tekstu)

0

Wyszukiwanie wzorca
Znajdowanie wystąpień słowa – wzorca w tekście jest jednym z często podejmowanych zagadnień zarówno w redakcji tekstów jak w analizie współcześnie poznanych sekwencji biologicznych. Dane biologiczne dotyczą sekwencji nukleotydowych, aminokwasowych, czy gramatycznego opracowania tych sekwencji (gen – cistron, skrypton – operon, replicon – paragraf, segregon (chromosom)- rozdział, itd.) i mogą być one przechowywane w pliku tekstowym. Realizacja tego zadania będzie przebiegała etapami. Dla uproszczenia przyjmuje się wyszukiwanie wzorca literalnego, bez użycia wyrażeń regularnych, które z kolei będą wprowadzone w kolejnych ćwiczenia. Plik FASTA zawiera jedną sekwencję. Celem ćwiczenia jest opracowanie "naiwnego" algorytmu wyszukiwania wzorca. Algorytm ten polega na przesuwaniu okna zawierającego wzorzec nad sekwencją i sprawdzaniu, dla jakich przesunięć wszystkie symbole w okienku są zgodne z odpowiadającymi im symbolami w tekście.

Żeby odczytać plik używam/;

with open('seq1.fa', 'r') as f:
    first = f.readline()        # odczyt pierwszej lini
    seqs = f.read()             # odczyt pozostałej zawartości
#zamknięcie bloku, automatycznie zamyka plik

Mam taką sekwencję:

Seq1 [organism=Carpodacus mexicanus]
CCTTTATCTAATCTTTGGAGCATGAGCTGGCATAGTTGGAACCGCCCTCAGCCTCCTCATCCGTGCAGAA
CTTGGACAACCTGGAACTCTTCTAGGAGACGACCAAATTTACAATGTAATCGTCACTGCCCACGCCTTCG
TAATAATTTTCTTTATAGTAATACCAATCATGATCGGTGGTTTCGGAAACTGACTAGTCCCACTCATAAT
CGGCGCCCCCGACATAGCATTCCCCCGTATAAACAACATAAGCTTCTGACTACTTCCCCCATCATTTCTT
TTACTTCTAGCATCCTCCACAGTAGAAGCTGGAGCAGGAACAGGGTGAACAGTATATCCCCCTCTCGCTG
GTAACCTAGCCCATGCCGGTGCTTCAGTAGACCTAGCCATCTTCTCCCTCCACTTAGCAGGTGTTTCCTC
TATCCTAGGTGCTATTAACTTTATTACAACCGCCATCAACATAAAACCCCCAACCCTCTCCCAATACCAA
ACCCCCCTATTCGTATGATCAGTCCTTATTACCGCCGTCCTTCTCCTACTCTCTCTCCCAGTCCTCGCTG
CTGGCATTACTATACTACTAACAGACCGAAACCTAAACACTACGTTCTTTGACCCAGCTGGAGGAGGAGA
CCCAGTCCTGTACCAACACCTCTTCTGATTCTTCGGCCATCCAGAAGTCTATATCCTCATTTTAC

Dostałem taki pseudokod. Nigdy nie wyszukiwałem tekstu w pythonie i nie wiem jak się za to zabrać

S[1..n] - sekwencja
P[1..m] – wzorzec
s – położenie dopasowania wzorca
n = S.length
m = P.length
for s = 0 to n-m
        if P[1..m] == S[s+1..s+m]
                print "Wzorzec występuję z przesunięciem s"

Moim zadaniem jest:

  1. wyszukanie jakiegoś wzorca (pseudokod podałem powyżej).
    Myślałem o czymś takim:
Sekwencja = input("Wpisz sekwencję") 
'''lub
with open('seq1.fa', 'r') as f:
        first = f.readline()        # odczyt pierwszej lini
        seqs = f.read()             # odczyt pozostałej zawartości
S = seqs"
'''
wzorzec = input("Wpisz wzorzec")
#Nie wiem, ale chyba trzeba przerobić string na listę
S = seqs.split()
S[1:n]  #sekwencja (czyli całość, te wszystkie literki)
P = input("Wpisz wzorzec")
P[1:m]  #wzorzec (czyli to czego szukamy w tych literkach, np. mamy wzorzec 'TATCTAATCTTT' i on się zaczyna w sekwencji od piątej literki do szesnastej włącznie)
s = ' ' #położenie dopasowania wzorca (czyli to od której literki w sekwencji zaczyna się wzorzec, np. mamy wzorzec 'TATCTAATCTTT' i on się zaczyna w sekwencji od piątej literki do szesnastej włącznie)
n = S.length
m = P.length
x = n-m
for s = 0 to x:
        if P[1:m] == S[(s+1):(s+m)]
                print "Wzorzec występuję z przesunięciem s"

Ogólnie to strasznie mnie zmylił ten pseudokod i nie wiem już co napisać
2. Przerobienie tamtego kodu na trzy funkcje
a) funkcje openFASTA(fileName) otwierającą plik typu FASTA i zwracającą: identyfikator sekwencji oraz samą sekwencje.
No to tu chyba tak

def openFASTA(fileName):
    with open('seq1.fa', 'r') as f:
        first = f.readline()        # odczyt pierwszej lini
        seqs = f.read()             # odczyt pozostałej zawartości
        return first, seqs

b) funkcje outputFASTA(id, sequence, width, fileName), która dla podanej sekwencji wygeneruje plik typu FASTA o deklarowanej liczbie znaków w wierszu i podanej nazwie pliku.

def outputFASTA(id, sequence, width, fileName):
    with open('seq1.fa', 'r') as f:
        id = f.readline()
        seqs = f.read
        f.write(seqs + '\n')
        fileName = input("Jak ma się nazywać plik")
        width = int(input("Jak długi ma być plik")

c) funkcje searchPAT(sequence, pattern), zwróci położenia dopasowania wzorca do sekwencji. Nie mam pojęcia, bo nie wiem jak zrobić ten pierwszy skrypt
def searchPat(sequence, pattern):

Sekwencja = input("Wpisz sekwencję") 
'''lub
with open('seq1.fa', 'r') as f:
        first = f.readline()        # odczyt pierwszej lini
        seqs = f.read()             # odczyt pozostałej zawartości
S = seqs"
'''
wzorzec = input("Wpisz wzorzec")
#Nie wiem, ale chyba trzeba przerobić string na listę
S = seqs.split()
S[1:n]  #sekwencja (czyli całość, te wszystkie literki)
P = input("Wpisz wzorzec")
P[1:m]  #wzorzec (czyli to czego szukamy w tych literkach, np. mamy wzorzec 'TATCTAATCTTT' i on się zaczyna w sekwencji od piątej literki do szesnastej włącznie)
s = ' ' #położenie dopasowania wzorca (czyli to od której literki w sekwencji zaczyna się wzorzec, np. mamy wzorzec 'TATCTAATCTTT' i on się zaczyna w sekwencji od piątej literki do szesnastej włącznie)
n = S.length
m = P.length
x = n-m
for s = 0 to x:
        if P[1:m] == S[(s+1):(s+m)]
                print "Wzorzec występuję z przesunięciem s"
1

Chodzi o to, że masz okno o pewnym rozmiarze którym jeździsz po sekwencji - czyli:

  • Sekwencja: ATTCTCCG
  • Szukasz wzorzec: AT

Długość poszukiwanego wzoru to 2 dlatego takie będzie Twój rozmiar okna, teraz po kolei sprawdzasz czy okno jest równe wzorcowi:

  • w kroku 0 [AT] == AT
  • w kroku 1 [TT] != AT
  • w kroku 2 [TC] != AT

https://ideone.com/XwhI10

1

Tak jak powyżej, tylko zamknięte w funkcji:

def search_pattern(s, patt):
    n, m = len(s), len(patt)
    for k in range(n - m):
        if patt == s[k : k + m]:
            print(f"Wzorzec występuje z przesunięciem {k}.")

Poza tym, bardzo jest to przykre, że Próbujesz indeksować od 1.

0

Wielkie dzięki za pomoc. Ja zrobiłem to tak:

with open('seq1.fa', 'r') as f:
    first = f.readline()        # odczyt pierwszej lini
    seqs = f.read()

S = list(seqs)
print(S)
wzorzec = input("Wpisz wzorzec")
P = list(wzorzec)
print(P)
m = len(S)
n = len(P)
for k in range(m - n):
    if P == S[k: k + n]:
        k = str(k)
        print("Wzorzec występuje z przesunięciem." + k)

1 użytkowników online, w tym zalogowanych: 0, gości: 1