Calcul distance genomique/proteique
Bonjour,
Voila j'ai un souci algorthmique, je m'explique:
Je fais un exemple:
Je prends une proteine coco1 4 14
Je dois aller faire une collection de distance proteique a partir des distances genomiques:
coco 10..39,100..129
ainsi je fais coco1 aa-> codon
ce qui fait concretement:je rajoute +3 a chaque fois
1->10
2->13
3->16
4->19
...
11->39
12->112(100+12)
13->115
14->118
jusqua la fin
ainsi je dois faire la concordance maintenant a partir de mon dico rempli coco1 4 11 je dois dire coco1 4->19 et la position final 11->39
Voila les deux fichiers que j'utilise
Code:
1 2 3 4 5
|
C169v2-00001 Aster-03513 64 112 1192 1246
C169v2-00002 Aster-03154 2 83 172 264
C169v2-00003 Aster-06252 74 116 57 96
C169v2-00004 Aster-05984 1 218 24 243 |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
# Colonne 1: scaffold
# 2: gene id
# 3: start
# 4: dir
# 5: origine gene model
# 6: proteinId
# 7: ex-nom
# 8: coordonnees genomiques
# 9: structure intron/exon
# 10: segments du CDS couvert par EST
C169-scaffold_1 C169v2-00001 3777 - ORIGINAL JGI 55057 Genemark1.1_g 3777..3857,4046..4192,4443..4561,4940..5234,5406..5540,5734..5847,6009..6098,6421..6492
C169-scaffold_1 C169v2-00002 12682 - ORIGINAL JGI 55058 Genemark1.2_g 12682..12691,13195..13445,13694..13711
C169-scaffold_1 C169v2-00003 18095 + ORIGINAL JGI 31905 fgenesh1_kg.1_#_1_#_4092_1_CBOZ_CBPA 18095..18097,18280..18410,18690..18972
C169-scaffold_1 C169v2-00004 20452 + ORIGINAL JGI 6968 gw1.1.615.1 20452..20496,20636..20726,20881..21046,21194..21382,21567..21735 |
Le premier fichier ces les positions pour chaque proteine
par exemple pour C169v2-00001 64 112
et pour Aster-03513 1192 1246.
et le deuxieme fichier ce sont les coordonnes genomiques que je remplis dans le dico en faisant +3
voici mon code:
Code:
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
|
#! /usr/bin/python
#coding=utf-8
d = {}
def search(idt,filename):
with open(filename) as fichier:
for line in fichier:
if line[0]!='#':
tab= line.split('\t')
#print tab
if(idt==tab[1]):
return tab[7]
return False
with open('test.txt') as fichier:
for line in fichier:
index = line.split('\t')
#print index
s=search(index[0],'Coccomyxa_C169_v2_ORDERED-LIST-OF-CDS')
tabs=s.split(",")
flag=0
for l in tabs:
mini,maxi=l.split("..")
if flag==0:
tmp=int(mini)
cpt=1
while(tmp!=int(maxi)):
d[cpt]=tmp
#print tmp
tmp=tmp+3
cpt=cpt+1
flag=1
else:
tmp=int(mini)+cpt
#print tmp
while (tmp!=int(maxi)):
d[cpt]=tmp
tmp=tmp+3
cpt=cpt+1
if index[2] in d.keys() and index[3] in d.keys():
print d[index[2]] |
Le souci que j'ai ce que pour un long fichier ca prend plus de temps et ma boucle ne s'arrete pas en remplissant mon dico.
Est ce que vous avez une idee plus simple, car a chaque fois que je lance le programme ca me plante l'ordi lol !
Je pense que le souci vient du else: car j'ai fait des tests mais ca plante dans la boucle
Car on m'ai dit que c'est simple en perl mais je m'y connais pas du tout
Merci