dockonsurf / modules / generation_conformeres.py @ 86112fec
Historique | Voir | Annoter | Télécharger (4,49 ko)
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 |
|
36 |
m = Chem.MolFromMolFile('%s/%s.mol' % (Molecule_path, mol_input)) #lecture du fichier d'entree |
37 |
|
38 |
writer = Chem.SDWriter('%s/%s_confs.mol' % (Molecule_results_path, mol_input))
|
39 |
|
40 |
m = Chem.AddHs(m) #ajout des hydrogenes a la molecule
|
41 |
m.SetProp("_Name","%s" % mol_input) #ajout du nom de la molecule |
42 |
L = AllChem.EmbedMultipleConfs(m, numConfs=n) #liste des identifiants des n differents conformeres
|
43 |
|
44 |
for i in L: |
45 |
AllChem.UFFOptimizeMolecule(m, confId=i) #optimisation de la molecule pour un identifiant de conformere donne
|
46 |
writer.write(m, confId=i) #ecriture de la geometrie du conformere dans le fichier de sortie
|
47 |
|
48 |
writer.close() |
49 |
|
50 |
|
51 |
#####################################
|
52 |
#Detection des conformeres identiques
|
53 |
#####################################
|
54 |
|
55 |
|
56 |
print 'Detection of identical conformers' |
57 |
|
58 |
liste_suppr = [] |
59 |
|
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.GetBestRMS(m, m, prbId=b, refId=a) |
67 |
if valeur < 0.01: #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 |
|