BioTech - 大型蛋白质复合物的组装流程 (CombFold)

news2024/12/26 23:18:47

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/136187314

CombFold是用于预测大型蛋白质复合物结构的组合和分层组装算法,利用AlphaFold2预测的亚基之间的成对相互作用。CombFold的组装流程分为以下几个步骤:

  • 亚基结构预测:对于每个亚基,使用 AlphaFold2 预测其单链结构,并将其保存为PDB文件。
  • 亚基相互作用预测:对于每对亚基,使用 AlphaFold2 预测其双链结构,并从中提取亚基之间的接触信息,包括距离、角度和置信度。
  • 亚基组合:根据亚基相互作用的置信度,将亚基按照从高到低的顺序排序,并使用一种贪心算法,从最高置信度的亚基对开始,逐步将亚基组合在一起,形成一个初始的蛋白质复合物。
  • 亚基优化:对于每个组合后的亚基,使用一种基于梯度下降的算法,根据亚基之间的接触信息,调整其相对位置和方向,以最小化亚基之间的能量和冲突。
  • 亚基筛选:对于每个组合后的亚基,计算其与其他亚基的接触面积和重叠度,如果低于一定的阈值,则将其从蛋白质复合物中移除,以减少过度组合的情况。
  • 亚基重复:对于每个组合后的亚基,检查其是否存在重复的亚基,如果存在,则将其合并为一个亚基,以减少冗余的情况。
  • 亚基排序:对于每个组合后的亚基,计算其在蛋白质复合物中的重要性,根据重要性的高低,将亚基按照从高到低的顺序排序,并输出前十个最重要的亚基作为最终的蛋白质复合物结构。

CombFold 的优点是能够利用 AlphaFold2 的高精度预测,快速地组合和优化亚基,从而生成高质量的蛋白质复合物结构,还支持结合交联质谱的距离约束和快速枚举可能的复合物组成。

CombFold:
CombFold

测试效果:7QRB

准备数据:

MSA: 7qrb_A292_B286_C292_D292_1162
FASTA: 7qrb_A292_B286_C292_D292_1162.fasta
PDB: 7qrb_A292_B286_C292_D292_1162.pdb

FASTA 是 A3B1 的格式:

>A
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>B
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>C
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>D
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK

评估结果:

PDBTMScoreDockQRMSDlDDT
AFM Baseline10.29930.030648.31480.5350
AFM Baseline20.44260.026145.97450.5331
CombFold0.28360.015452.47470.5369

推理 AFM 的 Baseline 效果:

# 测试路径 mydata/test-case/combfold_baseline
bash run_alphafold.sh \
-o mydata/test-case/combfold_baseline/ \
-f fasta_100/7qrb_A292_B286_C292_D292_1162.fasta \
-m "multimer" \
-l 2 

推理单个结构,时间大约 933.2s,即 15.55 min

1. 生成 subunits.json 文件

调用 generate_subunits.py 脚本:

python myscripts/generate_subunits.py \
-i xxx.fasta \
-o subunits.json

FASTA 示例,即 7qrb_A292_B286_C292_D292_1162.fasta

>A
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>B
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>C
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>D
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK

输出结果 subunits.json ,即:

{
    "A0": {
        "name": "A0",
        "chain_names": [
            "A",
            "C",
            "D"
        ],
        "start_res": 1,
        "sequence": "LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK"
    },
    "B0": {
        "name": "B0",
        "chain_names": [
            "B"
        ],
        "start_res": 1,
        "sequence": "LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK"
    }
}

2. 调用函数生成一组 FASTA 文件

调用默认函数 scripts/prepare_fastas.py ,将 subunits.json 拆解成多个 fasta 文件,如 AA、AB、AAA、AAB 等,即:

  • 输入已生成的 subunits.json 文件
  • --stage 选择 pairs 模式,同时支持 groups 模式
  • --output-fasta-folder 是输出文件夹,例如 mydata/fastas
  • --max-af-size 是最大序列长度,即 1800

即:

# 默认 pairs 生成
python3 scripts/prepare_fastas.py mydata/subunits.json --stage pairs --output-fasta-folder mydata/fastas --max-af-size 1800
# 根据 groups 生成
# python3 scripts/prepare_fastas.py mydata/subunits.json  --stage groups --output-fasta-folder mydata/fastas --max-af-size 1800 --input-pairs-results <path_to_AFM_pairs_results>

