Advertisement
Guest User

V1.0.7

a guest
Nov 26th, 2014
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.37 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # -*- coding: utf8 -*-
  3.  
  4. """
  5. Ce script permet de calculer le coefficient de diffusion d'une molécule d'eau
  6. dans une boîte de type... .
  7. """
  8.  
  9. __author__ = "Mélanie Garnier, Anita Annamale"
  10. __version__ = "1.0.7"
  11. __copyright__ = "copyleft"
  12. __date__ = "2014/11"
  13.  
  14. import re
  15. import os
  16. import numpy as np
  17.  
  18.  
  19. def nombre_atomes(file_gro):
  20.     """
  21.    """
  22.  
  23.     # allons dans le dossier qui contient le fichier .gro
  24.     os.chdir("./..")
  25.  
  26.     taille_systeme = 0;
  27.     # regex pour le nombre d'atomes total
  28.     taille_systeme_re = re.compile("^[0-9]{1,}")
  29.  
  30.     with open(file_gro, 'r') as filin:
  31.         # pour chaque ligne
  32.         for line in filin:
  33.             # si search(line) trouve la regex, on la prend
  34.             if taille_systeme_re.search(line):
  35.                 taille_systeme = int(line[0:])
  36.     # retour dans le dossier des pdb
  37.     os.chdir("./pdbs")
  38.     return taille_systeme
  39.  
  40.  
  41.  
  42. def coord_pdb(file_pdb):
  43.     """
  44.    Fonction qui extrait les coordonnées x,y,z d'un fichier pdb.
  45.    """
  46.  
  47.     ligne_re = re.compile('ATOM {0,6}[0-9]{1,5}  OW')
  48.     coord_list = []
  49.  
  50.     with open(file_pdb, 'r') as filin:
  51.         for line in filin:
  52.             # pour chaque ligne :
  53.             match = ligne_re.search(line)
  54.             if match:
  55.                 # VÉRIFIER SI C'EST BON
  56.                 coord_x = float(line[30:38])
  57.                 coord_y = float(line[38:46])
  58.                 coord_z = float(line[47:54])
  59.                 coord_list.append((coord_x,coord_y,coord_z))
  60.  
  61.     # on vérifie qu'on a trouvé le bon nombre de coordonnées
  62.     # 3 atomes pour une coordonnée d'une molécule d'eau
  63.     if nombre_atomes("md.part0002.gro") == (len(coord_list)*3):
  64.         return coord_list
  65.     else:
  66.         exit(1)
  67.  
  68.  
  69.  
  70. def soustraction_coord(nom_dossier,tmax,deltaT):
  71.     """
  72.    """
  73.  
  74.     os.chdir("%s/pdbs" %nom_dossier)
  75.  
  76.     # remplir la première fois la liste :
  77.  
  78.     # coordonnées du fichier pdb n° i
  79.     coord_list_T = coord_pdb("traj{}.pdb".format(0))
  80.     # coordonnées du fichier pdb n° j
  81.     coord_list_deltaT = coord_pdb("traj{}.pdb".format(deltaT))
  82.  
  83.     # conversion des listes en type array de numpy
  84.     coord_T = np.array(coord_list_T, float)
  85.     coord_deltaT = np.array(coord_list_deltaT, float)
  86.  
  87.     # soustraction et PASSAGE EN LISTE ???
  88.     soust = coord_T - coord_deltaT
  89.     soust = [soust]
  90.  
  91.     # on parcourt tous les fichiers de 1 à tmax - deltaT
  92.     # car on ne peut pas trouver de fichier à un t + deltaT donné
  93.     # si t est plus grand que tmax - deltaT
  94.     # on ajoute 1 car xrange exclue la borne de fin
  95.     for t in xrange(1, tmax - deltaT + 1):
  96.  
  97.         dt = t + deltaT
  98.  
  99.         # coordonnées du fichier pdb n° i
  100.         coord_list_T = coord_pdb("traj{}.pdb".format(t))
  101.         # coordonnées du fichier pdb n° j
  102.         coord_list_deltaT = coord_pdb("traj{}.pdb".format(dt))
  103.  
  104.         # conversion des listes en type array de numpy
  105.         coord_T = np.array(coord_list_T, float)
  106.         coord_deltaT = np.array(coord_list_deltaT, float)
  107.  
  108.         # soustraction -> POURQUOI PAS PAREIL QUE DANS i == 0 ?
  109.         diff = coord_T - coord_deltaT
  110.         soust = np.append(soust, [diff], axis = 0)
  111.  
  112.     # retour au dossier d'origine
  113.     os.chdir("./../..")
  114.  
  115.     return soust
  116.  
  117.  
  118. def au_carre_coord(diff_coordonnee):
  119.     """
  120.    """
  121.  
  122.     coord_au_carre = diff_coordonnee ** 2
  123.     return coord_au_carre
  124.  
  125.  
  126. def sum_coord(au_carre):
  127.     """
  128.    """
  129.  
  130.     # pour le premier
  131.     coord_sum = au_carre[0].sum(1)
  132.     coord_sum = [coord_sum]
  133.  
  134.     # au carré excepté le 1er
  135.     for i in au_carre[1:]:
  136.         coord_sum = np.append(coord_sum, [i.sum(1)], axis = 0)
  137.     return coord_sum
  138.  
  139.  
  140. def calcul_distance(nom_dossier,tmax,deltaT):
  141.     """
  142.    """
  143.  
  144.     # fait les soustraction des coordonnées unes à unes
  145.     soust = soustraction_coord(nom_dossier,tmax,deltaT)
  146.     # met ensuite au carré
  147.     au_carre = au_carre_coord(soust)
  148.     # puis fait la somme des x,y et z
  149.     distance = sum_coord(au_carre)
  150.  
  151.     # modification de la matrice en vecteur
  152.     largeur_matrice = len(distance)
  153.     nombre_atomeO = len(distance[0])
  154.     longueur_matrice = largeur_matrice * nombre_atomeO
  155.     distance = distance.reshape(longueur_matrice)
  156.     return distance
  157.  
  158.  
  159. def parametres():
  160.     # demande le nombre de deltaT voulu
  161.     nb_deltaT = raw_input("Combien de delta t voulez-vous utiliser pour les calculs ? ")
  162.     nb_deltaT = int(nb_deltaT)
  163.  
  164.     # demande ensuite les deltaT
  165.     deltaTs = []
  166.     for i in xrange(1, nb_deltaT + 1):
  167.         rep = raw_input("Quel sera le delta t n°%i ? " %i)
  168.         rep = int(rep)
  169.         deltaTs = deltaTs + [rep]
  170.     return deltaTs
  171.  
  172. if __name__ == '__main__':
  173.  
  174.     # demande le nom du dossier qui contient les fichiers .xtc et .gro
  175.     nom_dossier = raw_input("Dans quel dossier se trouvent les fichiers .xtc et .gro à utiliser ? [chemin relatif] ")
  176.     # demande la durée totale des mesures
  177.     tmax = raw_input("Sur quelle durée avez-vos fait vos mesures ? [en ns] ")
  178.     tmax = int(tmax)
  179.  
  180.     # prise des deltaT à utiliser
  181.     deltaTs = parametres()
  182.     # compteur
  183.     i = 0
  184.  
  185.     # pour chaque deltaT
  186.     for deltaT in deltaTs:
  187.         i = i + 1
  188.         dist_finales = calcul_distance(nom_dossier,tmax,deltaT)
  189.         print dist_finales
  190.         # sauvegarde des distances dans un fichier
  191.         np.savetxt('distances_finales_dt_%i.dat' %deltaT, dist_finales)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement