PSP - D-I-TASSER DeepMSA2 源码简读

news2024/10/6 1:38:35

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

DIT

DIT:https://zhanggroup.org/D-I-TASSER/

D-I-TASSER (Deep-learning based Iterative Threading ASSEmbly Refinement) is a new method extended from I-TASSER for high-accuracy protein structure and function predictions.

D-I-TASSER (Deep-learning based Iterative Threading ASSEmbly Refinement,即基于深度学习的迭代、穿线、组装、精调) ,从 I-TASSER 扩展的新方法,用于高精度的蛋白结构和功能预测。

Starting from a query sequence, D-I-TASSER first generates inter-residue contact and distance maps and hydrogen-bond (HB) networks using multiple deep neural-network predictors, including AttentionPotential (self-attention network built on MSA transformer) and DeepPotential.

从一个查询序列开始,D-I-TASSER 首先使用多个深度神经网络预测器,生成,残基间接触 (inter-residue contact) 、距离图 (distance maps) 以及 氢键 (HB) 网络,包括 AttentionPotential (基于 MSA Transformer 的自注意力网络) 和 DeepPotential 。

Meanwhile, it identifies structural templates by the meta-threading LOMETS3 approach, which includes the models built from the state-of-the-art AlphaFold2 program.

同时,通过 元穿线 (meta-threading) LOMETS3 方法,识别结构模板,其中包括,由最先进的AlphaFold2程序构建的模型。

The full-length atomic models are finally assembled by iterative fragment assembly Monte Carlo simultions under the guidance of I-TASSER force field and deep-learning contact/distance/HB restraints, where biological functions of the query protein are derived from the structure models by COFACTOR.

最终,全长原子模型,在 I-TASSER 力场和深度学习 接触(contact) / 距离(distance) / HB 约束的指导下,通过迭代的 片段组装蒙特卡罗模拟 (fragment assembly Monte Carlo simultions) 进行组装,其中查询蛋白的生物学功能,由 COFACTOR 从结构模型中推导出来。

The D-I-TASSER pipeline (as ‘UM-TBM’ and ‘Zheng’) was ranked as the No. 1 server/predictor in all categories of protein structure prediction in the most recent CASP15 experiment, including Multi-domain Targets, Single-domain Targets, and Multi-chain Targets.

D-I-TASSER 流程 (作为“UM-TBM”和“Zheng”),在最近的 CASP15 实验中,被评为所有类别蛋白质结构预测的第一名,在服务器组和预测器组中,包括多域目标、单域目标和多链目标。

DeepMSA2

DeepMSA2:https://zhanggroup.org/DeepMSA/

DeepMSA (version 2) is a hierarchical approach to create high-quality multiple sequence alignments (MSAs) for monomer and multimer proteins.

DeepMSA (version 2) 是层次方法,用于创建单体和多体蛋白质的高质量多序列比对 (MSAs)。

The method is built on iterative sequence database searching followed by fold-based MSA ranking and selection.

该方法基于迭代的序列数据库搜索,然后,根据折叠为基础的 MSA 排名和选择。

For protein monomers, MSAs are produced with three iterative MSA searching pipelines (dMSA, qMSA and mMSA) through whole-genome (Uniclust30 and UniRef90) and metagenome (Metaclust, BFD, Mgnify, TaraDB, MetaSourceDB and JGIclust) sequence databases.

对于蛋白质单体,通过全基因组 (Uniclust30 和 UniRef90) 和宏基因组 (Metaclust、BFD、Mgnify、TaraDB、MetaSourceDB 和 JGIclust) 序列数据库,使用三种迭代的 MSA 搜索流程 (dMSA、qMSA 和 mMSA) 生成 MSAs。

For protein multimers, a number of hybrid MSAs are created by pairing the sequences from monomer MSAs of the component chains, with the optimal multimer MSAs selected based on a combined score of MSA depth and folding score of the monomer chains.

对于蛋白质多体,通过将来自组分链的单体 MSAs 的序列配对,创建了一些混合 MSAs,根据组合得分,包括 MSA 深度和单体链的折叠得分,选择最佳的多体 MSAs。

Large-scale benchmark data show significant advantage of DeepMSA2 in generating accurate MSAs with balanced depth and alignment coverage which are most suitable for deep-learning based protein and protein complex stucture and function predictions.

大规模的基准数据显示,DeepMSA2 在生成准确的 MSAs 方面具有显著的优势,这些 MSAs 具有平衡的深度和比对覆盖度,最适合基于深度学习的蛋白质以及蛋白质复合物结构和功能预测。

DeepMSA2 整体架构:
DeepMSA2

1. DeepMSA2 (no IMG)

