[Python-ro] Fwd: Help needed :)

Alexandra Radu alexandra.radu09 at gmail.com
Tue Jun 2 11:12:45 CEST 2015


---------- Forwarded message ----------
From: Alexandra Radu <alexandra.radu09 at gmail.com>
Date: 2015-06-01 16:37 GMT+03:00
Subject: Help needed :)
To: contact at ropython.org


Buna ziua,

Saptamana trecuta am luat legatura cu dumneavoastra pe Facebook si am fost
sfatuita sa va trimit mai multe detalii legate de problemele pe care le-am
intampinat in scrierea unui mic software de bioinformatica.

Mi-as dori sa simplific si sa optimizez codul pe cat de mult posibil si sa
ii fac o interfata grafica simpla.

Software-ul utilizeaza o secventa (un sir) pentru a gasi substring-uri in
functie de anumite caracteristici. Fiind incepatoare, consider ca ceea ce
am scris, desi functioneaza, este prea stufos (atasat "incercare.py")

Am incercat de asemenea sa fac o interfata cu ajutorul Tkinter dar nu am
reusit decat sa asez widget-urile in grid...nu am reusit sa transfer si
"comenzile" din incercare.py in interfata1.py

Ce mi-as dori sa faca software-ul:

- sa permita deschiderea si citirea unui fisier text; folosirea sirului
pentru filtrarea acelor substrings

- cu ajutorul BioPython se pot citi fisiere in format FASTA dar eu nu am
reusit sa implementez asta...

- sa afiseze textul din fisierul deschis in cadrul widget-ului Entry din
subframe-ul "Secventa de interes" - unde scrie Secventa sau sa se poata
adauga cu copy-paste o secventa direct in Entry widget.

- tot in cadrul acelui subframe, doresc ca utilizatorul sa introduca 2
valori reprezentand indexes pentru o subsecventa de interes din secventa
initiala

- caracteristicile pentru filtrarea substrings-urilor imi doresc sa fie
luate din subframe-ul "Primeri". Utilizatorul sa poata selecta lungimea
substrings-urilor (intre 18 si 23 caractere), Tm intre 44 si 68 de grade
(formula de calcul este in cod) si daca substring-ul sa aibe C/G Clamp
adica sa aibe la final CC/GG/CG sau GC (toate conditiile sunt in
incercare.py)

- la apasarea butonului ok din subframeul "Primeri" sa fie citite
conditiile impuse de utilizator si filtrate rezultatele din secventa
initiala. Mi-ar placea ca substring-urile (primerii) sa fie afisati intr-o
fereastra separata (de Listbox poate?) in perechi, impreuna cu
temperaturile Tm, secventa dintre ei, lungimea acestei secvente si acel
scor de aliniere

- Ulterior daca utilizatorul va dori sa poata utiliza si subframe-ul
"Restrictie cu endonucleaze" sa poata selecta un rezultat din fereastra cu
widget Listbox si sa utilizeze sirul numit "amplicon" pentru a cauta
anumite substrings in el. Daca nu este selectat niciun rezultat din
Listbox, sa se poata cauta in toate rezultatele.
- Substring-urile cautate sa poata fi predefinite, selectabile prin
checkbox (BamHI, EcoRI, HindIII) sau sa poata fi cautat un anumit substring
ce poate fi scris in Entry ("Situs").

Acest software reprezinta lucrarea mea de disertatie si imi va face mare
placere sa mentionez ajutorul primit din partea comunitatii Python Romania.

Astept cu nerabdare raspunsul dumneavoastra.

Alexandra Radu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ro/attachments/20150602/42b4b993/attachment-0001.html>
-------------- next part --------------
import re 
import sys
from random import randint
from Bio import pairwise2
#importa secventa de nucleotide dintr-un fisier:
adn = open("Secventa.txt").read()
#Transforma toate literele in majuscule:
adn = adn.upper()
x = input("Index prima nucleotida a secventei de interes: ")
x = int(x)
y = input("Index ultima nucleotida: ")
y = int(y)+1

#capat cautare stanga primer forward - cu 200 nucleotide in aval:
ccs = x-200
#capat cautare dreapta primer forward:
ccd = x
#range de cautare PFW [ccs:ccd]
pfw = adn[ccs:ccd]
if ccs < 0:
  pfw = adn[:ccd]
