コード例 #1
0
def resultat_ADN(des, seq, con, compo=-1, keys=-1, plot_dispo=-1):
    # Permet d'obtenir les tableaux de resultats et les graphiques correspondants de l'annalyse de la sequence ADN.
    "Pour fonctionner ce module fait appel a cinq autres modules qui doivent se trouver dans le meme repertoire courant que lui : recuperation_sequence_fasta, lire_fasta, analyse_ADN, analyse_proteine, et creation_seq_aleatoires. Cette procedure permet d'effectuer une etude de sequence nucleique. Cette etude consiste en un calcul du pourcentage de C+G et de CpG dans la sequence entiere, et en un calcule du rapport CpG, du pourcentage de C+G, et du nombre de CpG par fenetre glissante de deux cents nucleotides ainsi qu'une conclsion sur la presence ou non d'ilots CpG. La procedure cree un a deux fichiers de sortie : un fichier tabule (pouvant etre ouvert avec un editeur de texte ou un tableur comme Excel) et une image des graphiques qu'elle engendre sous certaines conditions. Elle prend en arguments une description et la sequence correspondante au minimum. En troisieme argument elle prend la composition de la sequence (compo=) sous forme de dictionnaire, par defaut cette composition est calculee dans la procedure. De meme en quatrieme argument elle prend la liste des caracteres composants la sequence (keys=) (chacun ecrit entre guillemets), par defaut cette liste est calculee par la procedure. En dernier argument elle prend le boleen plot_dispo qui par defaut vaut True si le poste de tavail dispose de l'installation du module 'matplotlib' et False sinon, si l'utilisateur choisit d'entree plot_dispo=True en argument il doit lui meme s'assurere de cette installation au prealable, si au contraire il rentre plot_dispo=False, les graphiques ne seront pas generes."
    if compo == -1:  # Permet une utilisation dans un cas plus general dans lequel l'utilisateur ne disposerait pas de la composition de la sequnece.
        compo = an.composition(seq)

    if keys == -1:  # Permet une utilisation dans un cas plus general dans lequel l'utilisateur ne disposerait pas d'une liste des caractères composants la sequnece.
        keys = []
        for key in compo.keys():
            keys.append(key)
    #if plot_dispo==-1: # Permet une utilisation plus generale pour laquelle l'utilisateur n'aurait pas a choisir s'il souhaite ou non tracer les graphiques.
    #    plot_dispo=plt_dispo

    nom = "Analyse_seq_nucl%s\n" % (des)

    #------Envoie du nom fichier au client-------#
    nom = nom.encode()
    con.sendall(nom)
    rep = con.recv(255).decode()
    #---------------------------------------------#

    CG, pourcentCpG = an.contenu_C_et_G_et_nb_CpG(
        seq, con,
        comp=compo)  # Recuperation du pourcentage de C+G dans la sequence.
    pourcentCpG = pourcentCpG[0] / len(
        seq) * 100  # Recuperation  de nombre de "CG" dans la sequence.
    num_fenetre = []
    fichier = "\tC+G(%)\tCpG(%)"  # Redaction des entetes du tableau resultat consernant l'etude de la sequence entiere.
    resultats = "\n sequence entiere\t%.3f" % CG[
        0] + "\t%.3f" % pourcentCpG  # Puis des resultats correspondants.

    for ele in keys:
        fichier += "\t%s" % (ele)
        resultats += "\t" + str(compo[str(ele)])
    resultats = resultats.replace(".", ",")
    fichier += resultats + "\n\n"

    if len(
            seq
    ) >= 200:  # Si la longueur de la sequence est inferieure a 200 nucleotides, cette partie de l'annalyse n'a pas pu etre effectuee car elle necessite des fenetres glissantes de 200 nucleotides.
        resultats += "\n \n \nFenetres\tC+G(%)\tCpG\tRapport CpG\tIlot CpG\n"  # Redaction des entetes du tableau resultat consernant l'etude de la sequence par fenetres glissantes.
        rapportCpG, CpGfenetre, CGfenetre = an.rapport_CpG_nb_CpG_contenu_C_et_G(
            seq, con, 200
        )  # Recuperation du porcentage de C+G dans chaque fenetre, du nombre de "CG" et du rapport CpG.
        ilot_CpG = False
        plt_rapportCpG = True
        for i, ele in enumerate(
                CGfenetre
        ):  # On parcours l'une des liste de resultat de l'annalyse par fenetre, elles ont toutes la meme taille.
            num_fenetre.append(i + 1)
            if rapportCpG[i] != "NA":
                if rapportCpG[i] >= 0.6 and CGfenetre[
                        i] >= 50:  # Permet de verifier la presence d'ilot CpG.
                    ilot_CpG = True
                    resultatsfenetres = str(
                        i + 1
                    ) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                        CpGfenetre[i]
                    ) + "\t%.3f" % rapportCpG[
                        i] + "\tOui\n"  # Redaction des resultats obtenus pour la fenetre i (si presence d'un ilot CpG,cf "else" sinon)
                    # if plot_dispo:
                    #     plt.subplot(222) # Ensemble de commande permettant de faire apparaitre les ilots CpG en rouge sur les graphiques.
                    #     plt.plot([i+1],[rapportCpG[i]],'.r')
                    #     plt.subplot(224)
                    #     plt.plot([i+1],[CGfenetre[i]],'.r')
                else:
                    resultatsfenetres = str(
                        i + 1) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                            CpGfenetre[i]
                        ) + "\t%.3f" % rapportCpG[i] + "\tNon\n"
            else:
                resultatsfenetres = str(
                    i + 1) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                        CpGfenetre[i]) + "\t%s" % rapportCpG[i] + "\tNon\n"
                plt_rapportCpG = False
            resultatsfenetres = resultatsfenetres.replace(
                ".", ","
            )  # On remplace les points par des virgules pour que les valeurs soient reconnus comme des nombres par Excel
            fichier += resultatsfenetres