核心逻辑位于DeepMSA2_noIMG.pl

dq_time = time.time()
subprocess.run([f"contact/DeepMSA2/scripts/DeepMSA2_noIMG.pl",
                self.seqname, self.datadir, self.pkgdir, self.libdir, python2])
print(f"[Info] dMSA和qMSA步运行时间: {time_elapsed(dq_time, time.time())}")

(1) 运行脚本qMSA2.py,即qMSA:

$python2 $HHLIB/scripts/qMSA2.py \\
    -hhblitsdb=$qhhblitsdb \\
    -jackhmmerdb=$qjackhmmerdb \\
    -hhblits3db=$qhhblits3db \\
    -hmmsearchdb=$qhmmsearchdb \\
    -tmpdir=/tmp/$ENV{USER}/$tag \\
    -ncpu=$cpu \\
    $datadir/MSA/qMSA.fasta

(2) 运行脚本build_MSA.py,即dMSA,DeepMSA:

$python2 $HHLIB/scripts/build_MSA.py \\
    -hhblitsdb=$dhhblitsdb \\
    -jackhmmerdb=$djackhmmerdb \\
    -hmmsearchdb=$dhmmsearchdb \\
    -tmpdir=/tmp/$ENV{USER}/$tag \\
    -ncpu=$cpu \\
    $datadir/MSA/DeepMSA.fasta

1.1 qMSA

qMSA

源码位于qMSA2.py,包括4个部分,即Uniclust30、UniRef90、BFD、MGnify。使用级联搜索,优先以Neff值高的MSA作为索引,最终,选择Neff值最高的作为qMSA。

第1部分

  • 搜索算法:hhblits
  • 搜库:Uniclust30 (uniclust30_2017_04),约64G,时间2017.04,最新是2022.02
  • 输出:qMSA.hhba3m.gz、qMSA.hhbaln.gz
  • 时间:19.1695s (117)

源码如下:

print("[Info] " + "+" * 100)
q1_time = time.time()
print("[Info] #### run hhblits ####")
hhblits_prefix=os.path.join(tmpdir,"hhblits")
if db_dict["hhblitsdb"]:
    c1 = overwrite_dict["hhblits"]
    c2 = not os.path.isfile(prefix+".hhbaln.gz")
    c3 = not os.path.isfile(prefix+".hhba3m.gz")
    print("[Info] 是否运行: {}, 具体条件: {} or {} or {}".format(c1 or c2 or c3, c1, c2, c3))
    if c1 or c2 or c3:
        # generates hhblits_prefix.a3m hhblits_prefix.aln
        # hhblits_prefix.60.a3m hhblits_prefix.60.aln
        sys.stdout = open(os.devnull, 'w')  # 关闭日志
        hhb_nf = run_hhblits(query_fasta, db_dict["hhblitsdb"], ncpu, hhblits_prefix)
        plain2gz(hhblits_prefix + ".aln", prefix + ".hhbaln.gz")
        plain2gz(hhblits_prefix + ".a3m", prefix + ".hhba3m.gz")
        sys.stdout = sys.__stdout__  # 打开日志
    else:
        gz2plain(prefix + ".hhbaln.gz", hhblits_prefix + ".aln")
        gz2plain(prefix + ".hhba3m.gz", hhblits_prefix + ".a3m")
        hhb_nf = getNf(hhblits_prefix)
        sys.stdout.write("%s and %s exists, skip hhblitsdb\n"%(prefix+".hhbaln",prefix+".hhba3m"))

    nf = hhb_nf
    print("[Info] hhb_nf = {}, target_nf = {}, passed: {}".format(nf, target_nf, hhb_nf >= target_nf))
    if hhb_nf >= target_nf:   # 满足条件直接停止
        shutil.copyfile(hhblits_prefix+".aln", prefix+".aln")
        shutil.copyfile(hhblits_prefix+".a3m", prefix+".a3m")
        sys.stdout.write("Final MSA by hhblits with Nf >=%.1f\n" % nf)
        if os.environ.get("DITADDUP", "N") == "N":
            return nf
print("[Info] #### FINISH run hhblits ####")
print("[Info] 数据库: {}".format(db_dict["hhblitsdb"]))
print("[Info] qMSA 第1步耗时: {} 输出: {}".format((time.time() - q1_time), prefix + ".hhbaln.gz(hhba3m.gz)"))
print("[Info] " + "+" * 100)

Uniclust30:https://wwwuser.gwdg.de/~compbiol/uniclust/2022_02/

  • 最新版本是2022.02

Uniclust30