pfw18 = open("primerfw18.txt", "w")
pfw19 = open("primerfw19.txt", "w")
pfw20 = open("primerfw20.txt", "w")
pfw21 = open("primerfw21.txt", "w")
pfw22 = open("primerfw22.txt", "w")
pfw23 = open("primerfw23.txt", "w")
prv18 = open("primerrv18.txt", "w")
prv19 = open("primerrv19.txt", "w")
prv20 = open("primerrv20.txt", "w")
prv21 = open("primerrv21.txt", "w")
prv22 = open("primerrv22.txt", "w")
prv23 = open("primerrv23.txt", "w")
print("Secventa in amonte: \n", pfw, "\n")

#cauta primeri de lungimea 18 nucleotide
z=18
def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result
#raport CG 40-60% >>C+G= 8-12
for i in rand_parts(pfw, z):
  cg = i.count("C")+ i.count("G")
  if 7 <= cg <= 11:
    pri = i
  
#filtreaza in functie de raportul AT/CG
    for ending in ["CC", "CG", "GG", "GC"]:
      if i.endswith(ending):
#filtreaza primerii ce au ultimile 2 nucleotice - la capatul 3' C sau G
        pfw18.write(pri)
pfw18.close()

#cauta primeri de lungimea 19 nucleotide
z=19	
def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result
#raport CG 40-60% >>C+G= 8-12
for i in rand_parts(pfw, z):
  cg = i.count("C")+ i.count("G")
  if 8 <= cg <= 11:
    pri = i
  
#filtreaza in functie de raportul AT/CG
    for ending in ["CC", "CG", "GG", "GC"]:
      if i.endswith(ending):
#filtreaza primerii ce au ultimile 2 nucleotice - la capatul 3' C sau G
        pfw19.write(pri)
pfw19.close()		
		
#cauta primeri de lungimea 20 nucleotide
z=20		
def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result

for i in rand_parts(pfw, z):
  cg = i.count("C")+ i.count("G")
  if 8 <= cg <= 12:
    pri = i
  
#filtreaza in functie de raportul AT/CG
    for ending in ["CC", "CG", "GG", "GC"]:
      if i.endswith(ending):
#filtreaza primerii ce au ultimile 2 nucleotice - la capatul 3' C sau G
        pfw20.write(pri)
pfw20.close()
	
#cauta primeri de lungimea 21 nucleotide
z=21	
def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result

for i in rand_parts(pfw, z):
  cg = i.count("C")+ i.count("G")
  if 8 <= cg <= 13:
    pri = i
  
#filtreaza in functie de raportul AT/CG
    for ending in ["CC", "CG", "GG", "GC"]:
      if i.endswith(ending):
#filtreaza primerii ce au ultimile 2 nucleotice - la capatul 3' C sau G
        pfw21.write(pri)
pfw21.close()	
		
#cauta primeri de lungimea 22 nucleotide
z=22	
def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result

for i in rand_parts(pfw, z):
  cg = i.count("C")+ i.count("G")
  if 9 <= cg <= 13:
    pri = i
  
#filtreaza in functie de raportul AT/CG
    for ending in ["CC", "CG", "GG", "GC"]:
      if i.endswith(ending):
#filtreaza primerii ce au ultimile 2 nucleotice - la capatul 3' C sau G
        pfw22.write(pri)
pfw22.close()		
		
#cauta primeri de lungimea 23 nucleotide
z=23	
def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result

for i in rand_parts(pfw, z):
  cg = i.count("C")+ i.count("G")
  if 9 <= cg <= 14:
    pri = i
  
#filtreaza in functie de raportul AT/CG
    for ending in ["CC", "CG", "GG", "GC"]:
      if i.endswith(ending):
#filtreaza primerii ce au ultimile 2 nucleotice - la capatul 3' C sau G
        pfw23.write(pri)
pfw23.close()
		  
#y este capatul din dreapta a secv de interes >> caut de la y la y+200
dr = y+200
#Secventa in aval de secventa de interes - in care cauta primerii reverse
prv = adn[y:dr]

#Secventa complementara
def multiple_replacer(*key_values):
  replace_dict = dict(key_values)
  replacement_function = lambda match: replace_dict[match.group(0)]
  pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M)
  return lambda string: pattern.sub(replacement_function, string)

def multiple_replace(string, *key_values):
    return multiple_replacer(*key_values)(string)

rep = (u"A", u"T"), (u"T", u"A"), (u"C", u"G"), (u"G", u"C")
adnc = multiple_replace(adn, *rep)
prvc = adnc[y:dr]

z=18
def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + 18
    res.append(prvc[st:en])
  return res

for i in parts(prvc, z):
  cg2 = i.count("C")+ i.count("G")
  if 7 <= cg2 <= 11:
    prim = i
    for ending in ["CC", "CG", "GG", "GC"]:
      if prim.startswith(ending):
        prv18.write(prim)
prv18.close()

z=19
def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + z
    res.append(prvc[st:en])
  return res

for i in parts(prvc, z):
  cg2 = i.count("C")+ i.count("G")
  if 8 <= cg2 <= 11:
    prim = i
    for ending in ["CC", "CG", "GG", "GC"]:
      if prim.startswith(ending):
        prv19.write(prim)
prv19.close()

z=20
def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + z
    res.append(prvc[st:en])
  return res

for i in parts(prvc, z):
  cg2 = i.count("C")+ i.count("G")
  if 8 <= cg2 <= 12:
    prim = i
    for ending in ["CC", "CG", "GG", "GC"]:
      if prim.startswith(ending):
        prv20.write(prim)
prv20.close()

z=21	
def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + z
    res.append(prvc[st:en])
  return res

for i in parts(prvc, z):
  cg2 = i.count("C")+ i.count("G")
  if 8 <= cg2 <= 13:
    prim = i
    for ending in ["CC", "CG", "GG", "GC"]:
      if prim.startswith(ending):
        prv21.write(prim)
prv21.close()

z=22		
def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + z
    res.append(prvc[st:en])
  return res

for i in parts(prvc, z):
  cg2 = i.count("C")+ i.count("G")
  if 9 <= cg2 <= 13:
    prim = i
    for ending in ["CC", "CG", "GG", "GC"]:
      if prim.startswith(ending):
        prv22.write(prim)
prv22.close()		

z=23
def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + z
    res.append(prvc[st:en])
  return res

for i in parts(prvc, z):
  cg2 = i.count("C")+ i.count("G")
  if 9 <= cg2 <= 14:
    prim = i
    for ending in ["CC", "CG", "GG", "GC"]:
      if prim.startswith(ending):
        prv23.write(prim)
prv23.close()

primeriFW18 = open("primerfw18.txt").read()
primeriFW19 = open("primerfw19.txt").read()
primeriFW20 = open("primerfw20.txt").read()
primeriFW21 = open("primerfw21.txt").read()
primeriFW22 = open("primerfw22.txt").read()
primeriFW23 = open("primerfw23.txt").read()

primeriRV18 = open("primerrv18.txt").read()
primeriRV19 = open("primerrv19.txt").read()
primeriRV20 = open("primerrv20.txt").read()
primeriRV21 = open("primerrv21.txt").read()
primeriRV22 = open("primerrv22.txt").read()
primeriRV23 = open("primerrv23.txt").read()

def chunks(s, n):
    #Produce `n`-character chunks from `s`."""
  for start in range(0, len(s), n):
    yield s[start:start+n]
PFW = []
PRV = []
for item in chunks(primeriFW18, 18):
	PFW.append(item)
for item in chunks(primeriFW19, 19):
	PFW.append(item)
for item in chunks(primeriFW20, 20):
	PFW.append(item)
for item in chunks(primeriFW21, 21):
	PFW.append(item)
for item in chunks(primeriFW22, 22):
	PFW.append(item)
for item in chunks(primeriFW23, 23):
	PFW.append(item)
  
for chunk in chunks(primeriRV18, 18):
  PRV.append(chunk[::-1])
for chunk in chunks(primeriRV19, 19):
  PRV.append(chunk[::-1])
for chunk in chunks(primeriRV20, 20):
  PRV.append(chunk[::-1])
for chunk in chunks(primeriRV21, 21):
  PRV.append(chunk[::-1])
for chunk in chunks(primeriRV22, 22):
  PRV.append(chunk[::-1])
for chunk in chunks(primeriRV23, 23):
  PRV.append(chunk[::-1])

#scoatem secventele cu triplete AT si CG

PFW[:] = [x for x in PFW if not ("AAA" in x and "TTT" in x)]
PFW[:] = [x for x in PFW if not ("GGG" in x and "CCC" in x)]
PRV[:] = [x for x in PRV if not ("AAA" in x and "TTT" in x)]
PRV[:] = [x for x in PRV if not ("GGG" in x and "CCC" in x)]