#-------Envoie du fichier au client-----------#
        fichier = fichier.encode()
        taille = str(len(fichier))
        con.sendall(taille.encode())
        rep = con.recv(255).decode()
        if rep == "OK":
            con.sendall(fichier)


#---------------------------------------------#

# if plot_dispo :
#     if plt_rapportCpG: # Pour ne pas afficher le graph CpG si certaine valeur de rapportCpG valent "NA".
#         plt.subplot(222) # Ensemble de commandes permettants de tracer les graphiques resultats. Ici pour determiner la place du graphique dasn la fenetre surgissante.
#         plt.title("Analyse de la presence d'ilots CpG\npour chaque fenetres glissantes de 200 nucleotides\nde la sequence") # Pour ajouter un titre.
#         plt.grid() # Pour que la grille soit apparente.
#         plt.plot(num_fenetre,rapportCpG,color='b')
#         plt.axhline(0.6, linestyle=':', color='r')
#         plt.ylabel("Rapports CpG") # Pour choisir le titre de l'axe des ordonnees.
#         if ilot_CpG:
#             plt.text(0,max(rapportCpG)-0.1, "Ilot CpG", fontsize=10,color='b',bbox=dict(boxstyle="square,pad=0.3",fc="r",ec="w", lw=2)) # Pour faire apparaitre du texte en bleu dans un cadre blanc sur fond rouge.
#         plt.subplot(224)
#     else:
#         plt.subplot(222)
#     plt.grid()
#     plt.plot(num_fenetre,CGfenetre,color='b')
#     plt.axhline(50, linestyle=':', color='r')
#     plt.xlabel("Numero des fenetres glissantes") # Permet de choisir le titre de l'axe des abcisses.
#     plt.ylabel("Pourcentages de C+G")
#     if ilot_CpG:
#         plt.text(0,max(CGfenetre)-5, "Ilot CpG", fontsize=10,color='b',bbox=dict(boxstyle="square,pad=0.3",fc="r",ec="w", lw=2))
#     fichier_existe=True # Variable permettant de verifier que le fichier qu'on va creer n'en ecrase pas un preexistant.
#     numero_fichier=0
#     while fichier_existe: # Tant que le fichier "nom_fichier.png" existe le nom change.
#         try:
#             sortie=open(nom_fichier+"(%i).png" % numero_fichier,'r') # Test si le fichier "nom_fichier.py" existe.
#         except FileNotFoundError:
#             fichier_existe=False
#         else:
#             sortie.close()
#             numero_fichier+=1
#             nom_fichier=nom_fichier.replace("(%i)" % (numero_fichier-1),"(%i)" % numero_fichier) # Si le fichier "nom_fichier.png" existe on change de nom pour ne pas l'ecraser.
#     plt.savefig(nom_fichier+"(%i).png" % numero_fichier,format='png')
#     plt.show()
    else:
        con.sendall(
            "---------------\nAttention : Execution incomplete du programme.\n\nSeule l'annalyse sur la sequence entiere a pu etre effectuee.\nLes analyses par fenetre requierent une sequence de longueur minimum 200 nucleotides.\n---------------\n"
            .encode())
        con.recv(255).decode()
        #-------Envoie du fichier au client-----------#
        fichier = fichier.encode()
        taille = str(len(fichier))
        con.sendall(taille.encode())
        rep = con.recv(255).decode()
        if rep == "OK":
            con.sendall(fichier)