第2部分

  • 搜索算法:jackblits
  • 搜库:UniRef90 (uniref90.fasta),约74G
  • 额外输入:hhblits.a3m,搜子库 jackblits-mydb (4.9M)
  • 输出:qMSA.jacaln.gz、qMSA.jaca3m.gz
  • 时间:230.8850s (117)

源码如下:

print("[Info] " + "+" * 100)
q2_time = time.time()
print("[Info] #### run jack_hhblits ####")
jackblits_prefix=os.path.join(tmpdir,"jackblits")
if db_dict["jackhmmerdb"]:
    c1 = overwrite_dict["jackhmmer"]
    c2 = not os.path.isfile(prefix+".jacaln.gz")
    c3 = not os.path.isfile(prefix+".jaca3m.gz")
    print("[Info] 是否运行: {}, 具体条件: {} or {} or {}".format(c1 or c2 or c3, c1, c2, c3))
    if c1 or c2 or c3:
        # generates jackblits_prefix.a3m jackblits_prefix.aln
        # jackblits_prefix.60.a3m jackblits_prefix.60.aln
        sys.stdout = open(os.devnull, 'w')  # 关闭日志
        jack_nf=run_jackblits(query_fasta, db_dict["jackhmmerdb"].split(':'), ncpu, hhblits_prefix, jackblits_prefix)
        plain2gz(jackblits_prefix+".aln",prefix+".jacaln.gz")
        plain2gz(jackblits_prefix+".a3m",prefix+".jaca3m.gz")
        sys.stdout = sys.__stdout__  # 打开日志
    else:
        gz2plain(prefix+".jacaln.gz",jackblits_prefix+".aln")
        gz2plain(prefix+".jaca3m.gz",jackblits_prefix+".a3m")
        jack_nf=getNf(jackblits_prefix)
        sys.stdout.write("%s and %s exists, skip jackhmmerdb\n"%(prefix+".jacaln.gz",prefix+".jaca3m.gz"))
    
    nf = max([jack_nf, hhb_nf])
    print("[Info] jack_nf = {}, max nf = {}, target_nf = {}, passed: {}"
          .format(jack_nf, nf, target_nf, nf >= target_nf))
    if jack_nf >= target_nf:
        shutil.copyfile(jackblits_prefix+".aln",prefix+".aln")
        shutil.copyfile(jackblits_prefix+".a3m",prefix+".a3m")
        sys.stdout.write("Final MSA by jackhmmer with Nf >=%.1f\n"%nf)
        if os.environ.get("DITADDUP", "N") == "N":
            return nf
print("[Info] #### FINISH run jack_hhblits ####")
print("[Info] 数据库: {}".format(db_dict["jackhmmerdb"]))
print("[Info] 是否使用 qMSA 第1步的输出: {}".format(os.path.isfile(hhblits_prefix + ".a3m")))
print("[Info] qMSA 第2步耗时: {} 输出: {}".format((time.time() - q2_time), prefix + ".jacaln.gz(jaca3m.gz)"))
print("[Info] " + "+" * 100)

第3部分

  • 搜索算法:hhblits3
  • 搜库:BFD(bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt),1.8T
  • 额外输入:优先使用第2步的输出 (jackblits.a3m),其次第1步 (hhblits.a3m),搜子库hhblits3-mydb (1.5M)。
  • 输出:qMSA.hh3aln.gz、qMSA.hh3a3m.gz
  • 时间:276.7781s (117)

源码如下:

print("[Info] " + "+" * 100)
q3_time = time.time()
print("[Info] #### run hhblits3 ####") # , flush=True)
hhblits3_prefix=os.path.join(tmpdir, "hhblits3")
if db_dict["hhblits3db"]:
    c1 = overwrite_dict["hhblits3"]
    c2 = not os.path.isfile(prefix+".hh3aln.gz")
    c3 = not os.path.isfile(prefix+".hh3a3m.gz")
    print("[Info] 是否运行: {}, 具体条件: {} or {} or {}".format(c1 or c2 or c3, c1, c2, c3))
    if c1 or c2 or c3:
        sys.stdout = open(os.devnull, 'w')  # 关闭日志
        hh3_nf=run_hhblits3(query_fasta, db_dict["hhblits3db"].split(':'),
                            ncpu, hhblits_prefix, jackblits_prefix, hhblits3_prefix)
        plain2gz(hhblits3_prefix+".aln", prefix+".hh3aln.gz")
        plain2gz(hhblits3_prefix+".a3m", prefix+".hh3a3m.gz")
        sys.stdout = sys.__stdout__  # 打开日志
    else:
        gz2plain(prefix+".hh3aln.gz",hhblits3_prefix+".aln")
        gz2plain(prefix+".hh3a3m.gz",hhblits3_prefix+".a3m")
        hh3_nf=getNf(hhblits3_prefix)
        sys.stdout.write("%s and %s exists, skip hhblits3db\n"%(prefix+".hh3aln.gz",prefix+".hh3a3m.gz"))
    nf = max([hh3_nf, jack_nf, hhb_nf])
    print("[Info] hh3_nf = {}, max nf = {}, target_nf = {}, passed: {}"
          .format(hh3_nf, nf, target_nf, hh3_nf >= target_nf))
    if hh3_nf >= target_nf:
        shutil.copyfile(hhblits3_prefix+".aln",prefix+".aln")
        shutil.copyfile(hhblits3_prefix+".a3m",prefix+".a3m")
        sys.stdout.write("Final MSA by hhblits3 with Nf >=%.1f\n"%nf)
        if os.environ.get("DITADDUP", "N") == "N":
            return nf
