PDB files

This examples demonstrates how to use the flexible PDB fetcher, fetchPDB(). Valid inputs are PDB identifier, e.g 2k39, or a list of PDB identifiers, e.g. ["2k39", "1mkp", "1etc"]. Compressed PDB files (pdb.gz) will be saved to the current working directory or a target folder.

Fetch PDB files

Single file

We start by importing everything from the ProDy package:

In [1]: from prody import *

The function will return a filename if the download is successful.

In [2]: filename = fetchPDB('1p38')

In [3]: filename
Out[3]: '1p38.pdb.gz'

Multiple files

This function also accepts a list of PDB identifiers:

In [4]: filenames = fetchPDB(['1p38', '1r39', '@!~#'])

In [5]: filenames
Out[5]: ['1p38.pdb.gz', '1r39.pdb.gz', None]

For failed downloads, None will be returned (or the list will contain None item).

Also note that in this case we passed a folder name. Files are saved in this folder, after it is created if it did not exist.

ProDy will give you a report of download results and return a list of filenames. The report will be printed on the screen, which in this case would be:

@> 1p38 (./1p38.pdb.gz) is found in the target directory.
@> @!~# is not a valid identifier.
@> 1r39 downloaded (./1r39.pdb.gz)
@> PDB download completed (1 found, 1 downloaded, 1 failed).

Parse PDB files

ProDy offers a fast and flexible PDB parser, parsePDB(). Parser can be used to read well defined subsets of atoms, specific chains or models (in NMR structures) to boost the performance. This example shows how to use the flexible parsing options.

Three types of input are accepted from user:

  • PDB file path, e.g. "../1MKP.pdb"
  • compressed (gzipped) PDB file path, e.g. "1p38.pdb.gz"
  • PDB identifier, e.g. 2k39

Output is an AtomGroup instance that stores atomic data and can be used as input to functions and classes for dynamics analysis.

Parse a file

You can parse PDB files by passing a filename (gzipped files are handled). We do so after downloading a PDB file (see Fetch PDB files for more information):

In [6]: fetchPDB('1p38')
Out[6]: '1p38.pdb.gz'

In [7]: atoms = parsePDB('1p38')

In [8]: atoms
Out[8]: <AtomGroup: 1p38 (2962 atoms)>

Parser returns an AtomGroup instance.

Also note that the time it took to parse the file is printed on the screen. This includes the time that it takes to evaluate coordinate lines and build an AtomGroup instance and excludes the time spent on reading the file from disk.

Use an identifier

PDB files can be parsed by passing simply an identifier. Parser will look for a PDB file that matches the given identifier in the current working directory. If a matching file is not found, ProDy will downloaded it from PDB FTP server automatically and saved it in the current working directory.

In [9]: atoms = parsePDB('1mkp')

In [10]: atoms
Out[10]: <AtomGroup: 1mkp (1183 atoms)>

Subsets of atoms

Parser can be used to parse backbone or Cα atoms:

In [11]: backbone = parsePDB('1mkp', subset='bb')

In [12]: backbone
Out[12]: <AtomGroup: 1mkp_bb (576 atoms)>

In [13]: calpha = parsePDB('1mkp', subset='ca')

In [14]: calpha
Out[14]: <AtomGroup: 1mkp_ca (144 atoms)>

Specific chains

Parser can be used to parse a specific chain from a PDB file:

In [15]: chA = parsePDB('3mkb', chain='A')

In [16]: chA
Out[16]: <AtomGroup: 3mkbA (1198 atoms)>

In [17]: chC = parsePDB('3mkb', chain='C')

In [18]: chC
Out[18]: <AtomGroup: 3mkbC (1189 atoms)>

Multiple chains can also be parsed in the same way:

In [19]: chAC = parsePDB('3mkb', chain='AC')

In [20]: chAC
Out[20]: <AtomGroup: 3mkbAC (2387 atoms)>

Specific models

Parser can be used to parse a specific model from a file:

In [21]: model1 = parsePDB('2k39', model=10)

In [22]: model1
Out[22]: <AtomGroup: 2k39 (1231 atoms)>

Alternate locations

When a PDB file contains alternate locations for some of the atoms, by default alternate locations with indicator A are parsed.

In [23]: altlocA = parsePDB('1ejg')

In [24]: altlocA
Out[24]: <AtomGroup: 1ejg (637 atoms)>

Specific alternate locations can be parsed as follows:

In [25]: altlocB = parsePDB('1ejg', altloc='B')

In [26]: altlocB
Out[26]: <AtomGroup: 1ejg (634 atoms)>

Note that in this case number of atoms are different between the two atom groups. This is because the residue types of atoms with alternate locations are different.

Also, all alternate locations can be parsed as follows:

In [27]: all_altlocs = parsePDB('1ejg', altloc=True)

In [28]: all_altlocs
Out[28]: <AtomGroup: 1ejg (637 atoms; active #0 of 3 coordsets)>

Note that this time parser returned three coordinate sets. One for each alternate location indicator found in this file (A, B, C). When parsing multiple alternate locations, parser will expect for the same residue type for each atom with an alternate location. If residue names differ, a warning message will be printed.

Composite arguments

Parser can be used to parse coordinates from a specific model for a subset of atoms of a specific chain:

In [29]: composite = parsePDB('2k39', model=10, chain='A', subset='ca')

In [30]: composite
Out[30]: <AtomGroup: 2k39A_ca (76 atoms)>

Header data

PDB parser can be used to extract header data in a dict from PDB files as follows:

In [31]: atoms, header = parsePDB('1ubi', header=True)

In [32]: list(header)
Out[32]: 
['A',
 'related_entries',
 'sheet',
 'classification',
 'reference',
 'title',
 'sheet_range',
 'polymers',
 'resolution',
 'space_group',
 'helix_range',
 'chemicals',
 'experiment',
 'helix',
 'version',
 'authors',
 'identifier',
 'deposition_date',
 'biomoltrans']

In [33]: header['experiment']
Out[33]: 'X-RAY DIFFRACTION'

In [34]: header['resolution']
Out[34]: 1.8

It is also possible to parse only header data by passing model=0 as an argument:

In [35]: header = parsePDB('1ubi', header=True, model=0)

or using parsePDBHeader() function:

In [36]: header = parsePDBHeader('1ubi')

Write PDB file

PDB files can be written using writePDB() function. This example shows how to write PDB files for AtomGroup instances and subsets of atoms.

Write all atoms

All atoms in an AtomGroup can be written in PDB format as follows:

In [37]: writePDB('MKP3.pdb', atoms)
Out[37]: 'MKP3.pdb'

Upon successful writing of PDB file, filename is returned.

Write a subset

It is also possible to write subsets of atoms in PDB format:

In [38]: alpha_carbons = atoms.select('calpha')

In [39]: writePDB('1mkp_ca.pdb', alpha_carbons)
Out[39]: '1mkp_ca.pdb'

In [40]: backbone = atoms.select('backbone')

In [41]: writePDB('1mkp_bb.pdb', backbone)
Out[41]: '1mkp_bb.pdb'