コード例 #2
0
def resultat_prot(des,seq,compo,keys,plot_dispo=-1): # Permet d'obtenir les tableaux de resultats et les graphiques correspondants de l'annalyse de la sequence proteique. (Fonctionnement tres similaire a "resultat_ADN")
    "Pour fonctionner ce module fait appel a cinq autres modules qui doivent se trouver dans le meme repertoire courant que lui : recuperation_sequence_fasta, lire_fasta, analyse_ADN, analyse_proteine, et creation_seq_aleatoires. Cette procedure permet d'effectuer une etude de sequence proteique. Cette etude consiste en un calcul du nombre d'acide amines hydrophobe presents, du nombre d'acide amines charges presents, et de la charge net de la sequence entriere, et en un calcul de l'hydrophobicite moyenne dans chaque fenetre glissante de neuf acides amines. La procedure cree un a deux fichiers de sortie : un fichier tabule (pouvant etre ouvert avec un editeur de texte ou un tableur comme Excel) et une image des graphiques qu'elle engendre sous certaines conditions. Elle prend en arguments une description et la sequence correspondante au minimum. En troisieme argument elle prend la composition de la sequence (compo=) sous forme de dictionnaire, par defaut cette composition est calculee dans la procedure. De meme en quatrieme argument elle prend la liste des caracteres composants la sequence (keys=) (chacun ecrit entre guillemets), par defaut cette liste est calculee par la procedure. En dernier argument elle prend le boleen plot_dispo qui par defaut vaut True si le poste de tavail dispose de l'installation du module 'matplotlib' et False sinon, si l'utilisateur choisit d'entree plot_dispo=True en argument il doit lui meme s'assurere de cette installation au prealable, si au contraire il rentre plot_dispo=False, les graphiques ne seront pas generes." 
    if compo==-1: 
        compo=an.composition(seq)
    if keys==-1: 
        keys=[]
        for key in compo.keys():
            keys.append(key)
    if plot_dispo==-1:
        plot_dispo=plt_dispo
    nom_fichier="Annalyse_seq_prot"+des
    fichier_existe=True # Variable permettant de verifier que le fichier qu'on va creer n'en ecrase pas un preexistant.
    numero_fichier=0
    while fichier_existe: # Tant que le fichier "nom_fichier.png" existe le nom change.
        try: 
            sortie=open(nom_fichier+"(%i).py" % numero_fichier,'r') # Test si le fichier "nom_fichier.py" existe.
        except FileNotFoundError: 
            fichier_existe=False
        else:
            sortie.close()
            numero_fichier+=1
            nom_fichier=nom_fichier.replace("(%i)" % (numero_fichier-1),"(%i)" % numero_fichier)
    sortie=open(nom_fichier+"(%i).py" % numero_fichier,'a') # Ouverture du fichier resultat.
    nb_aa_hydrophobe,aa_charges,charge=ap.nb_residus_hydrophobes_et_residus_charges_et_chage_net(seq,compo) # Recuperation les resultats de l'etude de la sequence entiere.
    num_fenetre=[]
    sortie.write("\taa hydrophobes\taa charges (%)\tcharge net") # Redaction du tableau de resultat de l'etude sur la sequence entiere (sur cette ligne et les 5 suivantes).
    resultats="\n srquence entiere\t"+str(nb_aa_hydrophobe)+"\t%.3f" % aa_charges +"\t"+str(charge)
    for ele in keys:
        sortie.write("\t"+str(ele))
        resultats+="\t"+str(compo[str(ele)])
    resultats=resultats.replace(".",",")
    sortie.write(resultats)
    if len(seq)>=9: # Dans ce "if" recuperation et traitement des resultats par fenetre glissante de 9 acide amines.
        hydrophobicite=ap.hydrophobicite_moyenne(seq,9)
        sortie.write("\n \n \nFenetres\thydrophobicite moyenne\n")
        for i,ele in enumerate(hydrophobicite):
            num_fenetre.append(i+1)
            resultatsfenetres=str(i+1)+"\t%.3f" % hydrophobicite[i] +"\n"
            resultatsfenetres=resultatsfenetres.replace(".",",") # On remplace les points par des virgules pour que les valeurs soient reconnus comme des nombres par Excel
            sortie.write(resultatsfenetres)
        sortie.close()
        if plot_dispo: # Seulement si le module matplotlib est installe sur le poste de traville utilise.
            plt.subplot(212)
            plt.title("Hydrophobicite moyennes de chaque fenetre glissante de 9 acides amines de la sequence")
            plt.grid()
            plt.axhline(0, linestyle=':', color='k')
            plt.plot(num_fenetre,hydrophobicite)
            plt.xlabel("Numero des fenetres glissantes")
            plt.ylabel("hydrophobicite (Echelle de Fauchere et Peliska)")
            if max(hydrophobicite)>0:
                plt.annotate("",xy=(0.5,0), xycoords='data',xytext=(0.5,max(hydrophobicite)), textcoords='data',arrowprops=dict(arrowstyle="<->",connectionstyle="arc3",color='r'), )
                plt.text(-max(num_fenetre)/50,max(hydrophobicite)-0.2, "Partie hydrophobe", fontsize=8,color='r',rotation=85)
            if min(hydrophobicite)<0:
                plt.annotate("",xy=(0.5,0), xycoords='data',xytext=(0.5,min(hydrophobicite)), textcoords='data',arrowprops=dict(arrowstyle="<->",connectionstyle="arc3",color='b'), )
                plt.text(-max(num_fenetre)/50,0, "Partie hydrophile", fontsize=8,color='b',rotation=85)
            fichier_existe=True # Variable permettant de verifier que le fichier qu'on va creer n'en ecrase pas un preexistant.
            numero_fichier=0
            while fichier_existe: # Tant que le fichier "nom_fichier.png" existe le nom change.
                try: 
                    sortie=open(nom_fichier+"(%i).png" % numero_fichier,'r') # Test si le fichier "nom.py" existe.
                except FileNotFoundError: 
                    fichier_existe=False
                else:
                    sortie.close()
                    numero_fichier+=1
                    nom_fichier=nom_fichier.replace("(%i)" % (numero_fichier-1),"(%i)" % numero_fichier) # Si le fichier "nom_fichier.png" existe on change de nom pour ne pas l'ecraser.
            plt.savefig(nom_fichier+"(%i).png" % numero_fichier,format='png')
            plt.show()
    else:
        print("---------------\nAttention : Execution incomplete du programme.\n\nSeule l'analyse sur la sequence entiere a pu etre effectuee.\nLes annalyses par fenetre requierent une sequence de longueur minimum 9 acides amines.\n---------------")
        sortie.close()
