Statistics
| Branch: | Tag: | Revision:

dockonsurf / modules / generation_conformeres.py @ e75a54af

History | View | Annotate | Download (4.5 kB)

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3

    
4

    
5
##############################################################################
6
#                                                                            #
7
#  Recherche de n conformeres a partir d'un fichier .mol, optimisation UFF   # 
8
#                                                                            #
9
#  fonctionne avec 2 arguments :                                             #
10
#  - nom de la molecule (aussi nom du fichier d'entree sans .mol)            #
11
#  - nombre de conformeres                                                   #
12
#                                                                            #
13
##############################################################################
14

    
15
###########################
16
#Generation des conformeres
17
###########################
18

    
19

    
20
#importation des modules nécessaires
21
import sys
22
import rdkit
23
import os
24
import glob
25
from rdkit import Chem
26
from rdkit.Chem import AllChem
27

    
28
Molecule_results_path=os.environ.get('Molecule_results_path')
29
Molecule_path=os.environ.get('Molecule_path')
30

    
31
print 'Conformer generation'
32

    
33
mol_input = sys.argv[1]  #nom du fichier d'entree
34
n = int(sys.argv[2])  #nombre de conformeres
35
rmsd_threshold = float(sys.argv[3])
36

    
37
m = Chem.MolFromMolFile('%s/%s.mol' % (Molecule_path, mol_input))  #lecture du fichier d'entree
38

    
39
writer = Chem.SDWriter('%s/%s_confs.mol' % (Molecule_results_path, mol_input))
40

    
41
m = Chem.AddHs(m)  #ajout des hydrogenes a la molecule
42
m.SetProp("_Name","%s" % mol_input)  #ajout du nom de la molecule
43
L = AllChem.EmbedMultipleConfs(m, numConfs=n)  #liste des identifiants des n differents conformeres
44

    
45
for i in L:
46
    AllChem.UFFOptimizeMolecule(m, confId=i)  #optimisation de la molecule pour un identifiant de conformere donne
47
    writer.write(m, confId=i)  #ecriture de la geometrie du conformere dans le fichier de sortie
48

    
49
writer.close()
50

    
51

    
52
#####################################
53
#Detection des conformeres identiques
54
#####################################
55

    
56

    
57
print 'Detection of identical conformers'
58

    
59
liste_suppr = []
60
for a in range(0,n): 
61
    for b in range (a+1,n):
62
        if a in liste_suppr:
63
            break
64
        else :
65
            if a != b :
66
                valeur = AllChem.GetConformerRMS(m, a, b, prealigned=False) 
67
                if valeur < rmsd_threshold: #valeur de RMSD limite en dessous de laquelle les conformeres sont consideres comme identiques
68
                    liste_suppr.append(a)
69

    
70

    
71
#################################
72
#Separation en plusieurs fichiers 
73
#################################
74

    
75

    
76
#fait uniquement pour les conformeres differents
77

    
78
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
    os.mkdir('%s/%s_confs' % (Molecule_results_path, mol_input))  #creation du dossier si inexistant
80
else :
81
    liste=glob.glob('%s/%s_confs/*.mol' % (Molecule_results_path, mol_input))
82
    for file in liste:
83
        os.remove(file)
84

    
85

    
86
i = 1
87
liste_ok = []
88
liste_non_ok = []
89

    
90
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
lg = nb_lines/n #calcul du nombre de lignes pour un conformere
92

    
93
for j in range(0,n):
94
    if j not in liste_suppr :
95
        liste_ok.append(j)
96
        l = 1 #compteur du numero de ligne
97
        lg_init = 1 + lg * j  #numero de la ligne a laquelle la structure du conformere commence
98
        lg_fin = lg * (j + 1) #numero de la ligne a laquelle la structure du conformere termine
99
        line = open('%s/%s_confs.mol' % (Molecule_results_path, mol_input)).readline()
100
        with open('%s/%s_confs.mol' % (Molecule_results_path, mol_input)) as fp:
101
            #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
            for line in fp :
103
                if l <= lg_fin :
104
                    if l >= lg_init :
105
                        file = open('%s/%s_confs/%s_%s.mol' % (Molecule_results_path, mol_input, mol_input, i),"a")
106
                        file.write(line)
107
                        file.close()
108
                    l += 1
109
                else :
110
                    break
111
        i += 1
112
    else:
113
        liste_non_ok.append(j)
114

    
115
os.remove('%s/%s_confs.mol' % (Molecule_results_path, mol_input))
116

    
117

    
118
print ('number of removed conformers : %s' % (len(liste_non_ok)))
119
#print liste_non_ok
120
print ('number of conformers considered as different : %s' % (len(liste_ok)))
121