输出文件夹的内容如下,例如 mydata/fastas,即:

A0_A0.fasta
A0_A0_A0.fasta
A0_A0_B0.fasta
A0_B0.fasta

3. 根据 AFM 的搜索生成一组 MSAs

调用函数 generate_comb_msa.py

  • -i:输入已生成的一组 FASTA 文件
  • -m:AFM 搜索的 MSAs 文件夹,例如 7qrb_A292_B286_C292_D292_1162/msas
  • -o:输出的一组 MSAs 文件,例如 mydata/comb_msas

即:

python myscripts/generate_comb_msa.py \
-i mydata/fastas \
-m [afm searched msas]
-o mydata/comb_msas

输出文件夹 mydata/comb_msas 示例:

A0_A0/
A0_A0_A0/
A0_A0_B0/
A0_B0/

调用 AFM 程序,执行 Subunits PDB 推理:

bash run_alphafold.sh \
-o mydata/comb_msas/ \
-f mydata/fastas/ \
-m "multimer" \
-l 5

4. 导出 Subunits 的 PDBs 文件

调用函数 export_comb_pdbs.py

  • -i:输入 AFM 已生成 Subunits 的 PDB 文件,例如 mydata/comb_msas
  • -o:输出 一组 PDB 文件,合并至一个文件夹,并且重命名,例如 mydata/pdbs

即:

python myscripts/export_comb_pdbs.py \
-i mydata/comb_msas \
-o mydata/pdbs

导出的 PDBs 文件如下:

AFM_A0_A0_A0_unrelaxed_model_1_multimer_v3_pred_0.pdb
AFM_A0_A0_A0_unrelaxed_model_1_multimer_v3_pred_1.pdb
AFM_A0_A0_B0_unrelaxed_model_1_multimer_v3_pred_0.pdb
AFM_A0_A0_B0_unrelaxed_model_1_multimer_v3_pred_1.pdb

5. 调用 Comb Assembly 程序

调用函数 myscripts/run_examples.py,具体参数源码,即:

path_on_drive = os.path.join(DATA_DIR, "example_1")  # @param {type:"string"}
max_results_number = "5"  # @param [1, 5, 10, 20]
create_cif_instead_of_pdb = False  # @param {type:"boolean"}

subunits_path = os.path.join(path_on_drive, "subunits.json")
pdbs_folder = os.path.join(path_on_drive, "pdbs")
assembled_folder = os.path.join(path_on_drive, "assembled")
mkdir_if_not_exist(assembled_folder)
tmp_assembled_folder = os.path.join(path_on_drive, "tmp_assembled")

最终输出文件 assembled,即:

confidence.txt
output_clustered_0.pdb

最终结果,即 output_clustered_0.pdb

其中,也可以输入 Crosslinks 交联质谱数据。来源于 pLink2 软件的交联肽段的分析结果。

每一行代表一个交联对,由两个肽段组成,即:

  • 第1维和第2维,表示 蛋白质序号 与 蛋白质链名。
  • 第3维和第4维,同上,即表示 A链中的a位置蛋白,与B链中的b位置蛋白,相互作用。
  • 第5维和第6维,表示 联剂的类型 与 交联剂的臂长,确定交联位点的距离限制和交联剂的选择。
  • 第7维表示为置信度。

例如:

94 2 651 C 0 30 0.85
149 2 651 C 0 30 0.92
280 2 196 A 0 30 0.96
789 C 159 T 0 30 0.67
40 T 27 b 0 30 0.86
424 2 206 A 0 30 0.55
351 2 29 T 0 30 0.84
149 2 196 A 0 30 0.93
761 C 304 T 0 30 0.95
152 2 651 C 0 30 0.94
351 2 832 C 0 30 0.87
206 A 645 C 0 30 0.75
832 C 40 T 0 30 0.85
424 2 23 b 0 30 0.75

0 表示交联剂是不可裂解型的,如 BS3 或 DSS2。30 表示交联剂的臂长是 30 A。

整体实现多链的组装效果,不适用于小型蛋白质复合物,而且依赖于 AFM 的预测亚基复合物结构。评估效果,如下:

PDB

源码:

generate_subunits.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/19
"""
import argparse
import collections
import json
import os
import sys
from pathlib import Path

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:
    sys.path.append(p)

from myutils.protein_utils import get_seq_from_fasta
from root_dir import DATA_DIR


class GenerateSubunits(object):
    """
    从 fasta 生成 subunits.json
    """
    def __init__(self):
        pass

    def process(self, input_path, output_path):
        print(f"[Info] input_path: {input_path}")
        print(f"[Info] output_path: {output_path}")

        seq_list, desc_list = get_seq_from_fasta(input_path)
        print(f"[Info] seq_list: {seq_list}")
        print(f"[Info] desc_list: {desc_list}")

        seq_dict = collections.defaultdict(list)
        for seq, desc in zip(seq_list, desc_list):
            seq_dict[seq].append(desc)

        su_dict = {}
        for seq in seq_dict.keys():
            chain_names = seq_dict[seq]
            su_name = chain_names[0] + "0"
            su_dict[su_name] = {
                "name": su_name,
                "chain_names": chain_names,
                "start_res": 1,
                "sequence": seq
            }
        with open(output_path, "w") as f:
            f.write(json.dumps(su_dict, indent=4))


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-i",
        "--input-path",
        type=Path,
        required=True,
    )
    parser.add_argument(
        "-o",
        "--output-path",
        type=Path,
        required=True
    )
    args = parser.parse_args()

    input_path = str(args.input_path)
    output_path = str(args.output_path)

    assert os.path.isfile(input_path)

    gs = GenerateSubunits()
    gs.process(input_path, output_path)


def main2():
    gs = GenerateSubunits()
    input_path = os.path.join(DATA_DIR, "7qrb_A292_B286_C292_D292_1162.fasta")
    output_path = os.path.join(DATA_DIR, "subunits.json")
    gs.process(input_path, output_path)


if __name__ == '__main__':
    main()

generate_comb_msa.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/19
"""
import argparse
import json
import os
import shutil
import sys
from pathlib import Path

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:
    sys.path.append(p)

from myutils.project_utils import mkdir_if_not_exist, traverse_dir_folders, traverse_dir_files
from myutils.protein_utils import get_seq_from_fasta
from root_dir import DATA_DIR


class GenerateCombMsa(object):
    """
    根据已知的 MSA 搜索,构建新的 MSA 文件夹
    """
    def __init__(self):
        pass

    def process(self, input_dir, msa_path, output_dir):
        print(f"[Info] input_dir: {input_dir}")
        print(f"[Info] msa_path: {msa_path}")
        print(f"[Info] output_dir: {output_dir}")
        paths_list = traverse_dir_files(input_dir, "fasta")
        print(f"[Info] fasta: {len(paths_list)}")

        for path in paths_list:
            self.process_fasta(path, msa_path, output_dir)
        print(f"[Info] 处理完成: {output_dir}")

    def process_fasta(self, input_path, msa_path, output_dir):
        mkdir_if_not_exist(output_dir)

        map_path = os.path.join(msa_path, "chain_id_map.json")

        folder_list = traverse_dir_folders(msa_path)
        chain_folder_map = {}
        for folder_path in folder_list:
            # print(f"[Info] folder_path: {folder_path}")
            name = os.path.basename(folder_path)
            chain_folder_map[name] = folder_path
        # print(f"[Info] chain_folder_map: {chain_folder_map}")

        with open(map_path, "r") as f:
            chain_id_map = json.load(f)
        # print(f"[Info] chain_id_map: {chain_id_map}")
        seq_folder_map = dict()
        for key in chain_id_map.keys():
            seq = chain_id_map[key]["sequence"]
            if key in chain_folder_map.keys():
                folder_path = chain_folder_map[key]
                seq_folder_map[seq] = folder_path
        # print(f"[Info] seq_folder_map: {seq_folder_map}")

        # 创建文件夹
        fasta_name = os.path.basename(input_path).split(".")[0]
        fasta_dir = os.path.join(output_dir, fasta_name, "msas")
        mkdir_if_not_exist(fasta_dir)

        new_chain_id_map = {}
        seq_list, desc_list = get_seq_from_fasta(input_path)
        copied_set = set()

        for seq, desc in zip(seq_list, desc_list):
            new_chain_id_map[desc] = {
                "description": desc,
                "sequence": seq
            }
            if seq in seq_folder_map.keys():
                if seq not in copied_set:
                    copied_set.add(seq)
                    output_msa_folder = os.path.join(fasta_dir, desc)
                    if not os.path.exists(output_msa_folder):
                        shutil.copytree(seq_folder_map[seq], output_msa_folder)

        output_map_path = os.path.join(fasta_dir, "chain_id_map.json")
        with open(output_map_path, "w") as f:
            f.write(json.dumps(new_chain_id_map, indent=4))

        print(f"[Info] fasta 处理完成: {fasta_dir}")


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-i",
        "--input-dir",
        type=Path,
        required=True,
    )
    parser.add_argument(
        "-m",
        "--msa-path",
        type=Path,
        required=True,
    )
    parser.add_argument(
        "-o",
        "--output-dir",
        type=Path,
        required=True
    )
    args = parser.parse_args()

    input_dir = str(args.input_dir)
    msa_path = str(args.msa_path)
    output_dir = str(args.output_dir)

    assert os.path.isdir(input_dir) and os.path.isdir(msa_path)
    mkdir_if_not_exist(output_dir)

    gcm = GenerateCombMsa()
    gcm.process(input_dir, msa_path, output_dir)


