PDB 文件格式说明
为了格式化输出蛋白质PDB文件,从网上找到了PDB文件的格式说明,现copy并记录于此:
ATOM 字段
列 | 数据 | 格式, 对齐 | 说明 |
---|---|---|---|
1-4 | ATOM | 字符, 左 | Record Type 记录类型 |
7-11 | serial | 整数, 右 | Atom serial number 原子序号.PDB文件对分子结构处理为segment, chain, residue, atom四个层次(一般并不用到chain),因此此数位限定了一个残基中的最大原子数为为99999 |
13-16 | name | 字符, 左 | Atom name 原子名称.原子的元素符号在13-14列中右对齐,一般从14列开始写, 占四个字符的原子名称才会从13列开始写.如, 铁原子FE(还有氯原子CL)写在13-14列, 而碳原子C只写在14列. |
17 | altLoc | 字符 | Alternate location indicator 可替位置标示符 |
18-20 | resName | 字符 | Residue name 残基名称 |
22 | chainID | 字符 | Chain identifier 链标识符 |
23-26 | resSeq | 整数, 右 | Residue sequence number 残基序列号 |
27 | iCode | 字符 | Code for insertion of residues 残基插入码 |
28-30 | 留空 | ||
31-38 | x | 浮点, 右 real (8.3) | Orthogonal coordinates for X in Angstroms 直角x坐标(埃) |
39-46 | y | 浮点, 右 real (8.3) | Orthogonal coordinates for Y in Angstroms 直角y坐标(埃) |
47-54 | z | 浮点, 右 real (8.3) | Orthogonal coordinates for Z in Angstroms 直角z坐标(埃) |
55-60 | occupancy | 浮点, 右 real (6.2) | Occupancy 占有率 |
61-66 | tempFactor | 浮点, 右 real (6.2) | Temperature factor 温度因子 |
67-72 | 留空 | ||
73-76 | segID | 字符, 左 | Segment identifier(optional) 可选的片段标识符,VMD会使用此数据 |
77-78 | element | 字符, 右 | Element symbol 元素符号 |
79-80 | charge | 字符 | Charge on the atom(optional) 可选的原子电荷.实际分子模拟中往往重新定义电荷, 故此列往往不用.VMD写出的PDB文件中无此列. |
氢原子约定
PDB文件中的氢原子约定如下: 出现在ATOM记录中的氢原子,
处于特定残基所有其他原子的后面.
每个氢原子的名称根据与它相连原子的名称来确定:
名称的第一个位置(13列)为可选的数字,
当有两个或多个氢原子与同一个原子相连时才使用;
第二个位置(14列)为元素符号H;
接下来的两列包含与氢原子相连原子的远程和分支标识符(1或2个字符).
示例如下: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1812345678901234567890123456789012345678901234567890123456789012345678901234567890
----+----1----+----2----+----3----+----4----+----5----+----6----+----6----+----8
ATOM 1 N VAL 1 -13.090 1.966 9.741 1.00 0.00
ATOM 2 CA VAL 1 -12.852 3.121 8.892 1.00 0.00
ATOM 3 C VAL 1 -13.047 4.399 9.711 1.00 0.00
ATOM 4 O VAL 1 -12.143 5.228 9.800 1.00 0.00
ATOM 5 CB VAL 1 -13.753 3.058 7.658 1.00 0.00
ATOM 6 CG1 VAL 1 -13.930 4.446 7.036 1.00 0.00
ATOM 7 CG2 VAL 1 -13.208 2.063 6.631 1.00 0.00
ATOM 8 H VAL 1 -13.919 1.449 9.527 1.00 0.00
ATOM 9 HA VAL 1 -11.816 3.075 8.557 1.00 0.00
ATOM 10 HB VAL 1 -14.734 2.707 7.977 1.00 0.00
ATOM 11 1HG1 VAL 1 -13.951 4.357 5.950 1.00 0.00
ATOM 12 2HG1 VAL 1 -14.866 4.883 7.384 1.00 0.00
ATOM 13 3HG1 VAL 1 -13.098 5.085 7.333 1.00 0.00
ATOM 14 1HG2 VAL 1 -12.623 1.298 7.142 1.00 0.00
ATOM 15 2HG2 VAL 1 -14.039 1.594 6.104 1.00 0.00
ATOM 16 3HG2 VAL 1 -12.575 2.588 5.917 1.00 0.00
Python 输出控制
下面的输出为在13-16列输出原子名称,而没有考虑在13或者14列对齐
field id | definition | length | format | range | string slicing (Python) |
---|---|---|---|---|---|
1 | "ATOM " or "HETATM" | 6 | {:6s} | 01-06 | [0:6] |
2 | atom serial number | 5 | {:5d} | 07-11 | [6:11] |
3 | atom name | 4 | {:^4s} | 13-16 | [12:16] |
4 | alternate location indicator | 1 | {:1s} | 17 | [16:17] |
5 | residue name | 3 | {:3s} | 18-20 | [17:20] |
6 | chain identifier | 1 | {:1s} | 22 | [21:22] |
7 | residue sequence number | 4 | {:4d} | 23-26 | [22:26] |
8 | code for insertion of residues | 1 | {:1s} | 27 | [26:27] |
9 | orthogonal coordinates for X (in Angstroms) | 8 | {:8.3f} | 31-38 | [30:38] |
10 | orthogonal coordinates for Y (in Angstroms) | 8 | {:8.3f} | 39-46 | [38:46] |
11 | orthogonal coordinates for Z (in Angstroms) | 8 | {:8.3f} | 47-54 | [46:54] |
12 | occupancy | 6 | {:6.2f} | 55-60 | [54:60] |
13 | temperature factor | 6 | {:6.2f} | 61-66 | [60:66] |
14 | element symbol | 2 | {:>2s} | 77-78 | [76:78] |
15 | charge on the atom | 2 | {:2s} | 79-80 | [78:80] |
输出格式 1
"{:6s}{:5d} {:^4s}{:1s}{:3s} {:1s}{:4d}{:1s} {:8.3f}{:8.3f}{:8.3f}{:6.2f}{:6.2f} {:>2s}{:2s}".format(...)
awk 输出控制
1 | awk '{printf("%-6s%5d %-4s %3s A%4d %8.3f%8.3f%8.3f\n",$1,$2,$3,$4,$5,$6,$7,$8)}' ${fd}/${pro}.pdb |
一些处理pdb的awk脚本
这些脚本都来自于bougui505的博客。
格式化pdb文件
以下脚本可以让pdb文件只保留[ATOM] [Atom serial number] [Atom name] [Residue name] [Chain identifier] [Residue sequence number] [x] [y] [z]
这些数据 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28cat > read_pdb.awk
#!/usr/bin/awk -f
# -*- coding: UTF8 -*-
# Author: Guillaume Bouvier -- guillaume.bouvier@pasteur.fr
# https://research.pasteur.fr/en/member/guillaume-bouvier/
# 2017-03-15 09:04:14 (UTC+0100)
BEGIN{
# Reading Fixed-Width Data (see: https://goo.gl/SmjwUt)
FIELDWIDTHS = "6 5 1 4 1 3 1 1 4 1 3 8 8 8 6 6 6 4"
# $2: Atom serial number
# $4: Atom type
# $5: altLoc; alternate location indicator.
# $6: Resname
# $8: ChainID
# $9: Resid
# $12: x
# $13: y
# $14: z
}
{
if ($1 == "ATOM "){
printf("%-6s%5s%1s%4s%1s%3s%1s%1s%4s%1s%3s%8s%8s%8s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)
}
}
为包含多个model的pdb文件添加
MODEL
分隔符
1 | function mspdb () { |
计算给定pdb文件的几何中心
注意本命令中的列数可能需要根据pdb文件是否包含链ID进行修改
1
awk '{if ($1 == "ATOM") {sx+=$6;sy+=$7;sz+=$8;n+=1}} END {print sx/n,sy/n,sz/n}' model1.pdb
使用 awk
将不同的链分割为不同的文件
1 | #!/usr/bin/awk -f |
使用
awk
将不同的pdb文件合并到同一文件(保存为不同链)
1 | #!/usr/bin/awk -f |
使用 awk
为PDB文件添加B-factor
1 | #!/usr/bin/awk -f |
去除pdb文件中的氢原子
mktemp -p /dev/shm
命令是为了确定可以创建一个特有的temp文件,对于并行地处理多个pdb文件非常重要。
此命令同时会覆盖原始文件,可以通过mv $tmpfile $1
进行调整。
1
2
3
4
5function stripH () {
tmpfile=$(mktemp -p /dev/shm)
awk '{if ($1=="ATOM" && $3 !~ /H/) {c+=1; printf("%-6s%5s %4s %3s %s%4s %8s%8s%8s\n", $1,c,$3,$4,$5,$6,$7,$8,$9)} \
else if ($1=="MODEL" || $1=="ENDMDL") {c=0; print $0}}' $1 > $tmpfile && mv $tmpfile $1
}
使用awk
输出pdb文件中指定的selection
1 | cat > pdbselect.sh |
对原子或者残基进行重新编号
1 | cat >pdb_renumber.sh |
分割含有多model的pdb文件
1 | awk '$0 ~ /ATOM 1/ {i++} {print >> "pdbs/out_"i".pdb"} {fflush("pdbs/out_"i".pdb")}' filename.pdb |
也可以使用csplit
命令,下面的例子中,使用csplit
命令分割了一个包含50000个model的pdb文件,原始pdb中每个model使用MODEL X and ENDMDL
进行截断。
1
2
3
4csplit -z -f /dev/shm/docking_ -n 5 docking_results.pdb '/ENDMDL/1' '{49999}'
`-n`: number of digits
`-z`: remove empty output files1
2
3
4docking_00000
docking_00001
...
docking_499991
csplit -z -f /dev/shm/docking_ -b '%05d.pdb' docking_results.pdb '/ENDMDL/1' '{49999}'
1
2
3
4function splitpdb () {
n_models=$(grep -c MODEL $1)
csplit -z -f /dev/shm/model_ -b '%04d.pdb' $1 '/ENDMDL/1' "{$(expr $n_models - 1)}"
}1
awk '$0 ~ /ATOM 1/ {i++} {print >> "pdbs/smap_"int(i/100)".pdb"} {fflush("pdbs/smap_"int(i/100)".pdb")}' smap.pdb
Ref: - 李继存老师 - pdb-format - pdb处理