3

pdb ファイルからチェーンを抽出したいと思います。以下に示すように、pdb ID を含む pdb.txt という名前のファイルがあります。最初の 4 文字は PDB ID を表し、最後の文字はチェーン ID です。

1B68A 
1BZ4B
4FUTA

1) ファイルを 1 行ずつ読み取り、2) 対応する PDB ファイルから各チェーンの原子座標をダウンロードします。
3) 出力をフォルダーに保存します。

次のスクリプトを使用してチェーンを抽出しました。しかし、このコードは pdb ファイルから A チェーンのみを出力します。

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
4

3 に答える 3

10

次の BioPython コードは、ニーズに適しているはずです。

PDB.Select目的のチェーン (この場合は 1 つのチェーン) のみを選択し、チェーンのみ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 データベースの性質の変化などを考慮に入れています。知っておく必要があります-データベースの変更を考慮して更新しました。Bio.PDBList=)

于 2012-07-27T11:05:36.683 に答える
2

この質問に答えるには少し遅いかもしれませんが、私の意見を述べます。 Biopythonには、このような考え方を簡単に実現するのに役立つ非常に便利な機能がいくつかあります。カスタム選択クラスのようなものを使用して、元の pdb ファイルを使用して for ループ内で選択するチェーンごとに呼び出すことができます。

    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))
于 2017-11-30T23:57:53.573 に答える
0

次のファイル 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
于 2012-07-27T11:21:31.560 に答える