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