Statistiques
| Révision :

root / ase / io / pdb.py @ 1

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

1 1 tkerber
import numpy as np
2 1 tkerber
3 1 tkerber
from ase.atoms import Atom, Atoms
4 1 tkerber
from ase.parallel import paropen
5 1 tkerber
6 1 tkerber
"""Module to read and write atoms in PDB file format"""
7 1 tkerber
8 1 tkerber
9 1 tkerber
def read_pdb(fileobj, index=-1):
10 1 tkerber
    """Read PDB files.
11 1 tkerber

12 1 tkerber
    The format is assumed to follow the description given in
13 1 tkerber
    http://www.wwpdb.org/documentation/format32/sect9.html."""
14 1 tkerber
    if isinstance(fileobj, str):
15 1 tkerber
        fileobj = open(fileobj)
16 1 tkerber
17 1 tkerber
    atoms = Atoms()
18 1 tkerber
    for line in fileobj.readlines():
19 1 tkerber
        if line.startswith('ATOM') or line.startswith('HETATM'):
20 1 tkerber
            try:
21 1 tkerber
                symbol = line[12:16].strip()
22 1 tkerber
                # we assume that the second character is a label
23 1 tkerber
                # in case that it is upper case
24 1 tkerber
                if len(symbol) > 1 and symbol[1].isupper():
25 1 tkerber
                    symbol = symbol[0]
26 1 tkerber
                words = line[30:55].split()
27 1 tkerber
                position = np.array([float(words[0]),
28 1 tkerber
                                     float(words[1]),
29 1 tkerber
                                     float(words[2])])
30 1 tkerber
                atoms.append(Atom(symbol, position))
31 1 tkerber
            except:
32 1 tkerber
                pass
33 1 tkerber
34 1 tkerber
    return atoms
35 1 tkerber
36 1 tkerber
def write_pdb(fileobj, images):
37 1 tkerber
    """Write images to PDB-file."""
38 1 tkerber
    if isinstance(fileobj, str):
39 1 tkerber
        fileobj = paropen(fileobj, 'w')
40 1 tkerber
41 1 tkerber
    if not isinstance(images, (list, tuple)):
42 1 tkerber
        images = [images]
43 1 tkerber
44 1 tkerber
    format = 'ATOM  %5d %-4s              %8.3f%8.3f%8.3f  0.00  0.00\n'
45 1 tkerber
46 1 tkerber
    # RasMol complains if the atom index exceeds 100000. There might
47 1 tkerber
    # be a limit of 5 digit numbers in this field.
48 1 tkerber
    MAXNUM = 100000
49 1 tkerber
50 1 tkerber
    symbols = images[0].get_chemical_symbols()
51 1 tkerber
    natoms = len(symbols)
52 1 tkerber
53 1 tkerber
    for atoms in images:
54 1 tkerber
        fileobj.write('MODEL         1\n')
55 1 tkerber
        p = atoms.get_positions()
56 1 tkerber
        for a in range(natoms):
57 1 tkerber
            x, y, z = p[a]
58 1 tkerber
            fileobj.write(format % (a % MAXNUM, symbols[a], x, y, z))
59 1 tkerber
        fileobj.write('ENDMDL\n')