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))) |