#verificare aliniamente

		

#filtrare in functie de temperatura de topire (le vrem asemanatoare)

tmi = input('Introduceti temperatura de topire dorita sau "all" ')
hh = open("Rezultat.txt", "w")
ampliconi = []
perechi_primeri = []
sys.stdout = hh
if tmi == 'all':
	for i in PFW:
		for j in PRV:
			l1 = adn.find(i)
			l2 = adnc.rfind(j[::-1])
			l2 = int(l2)+len(j)
			amplicon = adn[l1:l2]			
			g = len(amplicon)
			tm1 = 2*(i.count("A")+ i.count("T")) + 4*(i.count("G")+ i.count("C"))
			tm = 2*(j.count("A")+ j.count("T")) + 4*(j.count("G")+ j.count("C"))
			for a in pairwise2.align.globalxs(i, j, -10, -10, one_alignment_only=1, score_only=1):
				if tm1 == tm:
					ampliconi.append(amplicon)
					print(format_alignment(*a))
					print ("Ampliconul ", ampliconi.index(amplicon), "\n", "Tm = ", tm, "\n", "PFW  5'", i, " 3'\n", "PRV  5'", j, " 3' \n", "Index amplicon: ", l1, " - ", l2, "\n", "Lungime: ", g, "\n", "Amplicon: ", amplicon, "\n")
			
	for i in PFW:
		for j in PRV:
			l1 = adn.find(i)
			l2 = adnc.rfind(j[::-1])
			l2 = int(l2)+len(j)
			amplicon = adn[l1:l2]
			g = len(amplicon)
			tm1 = 2*(i.count("A")+ i.count("T")) + 4*(i.count("G")+ i.count("C"))
			tm = 2*(j.count("A")+ j.count("T")) + 4*(j.count("G")+ j.count("C"))
			tmd = tm1-tm
			for a in pairwise2.align.globalxs(i, j, -10, -10, one_alignment_only=1, score_only=1):
				if 1 <= abs(tmd)<= 2:
					ampliconi.append(amplicon)
					print(format_alignment(*a))
					print("Ampliconul ", ampliconi.index(amplicon), "\n", "PFW  5'", i, " 3'    Tm = ", tm1, "\nPRV  5'", j, " 3'    Tm = ", tm, "\n", "Index amplicon: ", l1, " - ", l2, "\n", "Lungime: ", g, "\n", "Amplicon: ", amplicon, "\n\n")
else:
	tmi = int(tmi)
	for i in PFW:
		for j in PRV:
			l1 = adn.find(i)
			l2 = adnc.rfind(j[::-1])
			l2 = int(l2)+len(j)
			amplicon = adn[l1:l2]
			g = len(amplicon)
			tm1 = 2*(i.count("A")+ i.count("T")) + 4*(i.count("G")+ i.count("C"))
			tm = 2*(j.count("A")+ j.count("T")) + 4*(j.count("G")+ j.count("C"))
			if tm1 == tm == tmi:
				ampliconi.append(amplicon)
				perechi_primeri.append((i,j))
				for (x,y) in perechi_primeri:
					k=multiple_replace(y, *rep)
					a=pairwise2.align.localmx(x, y, 1, 0, score_only=1)
					med=(len(i)+len(j))/4
					if a<med:
						print("Ampliconul ", ampliconi.index(amplicon), "\n", "Tm = ", tm, "\n", "PFW  5' ", i, " 3'\n", "PRV  5' ", j, " 3' \n","Scor aliniere:", a, "\n", "Index amplicon: ", l1, " - ", l2, "\n", "Lungime: ", g, "\n", "Amplicon: ", amplicon, "\n\n")

hh.close()

re = input("Optiune identificare situsuri de restrictie (Enter pentru a continua)")
re = input("Introduceti numarul ampliconului / all: ")


oo = open("BamHIEcorRIHindIII.txt", "w")
sys.stdout = oo

