-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpdb_reres.py
executable file
·109 lines (92 loc) · 3.43 KB
/
pdb_reres.py
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2014-2023 pdb-tools project, https://github.com/haddocking/pdb-tools
# Copyright 2023 João M.C. Teixeira (@joaomcteixeira).
#
# https://www.bonvinlab.org/pdb-tools/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# For the `pdbprep` project, pdb-tools scripts were modified to reduce their
# versatility in exchange for additonal speed. The core algorithm of the script
# was maintained, but boilerplate to create a versatile command-line was
# removed, and some arguments were blocked to specific options. Modifications
# to the original `pdb-tools` scripts were done by João M.C. Teixeira
# (@joaomcteixeira) who is co-author in the `pdb-tools` project. Any credit to
# the value of `pdb-tools` scripts present in the `pdbprep` project should be
# given to the original `pdb-tools` project.
import sys
def pad_line(line):
"""Helper function to pad line to 80 characters in case it is shorter"""
size_of_line = len(line)
if size_of_line < 80:
padding = 80 - size_of_line + 1
line = line.strip('\n') + ' ' * padding + '\n'
return line[:81] # 80 + newline character
def run(fhandle, starting_resid):
"""
Reset the residue number column to start from a specific number.
This function is a generator.
Parameters
----------
fhandle : a line-by-line iterator of the original PDB file.
starting_resid : int
The starting residue number.
Yields
------
str (line-by-line)
The modified (or not) PDB line.
"""
_pad_line = pad_line
prev_resid = None # tracks chain and resid
resid = starting_resid - 1 # account for first residue
records = ('ATOM', 'HETATM')
for line in fhandle:
line = _pad_line(line)
if line.startswith(records):
line_resuid = line[17:27]
if line_resuid != prev_resid:
prev_resid = line_resuid
resid += 1
if resid > 9999:
emsg = 'Cannot set residue number above 9999.\n'
sys.stderr.write(emsg)
sys.exit(1)
yield line[:22] + str(resid).rjust(4) + line[26:]
def main():
# Check Input
# Do the job
new_pdb = run(sys.stdin, 1)
# Output results
try:
_buffer = []
_buffer_size = 5000 # write N lines at a time
for lineno, line in enumerate(new_pdb):
if not (lineno % _buffer_size):
sys.stdout.write(''.join(_buffer))
_buffer = []
_buffer.append(line)
sys.stdout.write(''.join(_buffer))
sys.stdout.flush()
except IOError:
# This is here to catch Broken Pipes
# for example to use 'head' or 'tail' without
# the error message showing up
pass
# last line of the script
# Close file handle even if it is sys.stdin, no problem here.
#pdbfh.close()
sys.exit(0)
if __name__ == '__main__':
main()