print("[Info] 数据库: {}".format(db_dict["hhblits3db"]))
print("[Info] 是否使用 qMSA 第1-2步的输出: {}, {}".format(
    os.path.isfile(jackblits_prefix+".a3m"), jackblits_prefix+".a3m"))
print("[Info] qMSA 第3步耗时: {} 输出: {}".format((time.time() - q3_time), prefix + ".hh3aln.gz(hh3a3m.gz)"))
print("[Info] " + "+" * 100)

第4部分

  • 搜索算法:hmsblits (hmmsearch)
  • 搜库:MGnify(mgy_clusters.clean.fasta),60G
  • 额外输入:使用最大NF值的a3m
  • 输出:qMSA.hmsaln.gz、qMSA.hmsa3m.gz
  • 时间:343.5184 (117)

源码如下:

q4_time = time.time()
print("[Info] " + "+" * 100)
print("[Info] #### run hmmsearch ####") # , flush=True)
hmmsearch_prefix = os.path.join(tmpdir,"hmmsearch")
if db_dict["hmmsearchdb"]:
    c1 = overwrite_dict["hmmsearch"]
    c2 = not os.path.isfile(prefix+".hmsaln.gz")
    c3 = not os.path.isfile(prefix+".hmsa3m.gz")
    print("[Info] 是否运行: {}, 具体条件: {} or {} or {}".format(c1 or c2 or c3, c1, c2, c3))
    if c1 or c2 or c3:
        # TODO: 建议使用字典
        # 优先处理 jumpstart_profile_prefix,其次处理 query_profile_prefix
        query_profile_prefix = jackblits_prefix  # 使用最大的NF值
        if jack_nf < hhb_nf:
            query_profile_prefix = hhblits_prefix
        jumpstart_profile_prefix = hhblits3_prefix  # 使用最大的NF值
        if hh3_nf < jack_nf:
            jumpstart_profile_prefix = jackblits_prefix
            if jack_nf < hhb_nf:
                jumpstart_profile_prefix = hhblits_prefix

        # generates hmmsearch_prefix.afq hmmsearch_prefix.hmm
        # hmmsearch_prefix.redundant hmmsearch_prefix.nonredundant
        # hmmsearch_prefix.aln
        sys.stdout = open(os.devnull, 'w')  # 关闭日志
        hms_nf=search_metaclust(query_fasta, sequence, query_profile_prefix, jumpstart_profile_prefix,
                                db_dict["hmmsearchdb"].split(':'),ncpu,hmmsearch_prefix)
        plain2gz(hmmsearch_prefix+".aln",prefix+".hmsaln.gz")
        plain2gz(hmmsearch_prefix+".a3m",prefix+".hmsa3m.gz")
        sys.stdout = sys.__stdout__  # 打开日志
        print("[Info] 是否使用 qMSA 第1-3步的输出: {}".format(jumpstart_profile_prefix + ".a3m"))
    else:
        gz2plain(prefix+".hmsaln.gz",hmmsearch_prefix+".aln")
        gz2plain(prefix+".hmsa3m.gz",hmmsearch_prefix+".a3m")
        sys.stdout.write("%s and %s exists, skip hmmsearchdb\n"%(prefix+".hmsaln.gz",prefix+".hmsa3m.gz"))
        hms_nf=getNf(hmmsearch_prefix)
    nf = max([hh3_nf, jack_nf, hhb_nf, hms_nf])
    print("[Info] NF - hhb_nf(s1): {}, jack_nf(s2): {}, hh3_nf(s3): {}, hms_nf(s4): {}"
          .format(hhb_nf, jack_nf, hh3_nf, hms_nf))
    print("[Info] hms_nf = {}, max nf = {} (target_nf), passed: {}".format(hms_nf, nf, hms_nf >= nf))
    if hms_nf > nf:  # hmmsearch replaces jackblits and hhblits result
        nf = hms_nf
        shutil.copyfile(hmmsearch_prefix+".aln", prefix+".aln")
        shutil.copyfile(hmmsearch_prefix+".a3m", prefix+".a3m")
        sys.stdout.write("Final MSA by hmmsearch with Nf >=%.1f\n"%nf)
        if os.environ.get("DITADDUP", "N") == "N":
            return nf
