Statistiques
| Branche: | Tag: | Révision :

dockonsurf / modules / generation_conformeres.py @ 86112fec

Historique | Voir | Annoter | Télécharger (4,49 ko)

1 86112fec Marti Aliod Carles
#!/usr/bin/env python
2 86112fec Marti Aliod Carles
# -*- coding: utf-8 -*-
3 86112fec Marti Aliod Carles
4 86112fec Marti Aliod Carles
5 86112fec Marti Aliod Carles
##############################################################################
6 86112fec Marti Aliod Carles
#                                                                            #
7 86112fec Marti Aliod Carles
#  Recherche de n conformeres a partir d'un fichier .mol, optimisation UFF   # 
8 86112fec Marti Aliod Carles
#                                                                            #
9 86112fec Marti Aliod Carles
#  fonctionne avec 2 arguments :                                             #
10 86112fec Marti Aliod Carles
#  - nom de la molecule (aussi nom du fichier d'entree sans .mol)            #
11 86112fec Marti Aliod Carles
#  - nombre de conformeres                                                   #
12 86112fec Marti Aliod Carles
#                                                                            #
13 86112fec Marti Aliod Carles
##############################################################################
14 86112fec Marti Aliod Carles
15 86112fec Marti Aliod Carles
###########################
16 86112fec Marti Aliod Carles
#Generation des conformeres
17 86112fec Marti Aliod Carles
###########################
18 86112fec Marti Aliod Carles
19 86112fec Marti Aliod Carles
20 86112fec Marti Aliod Carles
#importation des modules nécessaires
21 86112fec Marti Aliod Carles
import sys
22 86112fec Marti Aliod Carles
import rdkit
23 86112fec Marti Aliod Carles
import os
24 86112fec Marti Aliod Carles
import glob
25 86112fec Marti Aliod Carles
from rdkit import Chem
26 86112fec Marti Aliod Carles
from rdkit.Chem import AllChem
27 86112fec Marti Aliod Carles
28 86112fec Marti Aliod Carles
Molecule_results_path=os.environ.get('Molecule_results_path')
29 86112fec Marti Aliod Carles
Molecule_path=os.environ.get('Molecule_path')
30 86112fec Marti Aliod Carles
31 86112fec Marti Aliod Carles
print 'Conformer generation'
32 86112fec Marti Aliod Carles
33 86112fec Marti Aliod Carles
mol_input = sys.argv[1]  #nom du fichier d'entree
34 86112fec Marti Aliod Carles
n = int(sys.argv[2])  #nombre de conformeres
35 86112fec Marti Aliod Carles
36 86112fec Marti Aliod Carles
m = Chem.MolFromMolFile('%s/%s.mol' % (Molecule_path, mol_input))  #lecture du fichier d'entree
37 86112fec Marti Aliod Carles
38 86112fec Marti Aliod Carles
writer = Chem.SDWriter('%s/%s_confs.mol' % (Molecule_results_path, mol_input))
39 86112fec Marti Aliod Carles
40 86112fec Marti Aliod Carles
m = Chem.AddHs(m)  #ajout des hydrogenes a la molecule
41 86112fec Marti Aliod Carles
m.SetProp("_Name","%s" % mol_input)  #ajout du nom de la molecule
42 86112fec Marti Aliod Carles
L = AllChem.EmbedMultipleConfs(m, numConfs=n)  #liste des identifiants des n differents conformeres
43 86112fec Marti Aliod Carles
44 86112fec Marti Aliod Carles
for i in L:
45 86112fec Marti Aliod Carles
    AllChem.UFFOptimizeMolecule(m, confId=i)  #optimisation de la molecule pour un identifiant de conformere donne
46 86112fec Marti Aliod Carles
    writer.write(m, confId=i)  #ecriture de la geometrie du conformere dans le fichier de sortie
47 86112fec Marti Aliod Carles
48 86112fec Marti Aliod Carles
writer.close()
49 86112fec Marti Aliod Carles
50 86112fec Marti Aliod Carles
51 86112fec Marti Aliod Carles
#####################################
52 86112fec Marti Aliod Carles
#Detection des conformeres identiques
53 86112fec Marti Aliod Carles
#####################################
54 86112fec Marti Aliod Carles
55 86112fec Marti Aliod Carles
56 86112fec Marti Aliod Carles
print 'Detection of identical conformers'
57 86112fec Marti Aliod Carles
58 86112fec Marti Aliod Carles
liste_suppr = []
59 86112fec Marti Aliod Carles
60 86112fec Marti Aliod Carles
for a in range(0,n): 
61 86112fec Marti Aliod Carles
    for b in range (a+1,n):
62 86112fec Marti Aliod Carles
        if a in liste_suppr:
63 86112fec Marti Aliod Carles
            break
64 86112fec Marti Aliod Carles
        else :
65 86112fec Marti Aliod Carles
            if a != b :
66 86112fec Marti Aliod Carles
                valeur = AllChem.GetBestRMS(m, m, prbId=b, refId=a) 
67 86112fec Marti Aliod Carles
                if valeur < 0.01: #valeur de RMSD limite en dessous de laquelle les conformeres sont consideres comme identiques
68 86112fec Marti Aliod Carles
                    liste_suppr.append(a)
69 86112fec Marti Aliod Carles
70 86112fec Marti Aliod Carles
71 86112fec Marti Aliod Carles
#################################
72 86112fec Marti Aliod Carles
#Separation en plusieurs fichiers 
73 86112fec Marti Aliod Carles
#################################
74 86112fec Marti Aliod Carles
75 86112fec Marti Aliod Carles
76 86112fec Marti Aliod Carles
#fait uniquement pour les conformeres differents
77 86112fec Marti Aliod Carles
78 86112fec Marti Aliod Carles
if not os.path.exists('%s/%s_confs' % (Molecule_results_path, mol_input)):  #verification de l'existance du dossier dans lequel les n fichiers seront ecrits
79 86112fec Marti Aliod Carles
    os.mkdir('%s/%s_confs' % (Molecule_results_path, mol_input))  #creation du dossier si inexistant
80 86112fec Marti Aliod Carles
else :
81 86112fec Marti Aliod Carles
    liste=glob.glob('%s/%s_confs/*.mol' % (Molecule_results_path, mol_input))
82 86112fec Marti Aliod Carles
    for file in liste:
83 86112fec Marti Aliod Carles
        os.remove(file)
84 86112fec Marti Aliod Carles
85 86112fec Marti Aliod Carles
86 86112fec Marti Aliod Carles
i = 1
87 86112fec Marti Aliod Carles
liste_ok = []
88 86112fec Marti Aliod Carles
liste_non_ok = []
89 86112fec Marti Aliod Carles
90 86112fec Marti Aliod Carles
nb_lines = sum(1 for line in open('%s/%s_confs.mol' % (Molecule_results_path, mol_input))) #lecture du nombre de lignes total du fichier contenant les n conformeres
91 86112fec Marti Aliod Carles
lg = nb_lines/n #calcul du nombre de lignes pour un conformere
92 86112fec Marti Aliod Carles
93 86112fec Marti Aliod Carles
for j in range(0,n):
94 86112fec Marti Aliod Carles
    if j not in liste_suppr :
95 86112fec Marti Aliod Carles
        liste_ok.append(j)
96 86112fec Marti Aliod Carles
        l = 1 #compteur du numero de ligne
97 86112fec Marti Aliod Carles
        lg_init = 1 + lg * j  #numero de la ligne a laquelle la structure du conformere commence
98 86112fec Marti Aliod Carles
        lg_fin = lg * (j + 1) #numero de la ligne a laquelle la structure du conformere termine
99 86112fec Marti Aliod Carles
        line = open('%s/%s_confs.mol' % (Molecule_results_path, mol_input)).readline()
100 86112fec Marti Aliod Carles
        with open('%s/%s_confs.mol' % (Molecule_results_path, mol_input)) as fp:
101 86112fec Marti Aliod Carles
            #si la ligne est comprise entre la ligne a laquelle la structure du conformere commence et la ligne a laquelle elle termine alors cette ligne est copiee dans le fichier correspondant au numero du conformere
102 86112fec Marti Aliod Carles
            for line in fp :
103 86112fec Marti Aliod Carles
                if l <= lg_fin :
104 86112fec Marti Aliod Carles
                    if l >= lg_init :
105 86112fec Marti Aliod Carles
                        file = open('%s/%s_confs/%s_%s.mol' % (Molecule_results_path, mol_input, mol_input, i),"a")
106 86112fec Marti Aliod Carles
                        file.write(line)
107 86112fec Marti Aliod Carles
                        file.close()
108 86112fec Marti Aliod Carles
                    l += 1
109 86112fec Marti Aliod Carles
                else :
110 86112fec Marti Aliod Carles
                    break
111 86112fec Marti Aliod Carles
        i += 1
112 86112fec Marti Aliod Carles
    else:
113 86112fec Marti Aliod Carles
        liste_non_ok.append(j)
114 86112fec Marti Aliod Carles
115 86112fec Marti Aliod Carles
os.remove('%s/%s_confs.mol' % (Molecule_results_path, mol_input))
116 86112fec Marti Aliod Carles
117 86112fec Marti Aliod Carles
118 86112fec Marti Aliod Carles
print ('number of removed conformers : %s' % (len(liste_non_ok)))
119 86112fec Marti Aliod Carles
#print liste_non_ok
120 86112fec Marti Aliod Carles
print ('number of conformers considered as different : %s' % (len(liste_ok)))