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