def main2():
    gcm = GenerateCombMsa()
    input_dir = os.path.join(DATA_DIR, "fastas")
    msa_path = "7qrb_A292_B286_C292_D292_1162/msas"
    output_dir = os.path.join(DATA_DIR, "comb_msas")
    gcm.process(input_dir, msa_path, output_dir)


if __name__ == '__main__':
    main()

export_comb_pdbs.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/20
"""
import argparse
import os
import shutil
import sys
from pathlib import Path

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:
    sys.path.append(p)

from myutils.project_utils import mkdir_if_not_exist, traverse_dir_files


class ExportCombPdbs(object):
    """
    导出 Comb PDBs 文件
    """
    def __init__(self):
        pass

    def process(self, input_dir, output_dir):
        print(f"[Info] input_dir: {input_dir}")
        print(f"[Info] output_dir: {output_dir}")
        mkdir_if_not_exist(output_dir)
        path_list = traverse_dir_files(input_dir, "pdb")
        for path in path_list:
            base_name = os.path.basename(path)
            folder_name = path.split("/")[-2]
            if not base_name.startswith("unrelaxed"):
                continue
            # AFM_A0_A0_A0_unrelaxed_rank_1_model_3.pdb
            output_name = f"AFM_{folder_name}_{base_name}"
            output_path = os.path.join(output_dir, output_name)
            shutil.copy(path, output_path)  # 复制文件


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-i",
        "--input-dir",
        type=Path,
        required=True,
    )
    parser.add_argument(
        "-o",
        "--output-dir",
        type=Path,
        required=True
    )
    args = parser.parse_args()

    input_dir = str(args.input_dir)
    output_dir = str(args.output_dir)

    assert os.path.isfile(input_dir)

    ecp = ExportCombPdbs()
    ecp.process(input_dir, output_dir)


def main2():
    input_dir = "mydata/comb_msas"
    output_dir = "mydata/outputs"
    ecp = ExportCombPdbs()
    ecp.process(input_dir, output_dir)


if __name__ == '__main__':
    main()

run_examples.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/19
"""

import os
import shutil
import sys

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:
    sys.path.append(p)


from scripts import run_on_pdbs
from myutils.project_utils import mkdir_if_not_exist
from root_dir import ROOT_DIR, DATA_DIR