if re != "all":
	re = int(re)
	amp = ampliconi[re]
	bamh1 = amp.find("GGATCC")
	ecor1 = amp.find("GAATTC")
	hind3 = amp.find("AAGCTT")
	if bamh1 != -1:
		print("Amplicon ", ampliconi.index(amp), i,"\n", amp, "\n", "Localizare situs pentru Endonucleaza de restrictie BamHI: ", "\n", "Catena + : ", bamh1, "\n", "Catena - : ", bamh1+5, "\n\n")
	else:
		print("Nu exista situs de restrictie pentru BamHI")
	if ecor1 != -1:
		print("Localizare situs pentru Endonucleaza de restrictie EcoRI: ", "\n", "Catena + : ", ecor1, "\n", "Catena - : ", ecor1+5, "\n\n")
	else:
		print("Nu exista situs de restrictie pentru EcoRI")		
	if hind3 != -1:
		print("Localizare situs pentru Endonucleaza de restrictie HindIII: ", "\n", "Catena + : ", hind3, "\n", "Catena - : ", hind3+5, "\n\n")
	else:
		print("Nu exista situs de restrictie pentru HindIII")
elif re == "all":
	for i in ampliconi:
		bamh1 = i.find("GGATCC")
		ecor1 = i.find("GAATTC")
		hind3 = i.find("AAGCTT")
		if bamh1 != -1:
			print("Ampliconul ", ampliconi.index(i),"contine situs pentru Endonucleaza de restrictie BamHI: ", "\n", "Catena + : ", bamh1, "\n", "Catena - : ", bamh1+5, "\n\n")
		else:
			print("Nu exista situs de restrictie pentru BamHI")
		if ecor1 != -1:
			print("Ampliconul ", ampliconi.index(i),"contine situs pentru Endonucleaza de restrictie EcoRI: ", "\n", "Catena + : ", ecor1, "\n", "Catena - : ", ecor1+5, "\n\n")
		else:
			print("Nu exista situs de restrictie pentru EcoRI")		
		if hind3 != -1:
			print("Ampliconul ", ampliconi.index(i),"contine situs pentru Endonucleaza de restrictie HindIII: ", "\n", "Catena + : ", hind3, "\n", "Catena - : ", hind3+5, "\n\n")
		else:
			print("Nu exista situs de restrictie pentru HindIII")
	
	
oo.close()
ver = input("Verificati documentul BamHIEcorRIHindIII.txt pentru informatii legate de aceste situsuri de restrictie")
res = input("Introducere manuala a situsului de restrictie / pass: ")
pp = open("Restrictie.txt", "w")
sys.stdout = pp

if res != "pass":
	for i in ampliconi:
		situs = i.find(res)
		if situs != -1:
			print("Ampliconul ", ampliconi.index(i), " contine situsul de restrictie ", res, "in pozitia ", situs)
		else:
			print("Ampliconul ", ampliconi.index(i), " nu contine situsul de restrictie ", res)
pp.close()
-------------- next part --------------
from tkinter import *
from tkinter import filedialog
from tkinter.filedialog import askopenfilename
import re 
import sys
from random import randint
from Bio import pairwise2

class AutoScrollbar(Scrollbar):
    # a scrollbar that hides itself if it's not needed.  only
    # works if you use the grid geometry manager.
    def set(self, lo, hi):
        if float(lo) <= 0.0 and float(hi) >= 1.0:
            # grid_remove is currently missing from Tkinter!
            self.tk.call("grid", "remove", self)
        else:
            self.grid()
        Scrollbar.set(self, lo, hi)
    def pack(self, **kw):
        raise TclError("cannot use pack with this widget")
    def place(self, **kw):
        raise TclError("cannot use place with this widget")
		
def donothing():
   filewin = Toplevel(root)
   button = Button(filewin, text="Do nothing button")
   button.pack()




def OpenFile():
    filepath = askopenfilename()
    if filepath:
        adn = open(filepath, 'r')
				
def Quit():
    root.destroy()

 
root = Tk()
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=Quit)

menubar.add_cascade(label="File", menu=filemenu)
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="Help Index", command=donothing)
helpmenu.add_command(label="About...", command=donothing)
menubar.add_cascade(label="Help", menu=helpmenu)

root.config(menu=menubar)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
for x in range(60):
	root.rowconfigure(x, weight=1)

#TITLUL
photo = PhotoImage(file="logo.gif")
w = Label(root, image=photo)
w.photo = photo
w.grid(row=1,column=0, columnspan=2)
Label(root, text="QPrimerDesign Tool", font = ("Calibri", 14, "bold")).grid(row=0, column=0, columnspan=2)