コード例 #3
0
def resultat_ADN(des, seq, con, compo=-1, keys=-1):
    # Permet d'obtenir les tableaux de resultats et les graphiques correspondants de l'analyse de la sequence ADN.
    """Pour fonctionner, ce module fait appel a cinq autres modules qui doivent se trouver dans le meme repertoire courant que lui :
    recuperation_sequence_fasta, lire_fasta, analyse_ADN, analyse_proteine, et creation_seq_aleatoires. Cette procedure permet d'effectuer
    une etude de sequence nucleique. Cette etude consiste en un calcul du pourcentage de C+G et de CpG dans la sequence entiere, et en un 
    calcule du rapport CpG, du pourcentage de C+G, et du nombre de CpG par fenetre glissante de deux cents nucleotides ainsi qu'une conclsion 
    sur la presence ou non d'ilots CpG. La procedure cree un a deux fichiers de sortie : un fichier tabule (pouvant etre ouvert avec un editeur
    de texte ou un tableur comme Excel) et une image des graphiques qu'elle engendre sous certaines conditions. Elle prend en arguments une 
    description et la sequence correspondante au minimum. En troisieme argument elle prend la composition de la sequence (compo=) sous forme de 
    dictionnaire, par defaut cette composition est calculee dans la procedure. De meme en quatrieme argument elle prend la liste des caracteres 
    composants la sequence (keys=) (chacun ecrit entre guillemets), par defaut cette liste est calculee par la procedure."""

    if compo == -1:  # Permet une utilisation dans un cas plus general dans lequel l'utilisateur ne disposerait pas de la composition de la sequnece.
        compo = an.composition(seq)
    if keys == -1:  # Permet une utilisation dans un cas plus general dans lequel l'utilisateur ne disposerait pas d'une liste des caractères composants la sequnece.
        keys = []
        for key in compo.keys():
            keys.append(key)
    nom = "Analyse_seq_nucl_%s\n" % (des)

    #------Envoie du nom fichier au client-------#
    nom = nom.encode()
    con.sendall(nom)
    rep = con.recv(255).decode()
    #---------------------------------------------#

    CG, pourcentCpG = an.contenu_C_et_G_et_nb_CpG(
        seq, con,
        comp=compo)  # Recuperation du pourcentage de C+G dans la sequence.
    pourcentCpG = pourcentCpG[0] / len(
        seq) * 100  # Recuperation  de nombre de "CG" dans la sequence.
    num_fenetre = []
    fichier = "\tC+G(%)\tCpG(%)"  # Redaction des entetes du tableau resultat consernant l'etude de la sequence entiere.
    resultats = "\n sequence entiere\t%.3f" % CG[
        0] + "\t%.3f" % pourcentCpG  # Puis des resultats correspondants.
    for ele in keys:
        fichier += "\t%s" % (ele)
        resultats += "\t" + str(compo[str(ele)])
        resultats = resultats.replace(".", ",")
    fichier += resultats
    if len(
            seq
    ) >= 200:  # Si la longueur de la sequence est inferieure a 200 nucleotides, cette partie de l'analyse n'a pas pu etre effectuee car elle necessite des fenetres glissantes de 200 nucleotides.
        fichier += "\n \n \nFenetres\tC+G(%)\tCpG\tRapport CpG\tIlot CpG\n"  # Redaction des entetes du tableau resultat consernant l'etude de la sequence par fenetres glissantes.
        rapportCpG, CpGfenetre, CGfenetre = an.rapport_CpG_nb_CpG_contenu_C_et_G(
            seq, con, 200
        )  # Recuperation du porcentage de C+G dans chaque fenetre, du nombre de "CG" et du rapport CpG.
        ilot_CpG = False
        plt_rapportCpG = True
        for i, ele in enumerate(
                CGfenetre
        ):  # On parcours l'une des liste de resultat de l'analyse par fenetre, elles ont toutes la meme taille.
            num_fenetre.append(i + 1)
            if rapportCpG[i] != "NA":
                if rapportCpG[i] >= 0.6 and CGfenetre[
                        i] >= 50:  # Permet de verifier la presence d'ilot CpG.
                    ilot_CpG = True
                    resultatsfenetres = str(
                        i + 1
                    ) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                        CpGfenetre[i]
                    ) + "\t%.3f" % rapportCpG[
                        i] + "\tOui\n"  # Redaction des resultats obtenus pour la fenetre i (si presence d'un ilot CpG,cf "else" sinon)
                else:
                    resultatsfenetres = str(
                        i + 1) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                            CpGfenetre[i]
                        ) + "\t%.3f" % rapportCpG[i] + "\tNon\n"
            else:
                resultatsfenetres = str(
                    i + 1) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                        CpGfenetre[i]) + "\t%s" % rapportCpG[i] + "\tNon\n"
                plt_rapportCpG = False
            resultatsfenetres = resultatsfenetres.replace(
                ".", ","
            )  # On remplace les points par des virgules pour que les valeurs soient reconnus comme des nombres par Excel
            fichier += resultatsfenetres

