PDB 파일에서 체인을 추출하는 방법은 무엇입니까?
-
12-12-2019 - |
문제
PDB 파일에서 체인을 추출하고 싶습니다.아래 그림과 같이 PDB ID가 포함 된 PDB ID라는 파일이 있습니다.첫 번째 네 문자는 PDB ID를 나타내고 마지막 문자는 체인 ID입니다.
1B68A
1BZ4B
4FUTA
.
i) 1) 라인별로 파일 행을 읽으십시오.
2) 해당 PDB 파일에서 각 체인의 원자 좌표를 다운로드하십시오.
3) 출력을 폴더에 저장하십시오.
나는 다음 스크립트를 사용하여 체인을 추출했습니다.그러나이 코드는 PDB 파일의 체인 만 인쇄합니다.
for i in 1B68 1BZ4 4FUT
do
wget -c "http://www.pdb.org/pdb/download/downloadFile.do?fileFormat=pdb&compression=NO&structureId="$i -O $i.pdb
grep ATOM $i.pdb | grep 'A' > $i\_A.pdb
done
. 해결책
다음 생물학적 코드는 귀하의 요구 사항에 맞게되어야합니다.
PDB.Select
를 사용하여 원하는 체인 (케이스 하나 체인) 및 PDBIO()
만 선택하여 체인 만 포함 된 구조를 만듭니다.
import os
from Bio import PDB
class ChainSplitter:
def __init__(self, out_dir=None):
""" Create parsing and writing objects, specify output directory. """
self.parser = PDB.PDBParser()
self.writer = PDB.PDBIO()
if out_dir is None:
out_dir = os.path.join(os.getcwd(), "chain_PDBs")
self.out_dir = out_dir
def make_pdb(self, pdb_path, chain_letters, overwrite=False, struct=None):
""" Create a new PDB file containing only the specified chains.
Returns the path to the created file.
:param pdb_path: full path to the crystal structure
:param chain_letters: iterable of chain characters (case insensitive)
:param overwrite: write over the output file if it exists
"""
chain_letters = [chain.upper() for chain in chain_letters]
# Input/output files
(pdb_dir, pdb_fn) = os.path.split(pdb_path)
pdb_id = pdb_fn[3:7]
out_name = "pdb%s_%s.ent" % (pdb_id, "".join(chain_letters))
out_path = os.path.join(self.out_dir, out_name)
print "OUT PATH:",out_path
plural = "s" if (len(chain_letters) > 1) else "" # for printing
# Skip PDB generation if the file already exists
if (not overwrite) and (os.path.isfile(out_path)):
print("Chain%s %s of '%s' already extracted to '%s'." %
(plural, ", ".join(chain_letters), pdb_id, out_name))
return out_path
print("Extracting chain%s %s from %s..." % (plural,
", ".join(chain_letters), pdb_fn))
# Get structure, write new file with only given chains
if struct is None:
struct = self.parser.get_structure(pdb_id, pdb_path)
self.writer.set_structure(struct)
self.writer.save(out_path, select=SelectChains(chain_letters))
return out_path
class SelectChains(PDB.Select):
""" Only accept the specified chains when saving. """
def __init__(self, chain_letters):
self.chain_letters = chain_letters
def accept_chain(self, chain):
return (chain.get_id() in self.chain_letters)
if __name__ == "__main__":
""" Parses PDB id's desired chains, and creates new PDB structures. """
import sys
if not len(sys.argv) == 2:
print "Usage: $ python %s 'pdb.txt'" % __file__
sys.exit()
pdb_textfn = sys.argv[1]
pdbList = PDB.PDBList()
splitter = ChainSplitter("/home/steve/chain_pdbs") # Change me.
with open(pdb_textfn) as pdb_textfile:
for line in pdb_textfile:
pdb_id = line[:4].lower()
chain = line[4]
pdb_fn = pdbList.retrieve_pdb_file(pdb_id)
splitter.make_pdb(pdb_fn, chain)
.
하나의 마지막 참고 사항 : PDB 파일에 대해 자신의 파서 을 작성하지 마십시오.형식 사양은 추악한 ( 정말 추악한 )이며 결함이있는 PDB 파일의 양은 비틀 거리고 있습니다.구문 분석을 처리 할 Biopython과 같은 도구를 사용하십시오!
wget
를 사용하는 대신 PDB 데이터베이스와 상호 작용하는 도구를 사용해야합니다.FTP 연결 제한을 고려하여 PDB 데이터베이스의 변경 성격 등을 사용합니다.알아야합니다 - i relince_noreferrer"> 데이터베이스의 변경 사항을 확인하십시오.=)
다른 팁
다음 파일이 PDB_Structures
를 알려줍니다.1B68A
1BZ4B
4FUTA
.
다음에 load_pdb.sh
에 코드가 있습니다.while read name
do
chain=${name:4:1}
name=${name:0:4}
wget -c "http://www.pdb.org/pdb/download/downloadFile.do?fileFormat=pdb&compression=NO&structureId="$name -O $name.pdb
awk -v chain=$chain '$0~/^ATOM/ && substr($0,20,1)==chain {print}' $name.pdb > $name\_$chain.pdb
# rm $name.pdb
done
.
원래 PDB가 필요하지 않은 경우 마지막 줄의 주석 처리를 제거합니다.
실행
cat pdb_structures | ./load_pdb.sh
. 아마도이 질문을 asnwering의 경우 조금 늦었을 것입니다. 그러나 나는 제 의견을 제시 할 것입니다. Biopython 쉽게 생각하는 데 도움이되는 몇 가지 실제로 편리한 기능이 있습니다.사용자 정의 선택 클래스와 같은 것을 사용할 수 있고 원래의 PDB 파일을 사용하여 루프에서 선택할 체인 중 하나에 대해 호출 할 수 있습니다.
from Bio.PDB import Select, PDBIO
from Bio.PDB.PDBParser import PDBParser
class ChainSelect(Select):
def __init__(self, chain):
self.chain = chain
def accept_chain(self, chain):
if chain.get_id() == self.chain:
return 1
else:
return 0
chains = ['A','B','C']
p = PDBParser(PERMISSIVE=1)
structure = p.get_structure(pdb_file, pdb_file)
for chain in chains:
pdb_chain_file = 'pdb_file_chain_{}.pdb'.format(chain)
io_w_no_h = PDBIO()
io_w_no_h.set_structure(structure)
io_w_no_h.save('{}'.format(pdb_chain_file), ChainSelect(chain))
.