#INDEX SECVENTA
index=LabelFrame(root, text="Secventa de interes:", font = ("Calibri", 12, "bold"))
index.grid(sticky=W+E+N+S, row=2, column=0, columnspan=2)

index.rowconfigure(1, weight=1)
index.columnconfigure(0, weight=1)
index.columnconfigure(2, weight=1)

data1 = IntVar()	
data2 = IntVar()
index_stanga = Entry(index, width=10, justify=RIGHT, textvariable=data1)
index_stanga.grid(sticky=W+E+N+S, padx=2, pady=2)
Label(index, text="-", font=("calibri", 12, "bold")).grid(row=0, column=1, padx=2, pady=2)
index_dreapta = Entry(index, width=10, justify=RIGHT, textvariable=data2)
index_dreapta.grid(row=0, column=2, sticky=W+E+N+S, padx=2, pady=2)

vscrollbar = AutoScrollbar(index)
vscrollbar.grid(row=1, column=2, sticky=N+S)
seq = Text(index, wrap=WORD, height=3, yscrollcommand=vscrollbar.set, padx=2, font=("calibri", 10))
seq.grid(row=1, column=0, columnspan=3, sticky=W+E+N+S, padx=2, pady=2)
vscrollbar.config(command=seq.yview)

seq.insert(END, "Secventa")
adn=""		
x = data1.get()
x = int(x)
y = data2.get()
y = int(y)+1
#capat cautare stanga primer forward - cu 200 nucleotide in aval:
ccs = x-100
#capat cautare dreapta primer forward:
ccd = x
#range de cautare PFW [ccs:ccd]
pfw = adn[ccs:ccd]
if ccs < 0:
  pfw = adn[:ccd]
#y este capatul din dreapta a secv de interes >> caut de la y la y+100
dr = y+100
#Secventa in aval de secventa de interes - in care cauta primerii reverse
prv = adn[y:dr]

 
#RAMA CU PRIMERI
primer_frame=LabelFrame(root, text="Primeri", font=("calibri", 12, "bold"))
primer_frame.grid(row=5, column=0, rowspan=12, sticky=W+E+N+S)

for x in range(7):
	primer_frame.rowconfigure(x, weight=1)
for y in range(2):
	primer_frame.columnconfigure(y, weight=1)
	
primeri_fw=Label(primer_frame, text="Forward", font=("calibri", 10, "underline"))
primeri_fw.grid(row=0, column=1, sticky=W+E+N+S, padx=2, pady=2)
primeri_rv=Label(primer_frame, text="Reverse", font=("calibri", 10, "underline"))
primeri_rv.grid(row=0, column=2, sticky=W+E+N+S, padx=2, pady=2)

Label(primer_frame, text="Lungime", font=("calibri", 10)).grid(row=1, sticky=W+E+N+S, column=0, padx=5, pady=5)
data3 = IntVar()
data4 = IntVar()
data3.set(0) # default value
data4.set(0)
lenght1 = Spinbox(primer_frame, values=(0,18,19,20,21,22,23), textvariable=data3)
lenght1.grid(row=1, column=1, padx=2, pady=2)
lenght2 = Spinbox(primer_frame, values=(0,18,19,20,21,22,23), textvariable=data4)
lenght2.grid(row=1, column=2, padx=2, pady=2)
lfw=lenght1.get()
lfw=int(lfw)
lrv=lenght1.get()
lrv=int(lrv)

def rand_parts(pfw, z):
  result = []
  limita = len(pfw)
  for start in range (0, limita-z):
    end = start + z
    result.append(pfw[start:end])
  return result

#y este capatul din dreapta a secv de interes >> caut de la y la y+100
dr = y+100
#Secventa in care cauta primerii reverse
prv = adn[y:dr]

def multiple_replacer(*key_values):
  replace_dict = dict(key_values)
  replacement_function = lambda match: replace_dict[match.group(0)]
  pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M)
  return lambda string: pattern.sub(replacement_function, string)

def multiple_replace(string, *key_values):
    return multiple_replacer(*key_values)(string)

rep = (u"A", u"T"), (u"T", u"A"), (u"C", u"G"), (u"G", u"C")
adnc = multiple_replace(adn, *rep)
prvc = adnc[y:dr]

def parts(prvc, z):
  res = []
  lim = len(prvc)
  for st in range (0, lim-z):
    en = st + z
    res.append(prvc[st:en])
  return res
  