#-------Envoie du fichier au client-----------#
        fichier = fichier.encode()
        taille = str(len(fichier))
        con.sendall(taille.encode())
        rep = con.recv(255).decode()
        if rep == "OK":
            if int(
                    taille
            ) > 30000:  # Si la taille du fichier à envoyer est supérieur à 30kb
                if int(taille) % 30000 != 0:
                    nb_file = (int(taille) //
                               30000) + 1  # Nombre de fichiers à envoyer
                    con.sendall(
                        str(nb_file).encode())  # Envoie du nombre de fichiers
                    rep = con.recv(
                        255).decode()  # Confirmation de la réception
                    for i in range(0, nb_file - 1):  # Envoi par paquet de 30kb
                        fichier_c = fichier[i * 30000:(i + 1) * 30000]
                        con.sendall(fichier_c)
                        rep = con.recv(
                            255).decode()  # Confirmation de la réception
                    last_file_size = int(taille) - (
                        (int(taille) // 30000) * 30000
                    )  # Taille du dernier block
                    last_file_size = str(last_file_size)
                    con.sendall(last_file_size.encode())  # Envoi de la taille
                    rep = con.recv(
                        255).decode()  # Confirmation de la réception
                    last_file = fichier[(
                        (int(taille) // 30000) *
                        30000):int(taille)]  # Envoi du dernier block
                    con.sendall(last_file)
                    rep = con.recv(255).decode()
                else:  # La taille des résultats est un multiple de 30000
                    nb_file = (int(taille) // 30000
                               )  # Nombre de fichiers à envoyer
                    con.sendall(
                        str(nb_file).encode())  # Envoie du nombre de fichiers
                    rep = con.recv(
                        255).decode()  # Confirmation de la réception
                    for i in range(0, nb_file):  # Envoi par paquet de 30kb
                        fichier_c = fichier[i * 30000:(i + 1) * 30000]
                        con.sendall(fichier_c)
                        rep = con.recv(
                            255).decode()  # Confirmation de la réception

            else:
                con.sendall(fichier)
                rep = con.recv(255).decode()
#---------------------------------------------#

    else:
        #---------------Mise en reseau----------------#
        con.sendall(
            "---------------\nAttention : Execution incomplete du programme.\n\nSeule l'analyse sur la sequence entiere a pu etre effectuee.\nLes analyses par fenetre requierent une sequence de longueur minimum 200 nucleotides.\n---------------\n"
            .encode())
        con.recv(255).decode()
        #---------------------------------------------#

        #-------Envoie du fichier au client-----------#
        fichier = fichier.encode()
        taille = str(len(fichier))
        con.sendall(taille.encode())
        rep = con.recv(255).decode()
        if rep == "OK":
            con.sendall(fichier)
コード例 #4
0
def resultat_ADN(des, seq, nom_fichier, numero_fichier, compo=-1, keys=-1):
    # Permet d'obtenir les tableaux de resultats et les graphiques correspondants de l'analyse de la sequence ADN.
    """Pour fonctionner, ce module fait appel a cinq autres modules qui doivent se trouver dans le meme repertoire courant que lui :
	recuperation_sequence_fasta, lire_fasta, analyse_ADN, analyse_proteine, et creation_seq_aleatoires. Cette procedure permet d'effectuer
	une etude de sequence nucleique. Cette etude consiste en un calcul du pourcentage de C+G et de CpG dans la sequence entiere, et en un 
	calcule du rapport CpG, du pourcentage de C+G, et du nombre de CpG par fenetre glissante de deux cents nucleotides ainsi qu'une conclsion 
	sur la presence ou non d'ilots CpG. La procedure cree un a deux fichiers de sortie : un fichier tabule (pouvant etre ouvert avec un editeur
	de texte ou un tableur comme Excel) et une image des graphiques qu'elle engendre sous certaines conditions. Elle prend en arguments une 
	description et la sequence correspondante au minimum. En troisieme argument elle prend la composition de la sequence (compo=) sous forme de 
	dictionnaire, par defaut cette composition est calculee dans la procedure. De meme en quatrieme argument elle prend la liste des caracteres 
	composants la sequence (keys=) (chacun ecrit entre guillemets), par defaut cette liste est calculee par la procedure."""
    sortie = open(nom_fichier + "(%i).txt" % numero_fichier, 'a')
    compo = an.composition(seq)
    keys = []
    for key in compo.keys():
        keys.append(key)

    CG, pourcentCpG = an.contenu_C_et_G_et_nb_CpG(
        seq,
        comp=compo)  # Recuperation du pourcentage de C+G dans la sequence.
    pourcentCpG = pourcentCpG[0] / len(
        seq) * 100  # Recuperation  de nombre de "CG" dans la sequence.
    num_fenetre = []
    sortie.write(
        "\tC+G(%)\tCpG(%)"
    )  # Redaction des entetes du tableau resultat consernant l'etude de la sequence entiere.

    resultats = "\n sequence entiere\t%.3f" % CG[
        0] + "\t%.3f" % pourcentCpG  # Puis des resultats correspondants.
    for ele in keys:
        sortie.write("\t%s" % (ele))
        resultats += "\t" + str(compo[str(ele)])
        resultats = resultats.replace(".", ",")
    sortie.write(resultats)
    if len(
            seq
    ) >= 200:  # Si la longueur de la sequence est inferieure a 200 nucleotides, cette partie de l'analyse n'a pas pu etre effectuee car elle necessite des fenetres glissantes de 200 nucleotides.
        sortie.write(
            "\n \n \nFenetres\tC+G(%)\tCpG\tRapport CpG\tIlot CpG\n"
        )  # Redaction des entetes du tableau resultat consernant l'etude de la sequence par fenetres glissantes.
        rapportCpG, CpGfenetre, CGfenetre = an.rapport_CpG_nb_CpG_contenu_C_et_G(
            seq, 200
        )  # Recuperation du porcentage de C+G dans chaque fenetre, du nombre de "CG" et du rapport CpG.
        ilot_CpG = False
        plt_rapportCpG = True
        for i, ele in enumerate(
                CGfenetre
        ):  # On parcours l'une des liste de resultat de l'analyse par fenetre, elles ont toutes la meme taille.
            num_fenetre.append(i + 1)
            if rapportCpG[i] != "NA":
                if rapportCpG[i] >= 0.6 and CGfenetre[
                        i] >= 50:  # Permet de verifier la presence d'ilot CpG.
                    ilot_CpG = True
                    resultatsfenetres = str(
                        i + 1
                    ) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                        CpGfenetre[i]
                    ) + "\t%.3f" % rapportCpG[
                        i] + "\tOui\n"  # Redaction des resultats obtenus pour la fenetre i (si presence d'un ilot CpG,cf "else" sinon)
                else:
                    resultatsfenetres = str(
                        i + 1) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                            CpGfenetre[i]
                        ) + "\t%.3f" % rapportCpG[i] + "\tNon\n"
            else:
                resultatsfenetres = str(
                    i + 1) + "\t%.3f" % CGfenetre[i] + "\t" + str(
                        CpGfenetre[i]) + "\t%s" % rapportCpG[i] + "\tNon\n"
                plt_rapportCpG = False
            resultatsfenetres = resultatsfenetres.replace(
                ".", ","
            )  # On remplace les points par des virgules pour que les valeurs soient reconnus comme des nombres par Excel
            sortie.write(resultatsfenetres)
            error = ""
            type_error = 0

    else:
        error = "---------------\nAttention : Execution incomplete du programme.\n\nSeule l'analyse sur la sequence entiere a pu etre effectuee.\nLes analyses par fenetre requierent une sequence de longueur minimum 200 nucleotides.\n---------------\n"
        type_error = 500
    sortie.close()
    fichier = "ok :)"
    return (fichier, error, type_error)