print("[Info] 数据库: {}".format(db_dict["hmmsearchdb"]))
print("[Info] qMSA 第4步耗时: {} 输出: {}".format((time.time() - q4_time), prefix + ".hmsaln.gz(hmsa3m.gz)"))
print("[Info] " + "+" * 100)

最终,根据Neff值,在4组MSA中,选出最终的MSA,作为qMSA.a3m,理论上Neff值越来越高。例如:

NF - hhb_nf(s1): 7.98306, jack_nf(s2): 20.9298, hh3_nf(s3): 22.5877, hms_nf(s4): 25.3418
MSA Len - hhb: 121, jac: 402, hh3: 492, hms: 568

源码如下:

# 选择最优的NF作为qMSA的最终输出
print("[Info] NF - hhb_nf(s1): {}, jack_nf(s2): {}, hh3_nf(s3): {}, hms_nf(s4): {}"
      .format(hhb_nf, jack_nf, hh3_nf, hms_nf))
nf = max([hh3_nf, jack_nf, hhb_nf, hms_nf])
print("[Info] hms_nf = {}, max nf = {} (target_nf), passed: {}".format(hms_nf, nf, hms_nf >= nf))
if hms_nf >= nf:  # hmmsearch replaces jackblits and hhblits result
    nf = hms_nf
    shutil.copyfile(hmmsearch_prefix + ".aln", prefix + ".aln")
    shutil.copyfile(hmmsearch_prefix + ".a3m", prefix + ".a3m")
    sys.stdout.write("[Info] step4 - hmmsearch MSA has %.1f Nf. Output anyway.\n" % hms_nf)
else:
    if hh3_nf >= max(jack_nf, hhb_nf):
        shutil.copyfile(hhblits3_prefix+".aln", prefix+".aln")
        shutil.copyfile(hhblits3_prefix+".a3m", prefix+".a3m")
        sys.stdout.write("[Info] step3 - hhblits3 MSA has %.1f Nf. Output anyway.\n"%hh3_nf)
    elif jack_nf >= max(hh3_nf, hhb_nf):
        shutil.copyfile(jackblits_prefix+".aln", prefix+".aln")
        shutil.copyfile(jackblits_prefix+".a3m", prefix+".a3m")
        sys.stdout.write("[Info] step2 - jackhmmer MSA has %.1f Nf. Output anyway.\n"%jack_nf)
    else:  # hhb_nf >= nf:
        shutil.copyfile(hhblits_prefix+".aln", prefix+".aln")
        shutil.copyfile(hhblits_prefix+".a3m", prefix+".a3m")
        sys.stdout.write("[Info] step1 - hhblits MSA has %.1f Nf. Output anyway.\n"%hhb_nf)
# prefix 即 output 的目录
print("[Info] qMSA 执行完成 {}, 输出 {}".format((time.time() - q1_time), prefix+".aln|a3m"))
print("[Info] " + "+" * 100)

Neff,在MSA中,默认高质量阈值是128,公式如下:

Neff

1.2 dMSA (DeepMSA)

dMSA

源码位于build_MSA.py,包括4个部分,即Uniclust30、UniRef90、Metaclust&MGnify,最后一步,联合搜索Metaclust&MGnify。

第1部分:与qMSA完全相同,包括输出MSA的Neff值。

第2部分:与qMSA完全相同,包括输出MSA的Neff值。

第3部分,目标就是搜索,第3部分:

  • 搜索算法:hmsblits (hmmsearch)
  • 搜库:Metaclust(metaclust.fasta),153G;MGnify(mgy_clusters.clean.fasta),60G
  • 额外输入:使用最大NF值的a3m
  • 输出:DeepMSA.hmsaln、DeepMSA.hmsa3m
  • 时间:1086.5113 (117),1T大约84.9765

源码如下:

print("[Info] " + "+" * 100)
d3_time = time.time()
print("[Info] #### run hmmsearch ####") # , flush=True)
hmmsearch_prefix=os.path.join(tmpdir,"hmmsearch")
if db_dict["hmmsearchdb"]:
    c1 = overwrite_dict["hmmsearch"]
    c2 = not os.path.isfile(prefix+".hmsaln")
    c3 = not os.path.isfile(prefix+".hmsa3m")
    c4 = build_hmmsearch_db
    print("[Info] 是否运行: {}, 具体条件: {} or {} or {} or {}".format(c1 or c2 or c3 or c4, c1, c2, c3, c4))
    if c1 or c2 or c3 or c4:
        # generates hmmsearch_prefix.afq hmmsearch_prefix.hmm
        # hmmsearch_prefix.redundant hmmsearch_prefix.nonredundant
        # hmmsearch_prefix.aln
        sys.stdout = open(os.devnull, 'w')  # 关闭日志
        hms_nf=search_metaclust(query_fasta, sequence,
            hhblits_prefix if jack_nf < hhb_nf else jackblits_prefix,
            db_dict["hmmsearchdb"].split(':'), ncpu, hmmsearch_prefix)
        shutil.copyfile(hmmsearch_prefix + ".aln", prefix + ".hmsaln")
        if os.path.isfile(hmmsearch_prefix + ".a3m"):
            shutil.copyfile(hmmsearch_prefix + ".a3m", prefix + ".hmsa3m")
        sys.stdout = sys.__stdout__  # 打开日志
    else:
        shutil.copyfile(prefix+".hmsaln",hmmsearch_prefix+".aln")
        if os.path.isfile(prefix+".hmsa3m"):
            shutil.copyfile(prefix+".hmsa3m",hmmsearch_prefix+".a3m")
        sys.stdout.write("[Info] %s exists, skip hmmsearchdb\n"%(prefix+".hmsaln"))
        hms_nf = getNf(hmmsearch_prefix)

print("[Info] 数据库: {}".format(db_dict["hmmsearchdb"]))
print("[Info] dMSA 第3步耗时: {} 输出: {}".format((time.time() - d3_time), prefix + ".hmsaln(hmsa3m)"))
print("[Info] " + "+" * 100)

其余,也与qMSA相同,也是根据Neff选择最优的MSA,例如:

NF - hhb_nf(s1): 7.98306, jack_nf(s2): 20.9298, hms_nf(s3): 23.6956

2. DeepMSA2 (IMG)

检测是否需要运行IMG:

next if (-f "$datadir/JGI/$DBfasta.cdhit");  # 检查是否需要运行

第1部分

  • 使用qhmmsearch搜索qMSA.hh3aln.gz
  • 输出:DB.fasta.bq.cdhitDB.fasta.bq.cdhit.clstr
  • 耗时:24.9616s

源码如下:

cp $datadir/MSA/qMSA.hh3aln.gz seq.hh3aln.gz
gzip -df seq.hh3aln.gz
if [ ! -s "seq.hh3aln" ];then
    cp $datadir/MSA/DeepMSA.jacaln seq.hh3aln
fi
if [ ! -s "seq.hh3aln" ];then
    cp $datadir/MSA/DeepMSA.hhbaln seq.hh3aln
fi

sed = seq.hh3aln |sed 'N;s/\\n/\\t/'|sed 's/^/>/g'|sed 's/\\t/\\n/g'| $HHLIB/bin/qhmmbuild -n aln --amino -O seq.afq --informat afa seq.hmm -

$HHLIB/qhmmer_new/qhmmsearch --cpu 192 -E 10 --incE 1e-3 -A $DBfasta.match --tblout $DBfasta.tbl -o $DBfasta.out seq.hmm $JGI/$DBfasta
$HHLIB/bin/esl-sfetch -f $JGI/$DBfasta $DBfasta.tbl|sed 's/*//g' > $DBfasta.fseqs
$HHLIB/bin/cd-hit -i $DBfasta.fseqs -o $datadir/JGI/$DBfasta.cdhit -c 1 -M 3000

第2部分:常规搜索,类似qMSA和dMSA,输出DeepJGI.alnq3JGI.alnq4JGI.aln三个文件。

源码如下:

my $cmd="$HHLIB/scripts/qMSA2.py -hhblitsdb=$hhblitsdb -jackhmmerdb=$jackhmmerdb -hhblits3db=$hhblits3db -hmmsearchdb=$tmpdir/DB.fasta.fseqs -tmpdir=$tmpdir/MSA $datadir/JGI/q4JGI.fasta";
...
my $cmd="$HHLIB/scripts/qMSA2.py -hhblitsdb=$hhblitsdb -jackhmmerdb=$jackhmmerdb -hmmsearchdb=$tmpdir/DB.fasta.fseqs -tmpdir=$tmpdir/MSA $datadir/JGI/q3JGI.fasta";
...
my $cmd="$HHLIB/scripts/build_MSA.py -hhblitsdb=$hhblitsdb -jackhmmerdb=$jackhmmerdb -hmmsearchdb=$tmpdir/DB.fasta.fseqs -tmpdir=$tmpdir/MSA $datadir/JGI/DeepJGI.fasta";

