Statistiques
| Révision :

root / ase / io / cif.py @ 15

Historique | Voir | Annoter | Télécharger (1,65 ko)

1 1 tkerber
from math import sin, cos, pi, sqrt
2 1 tkerber
import numpy as np
3 1 tkerber
4 1 tkerber
from ase.atoms import Atoms, Atom
5 1 tkerber
from ase.parallel import paropen
6 1 tkerber
7 1 tkerber
"""Module to read and write atoms in cif file format"""
8 1 tkerber
9 1 tkerber
10 1 tkerber
def read_cif(fileobj, index=-1):
11 1 tkerber
    if isinstance(fileobj, str):
12 1 tkerber
        fileobj = open(fileobj)
13 1 tkerber
14 1 tkerber
    def search_key(fobj, key):
15 1 tkerber
        for line in fobj:
16 1 tkerber
            if key in line:
17 1 tkerber
                return line
18 1 tkerber
        return None
19 1 tkerber
20 1 tkerber
    def get_key(fobj, key, pos=1):
21 1 tkerber
        line = search_key(fobj, key)
22 1 tkerber
        if line:
23 1 tkerber
            return float(line.split()[pos].split('(')[0])
24 1 tkerber
        return None
25 1 tkerber
26 1 tkerber
    a = get_key(fileobj, '_cell_length_a')
27 1 tkerber
    b = get_key(fileobj, '_cell_length_b')
28 1 tkerber
    c = get_key(fileobj, '_cell_length_c')
29 1 tkerber
    alpha =  pi * get_key(fileobj, '_cell_angle_alpha') / 180
30 1 tkerber
    beta = pi * get_key(fileobj, '_cell_angle_beta') / 180
31 1 tkerber
    gamma =  pi * get_key(fileobj, '_cell_angle_gamma') / 180
32 1 tkerber
33 1 tkerber
    va = a * np.array([1, 0, 0])
34 1 tkerber
    vb = b * np.array([cos(gamma), sin(gamma), 0])
35 1 tkerber
    cx = cos(beta)
36 1 tkerber
    cy = (cos(alpha) - cos(beta) * cos(gamma)) / sin(gamma)
37 1 tkerber
    cz = sqrt(1. - cx*cx - cy*cy)
38 1 tkerber
    vc = c * np.array([cx, cy, cz])
39 1 tkerber
    cell = np.array([va, vb, vc])
40 1 tkerber
41 1 tkerber
    atoms = Atoms(cell=cell)
42 1 tkerber
    read = False
43 1 tkerber
    for line in fileobj:
44 1 tkerber
        if not read:
45 1 tkerber
            if '_atom_site_disorder_group' in line:
46 1 tkerber
                read = True
47 1 tkerber
        else:
48 1 tkerber
            word = line.split()
49 1 tkerber
            if len(word) < 5:
50 1 tkerber
                break
51 1 tkerber
            symbol = word[1]
52 1 tkerber
            pos = (float(word[2].split('(')[0]) * va +
53 1 tkerber
                   float(word[3].split('(')[0]) * vb +
54 1 tkerber
                   float(word[4].split('(')[0]) * vc   )
55 1 tkerber
            atoms.append(Atom(symbol, pos))
56 1 tkerber
57 1 tkerber
    return atoms