Есть ли способ отделить цепочки, принадлежащие каждой биологической сборке в файле PDB? (Скрипт Python) - PullRequest
0 голосов
/ 11 ноября 2019

Я хочу отделить идентификаторы цепочек, которые принадлежат конкретным биологическим сборкам, в файле PDB. В качестве примера PDB ID 1BRS имеет 3 Биологические сборки Биологическая сборка 1: - цепи A и D Биологическая сборка 2: - Цепи B и E Биологическая сборка 3: - Цепи C и F

Есть ли способ (Python Script), чтобы получить отдельные идентификаторы цепочек, которые принадлежат каждой биологической сборке, следующим образом 1BRS_A: D 1BRS_B: E 1BRS_C: F Не нужно извлекать координаты цепи. Если я получу названия цепочек, этого будет достаточно. Заранее спасибо

1 Ответ

2 голосов
/ 11 ноября 2019

Формат файла PDBx / mmCIF содержит информацию в категории _pdbx_struct_assembly_gen.

loop_
_pdbx_struct_assembly_gen.assembly_id 
_pdbx_struct_assembly_gen.oper_expression 
_pdbx_struct_assembly_gen.asym_id_list 
1 1 A,D,G,J 
2 1 B,E,H,K 
3 1 C,F,I,L 

Эти файлы можно прочитать, например, с помощью Биотит (https://www.biotite -python.org/), пакет, который я разрабатываю. Категории могут быть прочитаны словарным способом:

import biotite.database.rcsb as rcsb
import biotite.structure as struc
import biotite.structure.io.pdbx as pdbx

ID = "1BRS"

# Download structure
file_name = rcsb.fetch(ID, "pdbx", target_path=".")

# Read file
file = pdbx.PDBxFile()
file.read(file_name)
# Get 'pdbx_struct_assembly_gen' category as dictionary
assembly_dict = file["pdbx_struct_assembly_gen"]
for asym_id_list in assembly_dict["asym_id_list"]:
    chain_ids = asym_id_list.split(",")
    print(f"{ID}_{':'.join(chain_ids)}")

Выходные данные

1BRS_A:D:G:J
1BRS_B:E:H:K
1BRS_C:F:I:L

Цепочки GL содержат только молекулы воды.

РЕДАКТИРОВАТЬ:

Чтобы включить только идентификаторы цепей, которые принадлежат полимеру, например, белку или нуклеотиду, вы можете использовать категорию entity_poly:

loop_
_entity_poly.entity_id 
_entity_poly.type 
_entity_poly.nstd_linkage 
_entity_poly.nstd_monomer 
_entity_poly.pdbx_seq_one_letter_code 
_entity_poly.pdbx_seq_one_letter_code_can 
_entity_poly.pdbx_strand_id 
_entity_poly.pdbx_target_identifier 
1 'polypeptide(L)' no no 
;AQVINTFDGVADYLQTYHKLPDNYITKSEAQALGWVASKGNLADVAPGKSIGGDIFSNREGKLPGKSGRTWREADINYTS
GFRNSDRILYSSDWLIYKTTDHYQTFTKIR
;
;AQVINTFDGVADYLQTYHKLPDNYITKSEAQALGWVASKGNLADVAPGKSIGGDIFSNREGKLPGKSGRTWREADINYTS
GFRNSDRILYSSDWLIYKTTDHYQTFTKIR
;
A,B,C ? 
2 'polypeptide(L)' no no 
;KKAVINGEQIRSISDLHQTLKKELALPEYYGENLDALWDALTGWVEYPLVLEWRQFEQSKQLTENGAESVLQVFREAKAE
GADITIILS
;
;KKAVINGEQIRSISDLHQTLKKELALPEYYGENLDALWDALTGWVEYPLVLEWRQFEQSKQLTENGAESVLQVFREAKAE
GADITIILS
;
D,E,F ? 

Это обновленный код Python:

import biotite.database.rcsb as rcsb
import biotite.structure as struc
import biotite.structure.io.pdbx as pdbx

ID = "1BRS"

# Download structure
file_name = rcsb.fetch(ID, "pdbx", target_path=".")

# Read file
file = pdbx.PDBxFile()
file.read(file_name)

# Get 'entity_poly' category as dictionary
# to find out which chains are polymers
poly_chains = []
for chain_list in file["entity_poly"]["pdbx_strand_id"]:
    poly_chains += chain_list.split(",")

# Get 'pdbx_struct_assembly_gen' category as dictionary
for asym_id_list in file["pdbx_struct_assembly_gen"]["asym_id_list"]:
    chain_ids = asym_id_list.split(",")
    # Filter chains that belong to a polymer
    chain_ids = [chain_id for chain_id in chain_ids if chain_id in poly_chains]
    print(f"{ID}_{':'.join(chain_ids)}")

И это вывод:

1BRS_A:D
1BRS_B:E
1BRS_C:F
...