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') |