Skip to content
Snippets Groups Projects
Commit b5415f39 authored by nina.marthe_ird.fr's avatar nina.marthe_ird.fr
Browse files

ajouté le traitement des variations au milieu d'un codon et de différence de taille multiple de 3

parent ff6c5fda
No related branches found
No related tags found
No related merge requests found
from Graph_gff import Features,load_intersect
from Functions import get_segment_sequence,convert_strand
target_genome_name="genome4_chr10"
target_genome_name="genome2_chr10"
intersect_path='intersect.bed'
load_intersect(intersect_path)
pos_seg="genome4_chr10.bed"
pos_seg="genome2_chr10.bed"
var=open("genome4_chr10_variations.txt",'r')
var=open("genome2_chr10_variations.txt",'r')
gfa="graph.gfa"
def get_segments_sequence_and_paths(gfa):
......@@ -244,12 +244,6 @@ for line in lines:
cds_var[cds_id].append(line)
for feature in Features.values():
add_feature_sequence(feature,seg_seq)
def findOtherStart(cds,segments_on_target_genome):
print("\nrecherche de nouveau codon start:")
frame_shift=0
......@@ -284,30 +278,24 @@ def findOtherStart(cds,segments_on_target_genome):
version="new"
import re
for feature in Features.values():
add_feature_sequence(feature,seg_seq)
for cds_id in cds_var.keys():
cds=Features[cds_id]
print("analysing variations in cds",cds_id)
frame_shift=0
for var in cds_var[cds_id]:
type_var=var[8]
if type_var!="no_var":
# frame var ? pos_var-1 %3
if type_var!="no_var": # if there is a variation
if "/" in var[11]:
if "/" in var[11]: # if the variation has a different ref and alt size
size_var=var[11].split("/")
else:
size_var=var[11]
pos_var=int(var[12])-1
if pos_var<3:
print("codon start touché")
findOtherStart(cds,segments_on_target_genome)
# si on a plusieurs start candidats il faut choisir celui qu'on prend, ils sont pas forcément tous sur le même cadre de lecture
# comment traiter la variation sur le start ?
# après avoir détecté que la var touche le start, traiter la var ?
# how to use size_var if it can be in two different formats (list or int) ?
print(var)
if type_var=="insertion":
......@@ -324,47 +312,97 @@ for cds_id in cds_var.keys():
if pos_var%3==0: # position 3k
print("variation entre deux codons")
# simplement insertion et/ou deletion.
# délétion éventuelle
# insertion éventuelle
# dépassement éventuel sur le codon d'après si alt ET ref %3!=0.
if length_ref%3==0: # taille 3K -> pas d'impact sur l'aa en amont
if length_ref!=0:
print("deletion de",var[9])
if length_alt!=0:
print("insertion de",var[10])
else: # taille != 3k : impact sur l'aa d'avant (dans lequel on est)
print("indel puis modification d'un autre codon")
# insere+delete+modifie le codon apres
if length_alt>length_ref: # subs puis insertion
print("substitution de",length_ref,"bases")
insertion=var[10][length_ref:]
print("insertion de")
elif length_ref>length_alt:# deletion puis subs
print("substitution de",length_alt,"bases")
deletion=var[9][0:length_alt]
print("deletion de")
else: # susb
print("substitution de",length_ref,"bases")
else: # taille 3k, position !=3k
print("variation au milieu d'un codon")
if length_ref%3==0: # taille 3K -> pas d'impact sur l'aa en aval
deleted_aa=traduction(get_rna(var[9]))
inserted_aa=traduction(get_rna(var[10]))
if (length_ref!=0) & (length_alt!=0):
print("changement de",",".join(deleted_aa),"en",",".join(inserted_aa))
elif length_alt!=0:
print("insertion de",",".join(inserted_aa))
else:
print("deletion de",",".join(deleted_aa))
else: # taille != 3k : impact sur l'aa d'après.
## on peut peut-être fusionner ces deux cas (if et else courants), mais il faudra modifier
## le calcul des derniers aa ins et del parce que ça bug quand il n'y a pas d'ins ou de del
taille_del_entiere=(length_ref//3)*3
taille_ins_entiere=(length_alt//3)*3
deleted_aa=traduction(get_rna(var[9][0:taille_del_entiere])) # le +3 ajoute l'aa suivant qui est modifié en partie
inserted_aa=traduction(get_rna(var[10][0:taille_ins_entiere]))
# le +3 ne fonctionne pas. il faut aller chercher l'aa d'apres dans la séquence du cds.
# enlever le +3
# aller chercher l'emplacement de l'insertion, prendre les 3 bases après ?
posVar_on_ref=int(var[12])
reste_len=3-(length_alt%3)
reste_cds=cds.sequence[posVar_on_ref+length_ref-1:posVar_on_ref+length_ref+reste_len-1] # sequence sur le génome d'origine
reste_ins=var[10][-(length_alt%3):]
dernier_aa_ins=reste_ins+reste_cds
reste_del=var[9][-(length_ref%3):]
dernier_aa_del=reste_del+reste_cds
deleted_aa.append(traduction(get_rna(dernier_aa_del))[0])
inserted_aa.append(traduction(get_rna(dernier_aa_ins))[0])
print(dernier_aa_del,"->",dernier_aa_ins) # à supprimer. seulement le dernier aa de la délétion et de l'insertion.
print("changement de",",".join(deleted_aa),"en",",".join(inserted_aa))
else: # position !=3k, taille diff 3k
print("variation au milieu d'un codon uuu")
# récupérer le codon dans lequel on a inséré, le prendre en compte pour calculer les effets
posVar_on_ref=int(var[12])
reste_avant_len=(posVar_on_ref-1)%3
fin_aa_avant=cds.sequence[posVar_on_ref-reste_avant_len-1:posVar_on_ref-1]
print(fin_aa_avant)
complete_avant_len=3-reste_avant_len
if len(var[9]>=complete_avant_len):
aa_modifie_avant=fin_aa_avant+var[9][0:complete_avant_len]
# else il faut aller chercher dans le segment d'apres !! max un apres pcq min 1 base par segment (avant=1min, var=1min, apres=1min.)
if len(var[10])>=complete_avant_len:
aa_modifie_apres=fin_aa_avant+var[10][0:complete_avant_len]
print(aa_modifie_avant,aa_modifie_apres)
# else il faut aller chercher dans le segment d'apres !! max un apres pcq min 1 base par segment (avant=1min, var=1min, apres=1min.)
# touche le codon d'avant
# touche le codon d'apres ? pas si reste_avant_len + taille_var%3 =3
if reste_avant_len+(length_ref%3)==3:
# modifie l'aa dans lequel on a inséré+délété, puis éventuellement insere ou delete
# ne modifie pas l'aa d'après.
a=1
else:
else: # taille diff !=3k
print("frame shift")
frame_shift=(frame_shift+abs(length_alt-length_ref))%3
# cas en plus : modif de la première base du codon et de la troisième : comment prendre en compte ces deux modif pour le changement de l'aa?
# idée : quand on est sur le premier (ou deuxième??), vérifier le reste du codon avant de regarder le changement d'aa
print("\n")
if pos_var<3:
print("codon start touché")
findOtherStart(cds,segments_on_target_genome)
# si on a plusieurs start candidats il faut choisir celui qu'on prend, ils sont pas forcément tous sur le même cadre de lecture
# comment traiter la variation sur le start ?
# après avoir détecté que la var touche le start, traiter la var ? ou l'inverse
print("\n")
if version=="old":
for cds_id in cds_var.keys(): # for a gene that has cds, concatenate all cds to make a prot. then detail var by cds.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment