forked from holtzy/Bioinformatics-Tool-Box
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfind_blast_family.py
executable file
·145 lines (87 loc) · 3.96 KB
/
find_blast_family.py
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/python
# -*- coding: utf-8 -*-
#-------------------------------------
#
# SCRIPT PYTHON Find_Blas_family
# Consider a blast result.
# The contig 1 blast with the contig 4. And the contig 4 with the contig 18
# Then you have a family which groups together the contigs 1,4 and 18
# This script permits to find the family
#
# Yan Holtz, [email protected]
#-------------------------------------
import os
import sys
import re
try:
import argparse
except ImportError:
print"oops, the import /argparse/ didn't work"
parser = argparse.ArgumentParser(description= '\n\nConsider a blast result.The contig 1 blast with the contig 4. And the contig 4 with the contig 18. Then you have a family which groups together the contigs 1,4 and 18. This script permits to find the family\n\n')
parser.add_argument('-blast', required=True, help='resultat de blastn. Basivally, column 1 and 2 are sufficient. This input must be filtered before with your threshold')
parser.add_argument('-out', required=True, help=' output file')
args = parser.parse_args()
fic_blast=args.blast
out=args.out
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
num=0
nligne=0
contig_trouves=[]
liste_des_groupes=[]
numero_apartenance=dict()
#Je parse mon fichier
for line in open(fic_blast):
nligne+=1
line=line.strip()
line=line.split()
contig1=line[0]
contig2=line[1]
if contig1==contig2:
continue
# Si les 2 contigs ont déja été traités, alors rien d'autre à faire
if contig1 in contig_trouves and contig2 in contig_trouves:
continue
# Si aucun des 2 n'a été trouvés, je vais devoir faire un nouveau groupe
if contig1 not in contig_trouves and contig2 not in contig_trouves:
#Ma nouvelle valeur de num est mon numéro de groupe
num+=1
#Je note que mes 2 contigs appartiennent a mon groupe numéro num
numero_apartenance[contig1]=num
numero_apartenance[contig2]=num
#Je crée une nouvelle liste avec seulement ces 2 contigs et je l'ajoute à ma liste des groupes trouvées
groupe=[]
groupe.append(contig1)
groupe.append(contig2)
liste_des_groupes.append(groupe)
#Je n'oublie pas de noté que ces 2 contigs ont déja été trouvés
contig_trouves.append(contig1)
contig_trouves.append(contig2)
#Si seul le contig 1 a été trouvé, alors je dois ajouter le contig 2 au même groupe que le 1
if contig1 in contig_trouves and contig2 not in contig_trouves:
#Je retrouve le numéro de groupe du contig 1
val=numero_apartenance[contig1]
#Et j'ajoute le contig 2 à ce groupe
liste_des_groupes[val-1].append(contig2)
#Je n'oublie pas d'indiquer que le contig2 a été trouvé, et je lui donne son numéro de groupe
contig_trouves.append(contig2)
numero_apartenance[contig2]=val
#Réciproque Si seul le contig 2 a été trouvé
if contig2 in contig_trouves and contig1 not in contig_trouves:
#Je retrouve le numéro de groupe du contig 1
val=numero_apartenance[contig2]
#Et j'ajoute le contig 2 à ce groupe
liste_des_groupes[val-1].append(contig1)
#Je n'oublie pas d'indiquer que le contig2 a été trouvé, et je lui donne son numéro de groupe
contig_trouves.append(contig1)
numero_apartenance[contig1]=val
print("\n\nNombre de ligne dans le resultat de blast = "+str(nligne))
print("Nombre de famille trouvées = "+str(num)+"\n\n")
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Impression de la liste des groupes sous une sorte de format fasta
tmp=open(out , "w" )
num=0
for i in range(0,len(liste_des_groupes)):
num+=1
tmp.write(">groupe_"+str(num)+"\n")
for v in liste_des_groupes[i] :
tmp.write(v+"\n")