Advertisement
Guest User

Version 1.0.6

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