Label(primer_frame, text="Tm", font=("calibri", 10)).grid(row=2, sticky=W+E+N+S, column=0, padx=2, pady=2)
variable = IntVar(primer_frame)
variable1 = IntVar(primer_frame)
variable.set(0) # default value
temp1 = OptionMenu(primer_frame, variable, 44,46,48,50,52,54,56,58,60,62,64,66,68)
temp1.grid(row=2, column=1, padx=2, pady=2)
temp2 = OptionMenu(primer_frame, variable, 44,46,48,50,52,54,56,58,60,62,64,66,68)
temp2.grid(row=2, column=2, padx=2, pady=2)

CheckVar4 = IntVar()
clamp = Checkbutton(primer_frame, text = "C/G Clamp", font=("calibri", 10), variable = CheckVar4, onvalue = 1, offvalue = 0)
clamp.grid(row=3, sticky=W+E+N+S, padx=2, pady=2)

def rezultat1():
	filewi = Toplevel(root)
	vscrollbar = AutoScrollbar(filewi)
	vscrollbar.grid(row=1, column=2, sticky=N+S)
	text_rez = Text(filewi, yscrollcommand=vscrollbar.set, font=("calibri", 10))
	text_rez.grid(row=0, column=0, sticky=N+S+E+W)
	vscrollbar.config(command=text_rez.yview)
	filewi.grid_rowconfigure(0, weight=1)
	filewi.grid_columnconfigure(0, weight=1)
	adn = seq.get('1.0', END)
	PFW = []
	PRV = []
	if lfw==0:
		for ending in ["CC", "CG", "GG", "GC"]:
			if not CheckVar4.get():
				for a in range(18, 23):
					for i in parts(pfw, a):
						if not i.endswith(ending):
							PFW.append(i)
			elif CheckVar4.get():
				for a in range(18, 23):
					for i in parts(pfw, a):
						if i.endswith(ending):
							PFW.append(i)
	elif lfw !=0:
		for ending in ["CC", "CG", "GG", "GC"]:
			if not CheckVar4.get():
				for i in parts(pfw, lfw):
					if not i.endswith(ending):
						PFW.append(i)
			elif CheckVar4.get():
				for i in parts(pfw, lfw):
					if i.endswith(ending):
						PFW.append(i)

	if lrv==0:
		for ending in ["CC", "CG", "GG", "GC"]:
			if not CheckVar4.get():
				for a in range(18, 23):
					for i in parts(prvc, a):
						if not i.startswith(ending):
							PRV.append(i[::-1])				
			elif CheckVar4.get():
				for a in range(18, 23):
					for i in parts(prvc, a):
						if not i.startswith(ending):
							PRV.append(i[::-1])
	elif lrv !=0:
		for ending in ["CC", "CG", "GG", "GC"]:
			if not CheckVar4.get():
				for i in parts(prvc, lrv):
					if not i.endswith(ending):
						PRV.append(i[::-1])
			elif CheckVar4.get():
				for i in parts(prvc, lrv):
					if i.endswith(ending):
						PRV.append(i[::-1])		

	PFW[:] = [x for x in PFW if not ("AAA" in x and "TTT" in x)]
	PFW[:] = [x for x in PFW if not ("GGG" in x and "CCC" in x)]
	PRV[:] = [x for x in PRV if not ("AAA" in x and "TTT" in x)]
	PRV[:] = [x for x in PRV if not ("GGG" in x and "CCC" in x)]					

	ampliconi = []
	perechi_primeri = []
	lista=[]
	if variable==0:
		for i in PFW:
			for j in PRV:
				l1 = adn.find(i)
				l2 = adnc.rfind(j[::-1])
				l2 = int(l2)+len(j)
				amplicon = adn[l1:l2]			
				g = len(amplicon)
				tm1 = 2*(i.count("A")+ i.count("T")) + 4*(i.count("G")+ i.count("C"))
				tm = 2*(j.count("A")+ j.count("T")) + 4*(j.count("G")+ j.count("C"))
				tmd = tm1-tm
				if tm1 == tm:
					ampliconi.append(amplicon)
					perechi_primeri.append((i,j))
					for (x,y) in perechi_primeri:
						k=multiple_replace(y, *rep)
						a=pairwise2.align.localmx(x, y, 1, 0, score_only=1)
						med=(len(i)+len(j))/4
						if a<med:
							t="Ampliconul "+ampliconi.index(amplicon)+"\n Tm = "+tm+"\n PFW  5' "+i+" 3'\n PRV  5' "+j+" 3'\nScor aliniere: "+a+"\n Index amplicon: "+l1+" - "+l2+"\n Lungime: "+g+"\n Amplicon: "+amplicon+"\n\n"
							lista.append(t)
				elif 1 <= abs(tmd)<= 2:
					ampliconi.append(amplicon)
					perechi_primeri.append((i,j))
					for (x,y) in perechi_primeri:
						k=multiple_replace(y, *rep)
						a=pairwise2.align.localmx(x, y, 1, 0, score_only=1)
						med=(len(i)+len(j))/4
						if a<med:
							t="Ampliconul "+ampliconi.index(amplicon)+"\n PFW  5' "+i+" 3'    Tm = "+tm1+"\nPRV  5' "+j+" 3'    Tm = "+tm+"\nScor aliniere: "+a+"\nIndex amplicon: "+l1+" - "+l2+"\n Lungime: "+g+"\n Amplicon: "+amplicon+"\n\n"
							lista.append(t)
	elif variable !=0:
		for i in PFW:
			for j in PRV:
				l1 = adn.find(i)
				l2 = adnc.rfind(j[::-1])
				l2 = int(l2)+len(j)
				amplicon = adn[l1:l2]
				g = len(amplicon)
				tm1 = 2*(i.count("A")+ i.count("T")) + 4*(i.count("G")+ i.count("C"))
				tm = 2*(j.count("A")+ j.count("T")) + 4*(j.count("G")+ j.count("C"))
				if tm1 == tm == variable:
					ampliconi.append(amplicon)
					perechi_primeri.append((i,j))
					for (x,y) in perechi_primeri:
						k=multiple_replace(y, *rep)
						a=pairwise2.align.localmx(x, y, 1, 0, score_only=1)
						med=(len(i)+len(j))/4
						if a<med:
							t="Ampliconul "+ampliconi.index(amplicon)+"\nTm = "+tm+"\nPFW  5' "+i+" 3'\nPRV  5' "+j+"   3' \nScor aliniere: "+a+"\nIndex amplicon: "+l1+" - "+l2+"\nLungime: "+g+"\nAmplicon: "+amplicon+"\n\n"
							lista.append(t)
	print(adn)
	print(lfw, lrv, variable)
	for item in lista:
		text_rez.insert(END, item)
		
ok1=Button(primer_frame, text="OK", font=("calibri", 12, "bold"), command=rezultat1, width=7)
ok1.grid(row=4, column=2, padx=2, pady=2, sticky=W+E)







#RAMA CU RESTRICTIE
restrictie_frame=LabelFrame(root, text="Restrictie cu endonucleaze", font=("calibri", 12, "bold"))
restrictie_frame.grid(row=5, column=1, rowspan=12, sticky=W+E+N+S)
for x in range(5):
	restrictie_frame.rowconfigure(x, weight=1)
for y in range(2):
	restrictie_frame.columnconfigure(y, weight=1)
	
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
C1 = Checkbutton(restrictie_frame, text = "BamHI", font=("calibri", 10), variable = CheckVar1, onvalue = 1, offvalue = 0)
C2 = Checkbutton(restrictie_frame, text = "EcoRI", font=("calibri", 10), variable = CheckVar2, onvalue = 1, offvalue = 0)
C3 = Checkbutton(restrictie_frame, text = "HindIII", font=("calibri", 10), variable = CheckVar3, onvalue = 1, offvalue = 0)
C1.grid(row=0, padx=2, pady=2)
C2.grid(row=1, column=0, padx=2, pady=2)
C3.grid(row=2, column=0, padx=2, pady=2)

Label(restrictie_frame, text="Situs", font=("calibri", 10)).grid(row=3, sticky=W+E+N+S, column=0, padx=2, pady=2)
situs = Entry(restrictie_frame, width=10, justify=RIGHT)
situs.grid(row=3, column=1, padx=2, pady=2)

ok2=Button(restrictie_frame, text="OK", font=("calibri", 12, "bold"), command=donothing, width=7)
ok2.grid(row=4, column=1, padx=2, pady=2)
root.mainloop()




















More information about the Python-ro mailing list