3. MSA 评估

使用官方的AF2 (AlphaFold2),评估MSA,区别是模型只使用model1_1、调整(relax)1次,因此,只输出1个模型,通过pLDDT进行排序。

具体步骤如下:

  1. 整理所有MSA,包括qMSA、dMSA和JGI-MSA,去重,保留7个MSA。
  2. 将不同的MSA建立不同的文件夹,文件夹中只有seq.aln、seq.a3m两种格式。
  3. 通过AF2预测结构,输入至MSA文件夹的seq目录。
  4. 整理评估结果至 AF2models 文件夹,MSA 信息位于 model.info 文件。
  5. 最优的MSA,位于MSA文件夹中,即 protein.a3m、protein.aln。

参考脚本:

  1. I-TASSERmod/run_AF2_multiMSA.py
  2. thirdparty/alphafold2/run_alphafold_msa_benchmark.sh
  3. thirdparty/alphafold2/run_alphafold_msa_benchmark.py

AF2模型位置位于:thirdparty/alphafold2/run_alphafold_msa_benchmark.py

model_params = data.get_model_haiku_params(
    model_name=model_name, data_dir=FLAGS.data_dir)
...

# thirdparty/alphafold2/alphafold/model/data.py
def get_model_haiku_params(model_name: str, data_dir: str) -> hk.Params:
  """Get the Haiku parameters from a model name."""

  path = os.path.join(data_dir, 'params', f'params_{model_name}.npz')

  with open(path, 'rb') as f:
    params = np.load(io.BytesIO(f.read()), allow_pickle=False)

  return utils.flat_params_to_haiku(params)

官网:https://github.com/deepmind/alphafold

Model

参考

  • StackOverflow - Specifying multiple trusted hosts in pip.conf
  • linux解压缩.gz文件命令
  • 知乎 - CASP15蛋白结构预测冠军算法浅析

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

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

相关文章

MySQL学习笔记第八天

第07章单行函数 4. 日期和时间函数 4.6 计算日期和时间的函数 第1组&#xff1a; 函数用法DATE_ADD(datetime,lNTERVAL exprtype)&#xff0c;ADDDATE(date,INTERVAL exprtype)返回与给定日期时间相差INTERVAL时间段的日期时间DATE_SUB(date,lNTERVAL expr type)&#xff0…

vulnhub dc-5

1.信息搜集 官方文档描述 主要内容不会使用到ssh&#xff0c;进入的方式很难被发现&#xff0c;是改变页面刷新的方法&#xff0c;只有一个flag nmap扫描 存活主机 192.168.85.176 端口 80 111 中间件&#xff1a; nginx 2.访问网站&#xff0c;进行进一步信息搜集 通过这两张…

加速 AI 训练,如何在云上实现灵活的弹性吞吐?

AI 已经成为各行各业软件研发的基础&#xff0c;带来了前所未有的效率和创新。今天&#xff0c;我们将分享苏锐在AWS量化投研行业活动的演讲实录&#xff0c;为大家介绍JuiceFS 在 AI 量化投研领域的应用经验&#xff0c;也希望为其他正在云上构建机器学习平台&#xff0c;面临…

4面美团测试工程师,因为这个小细节,直接让我前功尽弃.....

说一下我面试别人时候的思路 反过来理解&#xff0c;就是面试时候应该注意哪些东西&#xff1b;用加粗部分标注了 一般面试分为这么几个部分&#xff1a; 一、自我介绍 这部分一般人喜欢讲很多&#xff0c;其实没必要。大约5分钟内说清楚自己的职业经历&#xff0c;自己的核…

C++11入门基础知识

文章目录 C11简介列表初始化std::initializer_list 变量类型推导nullptr范围for循环STL中的一些变化 C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中…

阿里云Alibaba Cloud Linux镜像操作系统性能兼容如何?

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

【五一创作】自动驾驶技术未来大有可为

本文概要 自动驾驶技术是当今汽车行业的发展热点之一&#xff0c;但其也存在着许多争议。大家也可以从以下几个维度谈谈你对这项技术的看法。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f31f;&#x1f31f; ☀️大家好&#xff01;我是新人小白博…

4.2 线性表顺序表(上)

目录 目录结构 线性表 线性表的特征&#xff1a; 顺序表存储结构的表示 顺序表存储结构的特点 顺序存储结构的表示 线性表的基本运算 基本运算的相关算法 线性表的基本运算 线性表 目录结构 线性表 线性表是包含若干数据元素的一个线性序列 记为&#xff1a; L(a0, …

Android FlexboxLayout布局

