Ce projet a pour objectif de minimiser l'énergie potentielle d'une molécule d'eau en utilisant une approche de descente de gradient, avec deux méthodes possibles pour le calcul du gradient. L'approche analytique repose sur des expressions mathématiques exactes du gradient, permettant une optimisation plus rapide et précise. L'approche numérique, quant à elle, utilise des différences finies pour approximer le gradient et s'avère utile lorsque les expressions analytiques ne sont pas disponibles.
L'optimisation est réalisée à l'aide de l'algorithme de Steepest Descent, qui met à jour les coordonnées atomiques en suivant la direction opposée au gradient de l'énergie, avec un pas d'apprentissage ajustable. En ajustant les longueurs de liaison et les angles de la molécule d'eau, cette méthode permet d'atteindre une configuration stable, correspondant à un minimum d'énergie potentielle.
Ce projet inclut les fonctions suivantes :
extract_coord_pdb(pdbfile: str): Extrait les coordonnées atomiques d'un fichier PDB.calc_len_angle(coordinates: np.ndarray): Calcule les longueurs de liaison et les angles entre les atomes de la molécule.calc_pot_energy(len1: float, len2: float, angle: float): Calcule l'énergie potentielle de la molécule basée sur les longueurs de liaison et les angles.minimize_energy_analytical(pdbfile: str): Effectue la minimisation d'énergie en utilisant un algorithme de descente de gradient.calculate_gradient_analytical(coordinates: np.ndarray): Calcule le gradient analytique de l'énergie par rapport aux coordonnées atomiques.save_history(history: dict, filename: str = "history.txt"): Sauvegarde l'historique des itérations et des coordonnées dans un fichier.write_pdb(history: dict): Écrit les coordonnées atomiques minimisées dans un fichier PDB.generate_vmd_script(): Génère un script VMD pour visualiser la molécule.plot_angle(ax, origin, angle, size=50, unit="points", **kwargs): Ajoute une annotation d'angle à un graphique 3D.plot_molecule_3d(pdbfile: str, minimized_pdb: str): Trace la molécule en 3D avant et après minimisation avec des annotations de longueurs de liaison et d'angles.plot_energies(history: dict): Trace l'évolution des énergies au cours de la minimisation.generate_vmd_movie(directory : str ): Génère un film VMD à partir des coordonnées atomiques.
Pour exécuter ce projet, vous devez avoir Python installé sur votre machine ainsi que les packages suivants :
Python(version 3.x recommandée) : Langage de programmation nécessaire pour exécuter le script.numpy: Pour les opérations mathématiques et la manipulation des tableaux.matplotlib: Pour tracer les graphiques.tqdm: Pour la barre de progressionPillow(PIL)ffmpeg(encoder x264) : Pour la gestion des images et vidéos
Si Python n'est pas installé, vous pouvez le télécharger depuis le site officiel : Python.org.
Vous pouvez installer les packages requis en utilisant pip :
pip install numpy matplotlib tqdm Pillow
conda install ffmpeg
brew install ffmpegPour naviguer dans le système de fichiers Unix et exécuter les scripts, vous pouvez utiliser les commandes suivantes :
- Lister les fichiers et dossiers :
ls - Changer de répertoire :
cd <nom_du_dossier> - Afficher le contenu d'un fichier :
cat <nom_du_fichier>ouless <nom_du_fichier> - Exécuter un script Python :
python <nom_du_script>.py
VMD (Visual Molecular Dynamics) est un logiciel de visualisation moléculaire. Voici comment l'utiliser sur différents systèmes d'exploitation :
-
Téléchargement et Installation :
- Téléchargez VMD depuis le site officiel : VMD Download.
- Suivez les instructions d'installation fournies pour votre système d'exploitation.
-
Lancer VMD :
- Ouvrez un terminal et naviguez jusqu'au répertoire où VMD est installé.
- Lancez VMD en utilisant la commande :
vmd
-
Charger un fichier PDB :
- Dans VMD, utilisez la commande
mol new <nom_du_fichier>.pdbpour charger le fichier PDB généré.
- Dans VMD, utilisez la commande
-
Téléchargement et Installation :
- Téléchargez VMD depuis le site officiel : VMD Download.
- Suivez les instructions d'installation fournies pour Windows.
-
Lancer VMD :
- Double-cliquez sur l'icône VMD ou recherchez "VMD" dans le menu Démarrer et lancez l'application.
-
Charger un fichier PDB :
- Dans VMD, utilisez la commande
mol new <nom_du_fichier>.pdbpour charger le fichier PDB généré.
- Dans VMD, utilisez la commande
La minimisation peut être effectuée en utilisant l'approche numérique ou l'approche analytique, en fonction de la méthode souhaitée :
python mini_numerical.py data/water_bis.pdb thresholdOU
python mini_analytical.py data/water_bis.pdb thresholdL'utilisateur peut spécifier une valeur pour le seuil du GRMS (threshold). Si aucune valeur n'est fournie, la valeur par défaut de 0.5 kcal/mol/Å sera utilisée.
Le fichier PDB water_bis.pdb contient un exemple de coordonnées pour la molécule d'eau. Le fichier doit être au format suivant :
ATOM 1 O TIP3 A 1 -0.765 -0.097 0.010 1.00 0 O
ATOM 2 H TIP3 A 1 -0.222 0.691 0.024 1.00 0 H
ATOM 3 H TIP3 A 1 -2.138 -0.819 -0.035 1.00 0 H
CONECT 1 2 3
A l'issue vous obtiendez :
- Des informations sur les coordonnées initiales et finales, les longueurs de liaison, les angles, et l'énergie potentielle avant et après minimisation.
- Un fichier
visualize.vmddans le dossierresults, que vous pouvez utiliser pour visualiser la molécule dans VMD. - Une visualisation 3D de la molécule avant et après minimisation enregistré sous
results/molecule_3d_plot.png. - Le graphique de l'évolution des énergies au cours de la minimisation enregistré sous
results/energy_plot.png. - Le film et le gif de la minimisation enregistré sous
results/minimisation.mp4
Vous pouvez modifier différents paramètres de minimisation dans le programme principal du script. Voici à quoi ils correspondent :
h:Petite valeur utilisée pour le calcul du gradient numérique.step_size: Taille du pas pour la mise à jour des coordonnées pendant la minimisation.threshold: Seuil de convergence pour la racine carrée moyenne du gradient (GRMS). L'optimisation s'arrête lorsque la GRMS est inférieure à ce seuil.max_iterations:Nombre maximal d'itérations autorisé pour éviter les boucles infinies.k_bond: Constante de force pour le calcul de l'énergie de liaison.i_eq:Distance d'équilibre pour les longueurs de liaison.k_angle: Constante de force pour le calcul de l'énergie angulaire.theta_eq: Angle d'équilibre en degrés.
L'ensemble des résultats seront présents dans un dossier result suivi du nom du fichier pdb.
Seuil GRMS par défaut : 0.5 kcal/mol/A
--- Avant Minimisation ---
Coordonnées extraites :
[[-0.765 -0.097 0.01 ]
[-0.222 0.691 0.024]
[-2.138 -0.819 -0.035]]
Longueur O-H1 : 0.9571 Ã…
Longueur O-H2 : 1.5519 Ã…
Angle H1-O-H2 : 152.3008 degrés
Énergie potentielle : 1.9740e+02 kcal/mol
Gradient numérique :
[[ 403.66750508 402.73478699 -4.11878468]
[ 91.10193458 -86.72423754 5.97888125]
[-494.78405398 -316.02983441 -1.86009639]]
--- Après Minimisation ---
Nombre d'itérations : 802
Énergie potentielle : 3.19e-03 kcal/mol
GRMS : 4.95074e-01 kcal/(mol·Å)
Angle après minimisation : 104.9240 degrés
Longueur de liaison l1 : 0.9578 Ã…
Longueur de liaison l2 : 0.9580 Ã…
Plot des énergies enregistré sous : results_water_bis/energy_plot.png
--- Sauvegarde des résultats ---
Historique sauvegardé dans : results_water_bis/history.txt
Fichier PDB généré : minimized.pdb
Script VMD généré : results_water_bis/visualize.vmd
Graphique enregistré sous : results_water_bis/3D_plot.png
Fichier Multi-PDB généré : results_water_bis/multi_minimized.pdb
--- Création du Movie --
Script VMD généré : results_water_bis/movie.vmd
Exécution de VMD pour capturer les frames...
Conversion des images TGA en PNG...
Conversion TGA -> PNG: 100%|██████████████████████████████████████████████████| 803/803 [00:08<00:00, 89.32image/s]
Conversion TGA -> PNG terminée.
Génération de la vidéo MP4...
Encodage vidéo: 100%|█████████████████████████████████████████████████████████| 100/100 [00:00<00:00, 213.47%/s]
Vidéo générée : results_water_bis/minimization.mp4
Génération du GIF...
Encodage GIF: 100%|███████████████████████████████████████████████████████████| 100/100 [00:02<00:00, 44.77%/s]
GIF généré : results_water_bis/minimization.gif
Suppression des frames : results_water_bis/frames
Minimisation et génération des fichiers terminées avec succès !