class RunExamples(object):
    """
    运行程序
    """
    def __init__(self):
        pass

    def process(self):
        # path_on_drive = os.path.join(ROOT_DIR, "example")  # @param {type:"string"}
        path_on_drive = os.path.join(DATA_DIR, "example_1")  # @param {type:"string"}
        max_results_number = "5"  # @param [1, 5, 10, 20]
        create_cif_instead_of_pdb = False  # @param {type:"boolean"}

        subunits_path = os.path.join(path_on_drive, "subunits.json")
        pdbs_folder = os.path.join(path_on_drive, "pdbs")
        assembled_folder = os.path.join(path_on_drive, "assembled")
        mkdir_if_not_exist(assembled_folder)
        tmp_assembled_folder = os.path.join(path_on_drive, "tmp_assembled")

        mkdir_if_not_exist(assembled_folder)
        mkdir_if_not_exist(tmp_assembled_folder)

        if os.path.exists(assembled_folder):
            answer = input(f"[Info] {assembled_folder} already exists, Should delete? (y/n)")
            if answer in ("y", "Y"):
                print("[Info] Deleting")
                shutil.rmtree(assembled_folder)
            else:
                print("[Info] Stopping")
                exit()

        if os.path.exists(tmp_assembled_folder):
            shutil.rmtree(tmp_assembled_folder)

        # 核心运行逻辑
        run_on_pdbs.run_on_pdbs_folder(subunits_path, pdbs_folder, tmp_assembled_folder,
                                       output_cif=create_cif_instead_of_pdb,
                                       max_results_number=int(max_results_number))

        shutil.copytree(os.path.join(tmp_assembled_folder, "assembled_results"),
                        assembled_folder)

        print("[Info] Results saved to", assembled_folder)


def main():
    re = RunExamples()
    re.process()


if __name__ == '__main__':
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1461716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang实现图片上传

实现个图片上传&#xff0c;记录一下 我这里是采用的调试工具&#xff0c;apipost去直接上传的&#xff0c;参数值选择file即可 上传的图片&#xff0c;两种方式&#xff0c;一是用原来的文件名&#xff0c;直接file.Filename即可。 func Upload(c *gin.Context) {file, _ : …

基于SSM实现的人事管理系统(源代码+数据库脚本)

文章目录 系统介绍技术选型成果展示账号地址及其他说明源码获取 系统介绍 系统演示 微信视频号&#xff1a;【全栈小白】查看视频 基于SSM实现的人事管理系统使用JavaEE开发&#xff0c;基于SpringMVCMybatis框架&#xff0c;该项目包含了用户管理、部门管理、职位管理、员工…

为什么在MOS管开关电路设计中使用三极管容易烧坏?

MOS管作为一种常用的开关元件&#xff0c;具有低导通电阻、高开关速度和低功耗等优点&#xff0c;因此在许多电子设备中广泛应用。然而&#xff0c;在一些特殊情况下&#xff0c;我们需要在MOS管控制电路中加入三极管来实现一些特殊功能。然而&#xff0c;不同于MOS管&#xff…

Sora:视频生成模型作为世界模拟器

我们探索了视频数据上生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和长宽比的视频和图像上联合训练文本条件扩散模型。我们利用了一个在视频和图像潜在码的时空块上操作的变压器架构。我们规模最大的模型 Sora 能够生成一分钟的高保真视频。我们的结…

mybitsPlus乐观锁@Version案例测试,发现有失效的情况

mybitsPlus乐观锁Version案例测试&#xff0c;发现有失效的情况 一、案例 Data TableName("NEWTABLE_TEST") ApiModel(value "BusBalance对象", description "额度表") public class NewTableTest {private static final long serialVersion…

Servlet中的请求与响应

