root / ase / io / cif.py @ 19
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
|