FlexboxLayout 布局 一、简介二、使用三、功能详解FlexboxLayout属性flexWrapflexDirectionalignItemsjustifyContentalignContentdividerDrawableHorizontal、showDividerHorizontaldividerDrawableVertical、showDividerVerticaldividerDrawable、showDividermaxLine Flexbox…

简单理解Transformer注意力机制

这篇文章是对《动手深度学习》注意力机制部分的简单理解。 生物学中的注意力 生物学上的注意力有两种&#xff0c;一种是无意识的&#xff0c;零一种是有意识的。如下图1&#xff0c;由于红色的杯子比较突出&#xff0c;因此注意力不由自主指向了它。如下图2&#xff0c;由于…

讯飞星火认知大模型 VS CHATGPT3.5

2023年5月6日&#xff0c;科大讯飞(002230.SZ)宣布将于当日举行“讯飞星火认知大模型”成果发布会。 与其他厂商的大模型发布相比&#xff0c;本次发布会具有三个特点&#xff1a;1.全程真机互动&#xff0c;现场实测、现场体验&#xff1b;2.技术先进性不是笼统表达&#xff…

Java的自定义注解

java元注解和自定义注解的区别 Java的自定义注解是一种元数据&#xff0c;可以应用于类、方法、字段等程序元素上&#xff0c;以提供额外的信息或指示。 自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域、成员等信息&#xff1b;元注…

IP-GUARD如何通过网络控制策略禁止应用程序联网?

如何通过网络控制策略禁止应用程序联网? 可以在控制台-高级-网络控制中,添加以下策略: 动作:“禁止” 应用程序:填写要禁止的程序(以QQ示例) 如何禁止没有安装客户端的电脑访问客户端电脑? 可以给所有客户端设置只允许客户端电脑访问的网络控制策略; 在控制台左边的…

Unity使用Sqlite3

环境 Unity:Unity2021.3.6f1c1 OS:Window10 64 Plugins:Mono.Data.Sqlite、Sqlite 插件准备 Sqlite3官方网址 Sqlite3有x64和x86版本&#xff0c;根据发布的架构使用不同版本的Sqlite3。 该文档使用x64版本&#xff0c;发布架构为64位。 Mono.Data.Sqlite 使用Unity Hub打开…

搜索旋转排序数组

题目链接 搜索旋转排序数组 题目描述 注意点 nums 中的每个值都 独一无二题目数据保证 nums 在预先未知的某个下标上进行了旋转 解答思路 因为本题数组基本递增&#xff08;仅在某个位置进行旋转&#xff09;&#xff0c;可以看作由两个递增的数组组合而成&#xff0c;所以…

OPenGL笔记--创建一个3D场景

文章目录 一、前言二、效果展示三、详细流程3.1、World.txt文件规则3.2、加载World.txt3.3、绘制场景3.4、交互 四、详细代码五、举一反三 一、前言 通过前面的学习&#xff0c;基本掌握了怎么绘制图形&#xff0c;使用纹理&#xff0c;接下来就来创建一个3D场景。 基本原理 …

Unity 软性管的实现

概述 因近期项目有要求使用到水管这种软性管的模拟&#xff0c;该篇主要说明软管的实现和应用&#xff0c;参考自&#xff1a;unity3D---实现柔软水管&#xff08;蛇的移动&#xff09;效果一&#xff08;无重力&#xff09;_unity 软管_ayouayouwei的博客-CSDN博客 效果 实现…

B/S医院手术麻醉管理系统源码:麻醉知情同意书模板

麻醉知情同意书模板 姓名:​ 性别:​ 年龄:​ 科别:​ 床号:​ 住院号:​ 疾病介绍和治疗建议: 医生已告知我因​手术&#xff0c;而接受麻醉。 1.麻醉作用的产生主要是利用麻醉药使中枢神经系统或神经中某些部位受到抑制的结果&#xff0c;临床麻醉的主要任务是: 2.为…

webpack 的打包流程

1.webpack 的打包流程 从以上5个方面来分析Webpack的打包流程&#xff1a; 初始化参数&#xff1a;这一步会从我们配置的webpack.config.js中读取到对应的配置参数和shell命令中传入的参数进行合并得到最终打包配置参数。 开始编译&#xff1a;这一步我们会通过调用webpack()方…

计算机网络基础知识(二)—— 什么是Ip地址、Mac地址、网关、子网掩码、DNS

文章目录 01 | Ip地址02 | Mac地址03 | 网关04 | 子网掩码05 | DNS06 | 总结 初次接触网络时&#xff0c;只知道电脑连接网线&#xff0c;就可以打开4399玩小游戏&#xff0c;可以登录QQ和朋友聊天&#xff1b; 再次接触网络时&#xff0c;知道了怎么查看自己电脑的网络情况&am…