Request和Response 1.Request和Response的概述2.Request对象2.1 Request继承体系2.2 Request获取请求数据2.3 解决post请求乱码问题 *2.4 Request请求转发(-&#xff0c;*)2.5 request的生命周期 3.HTTP响应详解(理解)1.使用抓包查看响应报文协议内容2.HTTP响应报文协议介绍 4.…

[notice] A new release of pip is available: 23.2.1 -> 24.0

翻译之后&#xff1a;〔通知〕新版本的pip可用&#xff1a;23.2.1->24.0 就是说&#xff0c;你的pip版本需要从当前的 23.2.1 升级到最新版本 24.0&#xff0c;执行如下命令&#xff1a; cmd命令以管理员身份进入目录 ${Python}\Python3.12.1\Scripts下&#xff0c;执行 p…

分享金媒v10.3开源系统中CRM线下客户管理系统使用指南和小程序上架细分流程

本系统金媒婚恋开源系统v10.3也叫择爱系统目前最新版全开源包括OElove最新版10.0都是最新但是很多客户不动CRM使用流程我就按照流程给大家介绍下如果大家对程序感兴趣也可以分享给你看我昵称里可以Q我&#xff0c;请注明&#xff1a;CSDN网友 ●本系统红娘分两种&#xff0c;一…

杂题——1028: [编程入门]自定义函数求一元二次方程

题目描述 求方程 的根&#xff0c;用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根&#xff0c;并输出结果。从主函数输入a、b、c的值。 输入格式 a b c 输出格式 x1? x2? 样例输入 4 1 1 样例输出 x1-0.1250.484i x2-0.125-0.484i 分析&#xff1a; 注意输出的格式和…

论文阅读——SqueezeSAM

SqueezeSAM: User-Friendly Mobile Interactive Segmentation 比SAM更小&#xff0c;更快。 框架&#xff1a; 使用的U型结构 使用BatchNorm而不是LayerNorm节省计算&#xff1b; 对于用户点击和框&#xff0c;单独作为通道&#xff0c;前融合和后融合&#xff08;sam只有后融…

QML | 信号和信号处理器特性

信号和信号处理器特性 很多时候,应用程序的用户界面组件需要相互通信。例如,一个按钮需要知道用户是否进行了单击:当用户单击后,它可能会更改颜色来指示它状态的改变,或者执行一些逻辑代码实现一定的功能。同Qt一样,QML包含了相似的信号和信号处理器机制。 信号是发出事件…

惠尔顿安全审计系统任意文件读取漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

每日OJ题_二叉树dfs③_力扣814. 二叉树剪枝

目录 力扣814. 二叉树剪枝 解析代码 力扣814. 二叉树剪枝 814. 二叉树剪枝 难度 中等 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 n…

读书笔记-增强型分析:AI驱动的数据分析、业务决策与案例实践

目录 前言 运用人工智能技术&#xff0c;可以使人类社会变得更美好。人们总是期待产品更适合、服务更贴心、生活更便利。在实践中&#xff0c;技术给企业赋能&#xff0c;企业通过优质的产品和服务满足社会&#xff0c;提升人类福祉。很多金融企业已经开始尝试向潜在客户推送…

使用JavaVisualVM排查FullGC问题

1.工具准备 在这里使用 jdk/bin 目录下的 jvisualvm.exe&#xff0c;是自带工具。 2.工具使用 将下载到本地的dump 文件导入工具中&#xff0c;会展示各个类的实例数占比&#xff0c;大小占比。 3.问题排查 前期准备 在分析dump文件之前&#xff0c;我们可以先观察应用中接…

01 前言

目录 什么是CC发展史C的重要性如何学习C关于本专栏 1. 什么是c C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20…

一文了解大数据生态

大数据一词最早指的是传统数据处理应用软件无法处理的过于庞大或过于复杂的数据集。 现在&#xff0c;对“大数据”一词的使用倾向于使用预测分析、用户行为分析或者其他一些从大数据中提取价值的高级数据分析方法&#xff0c;很少用于表示特定规模的数据集。 定义 大数据是…

机器视觉系统选型-为什么还要选用工业光源控制器

工业光源控制器最主要的用途是给光源供电&#xff0c;实现光源的正常工作。 1.开关电源启动时&#xff0c;电压是具有波浪的不稳定电压&#xff0c;其瞬间峰值电压超过了LED灯的耐压值&#xff0c;灯珠在多次高压冲击下严重降低了使用寿命&#xff1b; 2.使用专用的光源控制器&…

Netty中的PooledByteBuf池化原理剖析

PooledByteBuf PooledByteBuf是池化的ByteBuf&#xff0c;提高了内存分配与释放的速度&#xff0c;它本身是一个抽象泛型类&#xff0c; 有三个子类:PooledDirectByteBuf、PooledHeapByteBuf、PooledUnsafeDirectByteBuf. Jemalloc算法 Netty的PooledByteBuf采用与jemalloc一…

SICTF Round#3 の WP

Misc 签到 SICTF{1f4ce05a-0fed-42dc-9510-6e76dff8ff53} Crypto [签到]Vigenere 附件内容&#xff1a; Gn taj xirly gf Fxgjuakd, oe igywnd mt tegbs mnrxxlrivywd sngearbsw wakksre. Bs kpimj gf tank, it bx gur bslenmngn th jfdetagur mt ceei yze Ugnled Lystel t…