Advertisement
Guest User

python version 1.0.6

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