1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
import sys
sys.setrecursionlimit(1000000)
from collections import defaultdict
dd = defaultdict(set)
L=[]
with open ("C:/Users/lveillat/Desktop/Données stage/Fichiers tests/testchaines3.txt","r") as f1:
for ligne in f1:
#ðif ligne.startswith('9606'):
lp = ligne.rstrip('\n').split(" ")
prot1 = lp[0] #je sélectionne la première protéine de chaques interactions
prot2 = lp[1] #je sélectionne la seconde protéine de chaques interactions
dd[prot1].add(prot2) #Je crée mon dictionnaire avec en clé la première prot de l'interaction et en valeurs l'ensembles des prots avec qui elle peut interagir
#print(dd)
def chain(maillon, pathway, limite=11): #Je définis une fonction chain(maillon, chaine d'interaction, limite de taille de la chaine)
next_= maillon.get(pathway[-1], None) #next_ = On rajoute un maillon à la chaine existante en fonction de la dernière protéine du pathway
if next_ is None or len(pathway) >= limite : #Si il n'y a pas de protéine trouvée interagissant avec la dernière protéine du pathway, ou si la taille dépasse la limite alors on passe a la chaine suivante
yield pathway #yield est pratique quand on sait que la fonction va retourner de nombreuses valeurs qu?on ne souhaite lire qu?une seule fois (c'est notre cas ici), permet d'économiser de la mémoire.
if len(pathway) < limite : #Si on trouve encore des protéines interagissant avec la dernière protéine du pathway et si la taille limite n'est pas atteinte,
for m in next_: # pour une interaction dans l'ensemble des interactions possibles de pathway[-1]
if m not in pathway:
yield from chain(maillon, pathway + [m]) #On rajoute une autre prot à la chaine uniquement si la protéine que l'on rajoute n'est pas déjà apparue dans la chaine
else:
if len(pathway) >=2:
if m==pathway[-2]:
if len(next_)==1:
yield pathway
if len(next_)>1:
continue
if m!=pathway[-2]:
if len (next_)==2:
yield pathway
if len (next_)>2:
if m in pathway and pathway not in L:
L.append(pathway)
yield pathway
for k in dd: # Pour chaques prot du dico
for z in chain(dd, pathway = [k]): #Pour chaques chaines
print (' '.join(z)) |
Partager