diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c8eb96b..ed4cfc5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,7 +3,7 @@ name: CI on: [push, pull_request, workflow_dispatch] env: - MIN_COVERAGE_REQUIRED: 50 + MIN_COVERAGE_REQUIRED: 35 jobs: @@ -28,21 +28,5 @@ jobs: bash run_test.sh - name: Coverage run: | + coverage report test $(coverage report | grep TOTAL | awk '{ print $4 }' | tr -d "%") -ge $MIN_COVERAGE_REQUIRED - - #test_oldbio: - # if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - # runs-on: ubuntu-latest - # timeout-minutes: 10 - # defaults: - # run: - # shell: bash -l {0} -# -# steps: -# - uses: actions/checkout@v3 -# - name: Test pipeline output -# run: | -# python -m pip install biopython==1.79 -# python -m pip install coverage -# python -m pip install . -# bash ./run_test.sh diff --git a/README.md b/README.md index 842416e..d89bfee 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ![CI status](https://github.com/bjornwallner/DockQ/actions/workflows/main.yml/badge.svg) -# DockQ: A Quality Measure for Protein-Protein Docking Models +# DockQ +## A Quality Measure for Protein-Protein Docking Models ## Installation @@ -12,7 +13,7 @@ cd DockQ pip install . ``` -## Quick start: +## Quick start After installing DockQ with `pip`, the `DockQ` binary will be in your path. Just run DockQ with: diff --git a/run_test.sh b/run_test.sh index e421fad..a84aba5 100644 --- a/run_test.sh +++ b/run_test.sh @@ -1,19 +1,42 @@ #!/bin/bash set -euo pipefail +rm -f test .coverage + +if command -v coverage &> /dev/null; then + binary="coverage run -a -m DockQ.DockQ" +else + binary="DockQ" +fi + # Test that cython version behaves the same as nocython -coverage run -a -m DockQ.DockQ examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb -coverage run -a src/DockQ/DockQ.py examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb -coverage run -a -m DockQ.DockQ examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb --no_align -coverage run -a src/DockQ/DockQ.py examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb --no_align +$binary examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb > test +diff test testdata/1A2K.dockq +python src/DockQ/DockQ.py examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb > test +diff test testdata/1A2K.dockq +$binary examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb --no_align > test +diff test testdata/1A2K.dockq +python src/DockQ/DockQ.py examples/1A2K_r_l_b.model.pdb examples/1A2K_r_l_b.pdb --no_align > test +diff test testdata/1A2K.dockq + # Multiple interfaces -coverage run -a -m DockQ.DockQ examples/dimer_dimer.model.pdb examples/dimer_dimer.pdb --short +$binary examples/dimer_dimer.model.pdb examples/dimer_dimer.pdb --short > test +diff test testdata/dimer_dimer.dockq + # Test on structures with slightly different sequences -coverage run -a -m DockQ.DockQ examples/model.pdb examples/native.pdb --allowed_mismatches 1 +$binary examples/model.pdb examples/native.pdb --allowed_mismatches 1 > test +diff test testdata/model.dockq + # Test various mapping strategies -coverage run -a -m DockQ.DockQ examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --short --mapping AB*:BA* -coverage run -a -m DockQ.DockQ examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --short --mapping :ABC -coverage run -a -m DockQ.DockQ examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --short --mapping ABCDEFGH:BADCFEHG +$binary examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --short --mapping AB*:BA* > test +diff test testdata/1EXB_AB.BA.dockq +$binary examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --short --mapping :ABC > test +diff test testdata/1EXB_.ABC.dockq +$binary examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --short --mapping ABCDEFGH:BADCFEHG > test +diff test testdata/1EXB_ABCDEFGH.BADCFEHG.dockq + # Test that cif parsing behaves same as pdb parsing -coverage run -a -m DockQ.DockQ examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --mapping DH:AE -coverage run -a -m DockQ.DockQ examples/1EXB_r_l_b.model.pdb examples/1EXB.cif.gz --mapping DH:AE +$binary examples/1EXB_r_l_b.model.pdb examples/1EXB_r_l_b.pdb --mapping DH:AE > test +diff test testdata/1EXB_DH.AE.dockq +$binary examples/1EXB_r_l_b.model.pdb examples/1EXB.cif.gz --mapping DH:AE > test +diff test testdata/1EXB_DH.AE_cif.dockq diff --git a/setup.cfg b/setup.cfg index b95a414..a206c6c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -21,3 +21,7 @@ where=src console_scripts = DockQ = DockQ.__main__:main +[coverage:run] +include = + */DockQ/* + diff --git a/src/DockQ/DockQ.py b/src/DockQ/DockQ.py index e1f9c7b..1bc0a08 100755 --- a/src/DockQ/DockQ.py +++ b/src/DockQ/DockQ.py @@ -3,6 +3,7 @@ import sys import gzip import hashlib +import warnings import traceback import itertools import math @@ -22,7 +23,7 @@ from .operations import residue_distances, get_fnat_stats from .parsers import PDBParser, MMCIFParser except ImportError: - print( + warnings.warn( """WARNING: It looks like cython is not working, falling back on native python. This will make DockQ slower""" ) @@ -52,14 +53,6 @@ def parse_args(): parser.add_argument( "--verbose", "-v", default=False, action="store_true", help="talk a lot!" ) - - parser.add_argument( - "--use_CA", - "-ca", - default=False, - action="store_true", - help="use CA instead of backbone", - ) parser.add_argument( "--no_align", default=False, @@ -68,19 +61,11 @@ def parse_args(): ) parser.add_argument( "--n_cpu", - default=32, + default=8, type=int, metavar="n_cpu", help="Number of cores to use", ) - parser.add_argument( - "--chunk_size", - default=64, - type=int, - metavar="chunk_size", - help="Size of chunks given to the cores", - ) - parser.add_argument( "--optDockQF1", default=False, @@ -112,15 +97,6 @@ def parse_args(): return parser.parse_args() -def open_file(filename): - if filename.endswith(".gz"): - with gzip.open(filename) as f: - yield f - else: - with open(filename) as f: - yield f - - @lru_cache def get_aligned_residues(chainA, chainB, alignment): aligned_resA = [] @@ -345,11 +321,10 @@ def calc_DockQ( sample_chains, ref_chains, alignments, - use_CA_only=False, capri_peptide=False, low_memory=False, ): - atom_for_sup = ("CA", "C", "N", "O", "P") if not use_CA_only else ("CA", "P") + atom_for_sup = ("CA", "C", "N", "O", "P") fnat_threshold = 4.0 if capri_peptide else 5.0 interface_threshold = 8.0 if capri_peptide else 10.0 clash_threshold = 2.0 @@ -448,7 +423,7 @@ def calc_DockQ( ) # using the private _rms function which does not superimpose info = {} - + info["DockQ_F1"] = dockq_formula( f1(nat_correct, nonnat_count, nat_total), irms, Lrms ) @@ -702,7 +677,6 @@ def run_on_chains( model_chains, native_chains, no_align=False, - use_CA_only=False, capri_peptide=False, low_memory=False, ): @@ -721,7 +695,6 @@ def run_on_chains( model_chains, native_chains, alignments=tuple(alignments), - use_CA_only=use_CA_only, capri_peptide=capri_peptide, low_memory=False, ) @@ -733,7 +706,6 @@ def run_on_all_native_interfaces( native_structure, chain_map={"A": "A", "B": "B"}, no_align=False, - use_CA_only=False, capri_peptide=False, low_memory=False, ): @@ -757,21 +729,21 @@ def run_on_all_native_interfaces( model_chains, native_chains, no_align=no_align, - use_CA_only=use_CA_only, capri_peptide=capri_peptide, low_memory=False, ) - if info and not low_memory: + if info: info["chain1"], info["chain2"] = ( chain_map[chain_pair[0]], chain_map[chain_pair[1]], ) results_dic[chain_pair] = info + return results_dic -#@profile +# @profile def load_PDB(path, chains=[], n_model=0): try: pdb_parser = PDBParser(QUIET=True) @@ -784,12 +756,13 @@ def load_PDB(path, chains=[], n_model=0): except Exception: pdb_parser = MMCIFParser(QUIET=True) structure = pdb_parser.get_structure( - "-", (gzip.open if path.endswith(".gz") else open)(path, "rt"), + "-", + (gzip.open if path.endswith(".gz") else open)(path, "rt"), chains=None, ) model = structure[n_model] - #remove_h(model) + # remove_h(model) return model @@ -828,7 +801,7 @@ def group_chains( f"For these chains {chains_without_match} no match was found between model and native, try increasing the --allowed_mismatches from {allowed_mismatches}" ) print(f"Current number of alignments with 1-10 mismatches: {mismatch_dict}") - + return chain_clusters, reverse_map @@ -864,9 +837,9 @@ def format_mapping(mapping_str): def format_mapping_string(chain_mapping): chain1 = "" chain2 = "" - - #mapping = sorted([(b, a) for a, b in chain_mapping.items()]) - #Sorting might change LRMSD since the definition of receptor/ligand for equal length depends on order + + # mapping = sorted([(b, a) for a, b in chain_mapping.items()]) + # Sorting might change LRMSD since the definition of receptor/ligand for equal length depends on order mapping = [(b, a) for a, b in chain_mapping.items()] for ( model_chain, @@ -877,19 +850,22 @@ def format_mapping_string(chain_mapping): return f"{chain1}:{chain2}" + def product_without_dupl(*args, repeat=1): pools = [tuple(pool) for pool in args] * repeat result = [[]] for pool in pools: - result = [x+[y] for x in result for y in pool if y not in x] # here we added condition - #result = set(list(map(lambda x: tuple(sorted(x)), result))) # to remove symmetric duplicates + result = [ + x + [y] for x in result for y in pool if y not in x + ] # here we added condition + # result = set(list(map(lambda x: tuple(sorted(x)), result))) # to remove symmetric duplicates for prod in result: yield tuple(prod) def count_chain_combinations(chain_clusters): - counts={} + counts = {} for chain in chain_clusters: - chains=tuple(chain_clusters[chain]) + chains = tuple(chain_clusters[chain]) if chains not in counts: counts[chains]=0 counts[chains]+=1 @@ -909,9 +885,12 @@ def get_all_chain_maps(chain_clusters,initial_mapping,reverse_map,model_chains_t for mapping in all_mappings: chain_map = {key:value for key, value in initial_mapping.items()} if reverse_map: - chain_map.update({ - mapping[i]: model_chain for i, model_chain in enumerate(model_chains_to_combo) - }) + chain_map.update( + { + mapping[i]: model_chain + for i, model_chain in enumerate(model_chains_to_combo) + } + ) else: chain_map.update({ native_chain: mapping[i] for i, native_chain in enumerate(native_chains_to_combo) @@ -919,14 +898,15 @@ def get_all_chain_maps(chain_clusters,initial_mapping,reverse_map,model_chains_t yield(chain_map) -#@profile + +# @profile def main(): args = parse_args() initial_mapping, model_chains, native_chains = format_mapping(args.mapping) model_structure = load_PDB(args.model, chains=model_chains) native_structure = load_PDB(args.native, chains=native_chains) - #check user-given chains are in the structures + # check user-given chains are in the structures model_chains = [c.id for c in model_structure] if not model_chains else model_chains native_chains = ( [c.id for c in native_structure] if not native_chains else native_chains @@ -959,16 +939,14 @@ def main(): run_chain_map=partial(run_on_all_native_interfaces, model_structure, native_structure, - no_align=args.no_align, - use_CA_only=args.use_CA, + no_align=args.no_align, capri_peptide=args.capri_peptide, low_memory=low_memory) ##args: chain_map if num_chain_combinations>1: #chunk_size=max(1,num_chain_combinations // args.n_cpu) #I suspect large chunk_size will result in large input arguments to the workers. - chuck_size=128 - + chunk_size=512 #for large num_chain_combinations it should be possible to divide the chain_maps in chunks result_this_mappings=progress_map(run_chain_map,chain_maps, total=num_chain_combinations,n_cpu=args.n_cpu, chunk_size=chunk_size) #get a fresh iterator @@ -977,16 +955,15 @@ def main(): total_dockq = sum( [result["DockQ_F1" if args.optDockQF1 else "DockQ"] for result in result_this_mapping.values()] ) + if total_dockq > best_dockq: best_dockq = total_dockq best_result = result_this_mapping best_mapping = chain_map - - else: #skip multi-threading for single jobs (skip the bar basically) # result_this_mappings=[run_chain_map(chain_map) for chain_map in chain_maps] - for chain_maps in chain_maps: + for chain_map in chain_maps: result_this_mapping=run_chain_map(chain_map) total_dockq = sum( [result["DockQ_F1" if args.optDockQF1 else "DockQ"] for result in result_this_mapping.values()] @@ -995,18 +972,19 @@ def main(): best_dockq = total_dockq best_result = result_this_mapping best_mapping = chain_map + + - if low_memory: #retrieve the full output by reruning the best chain mapping best_result=run_on_all_native_interfaces( model_structure, native_structure, best_mapping, args.no_align, - args.use_CA, args.capri_peptide, - low_memory=False) - + low_memory=False, + ) + info["model"] = args.model info["native"] = args.native info["best_dockq"] = best_dockq @@ -1023,7 +1001,7 @@ def print_results(info, short=False, verbose=False, capri_peptide=False): print( f"Total DockQ over {len(info['best_result'])} native interfaces: {info['GlobalDockQ']:.3f} with {info['best_mapping_str']} model:native mapping" ) - print(info["best_result"]) + # print(info["best_result"]) for chains, results in info["best_result"].items(): print( f"DockQ{capri_peptide_str} {results['DockQ']:.3f} DockQ_F1 {results['DockQ_F1']:.3f} Fnat {results['fnat']:.3f} iRMS {results['irms']:.3f} LRMS {results['Lrms']:.3f} Fnonnat {results['fnonnat']:.3f} clashes {results['clashes']} mapping {results['chain1']}{results['chain2']}:{chains[0]}{chains[1]} {info['model']} {results['chain1']} {results['chain2']} -> {info['native']} {chains[0]} {chains[1]}" diff --git a/testdata/1A2K.dockq b/testdata/1A2K.dockq new file mode 100644 index 0000000..0ac14cc --- /dev/null +++ b/testdata/1A2K.dockq @@ -0,0 +1,37 @@ +**************************************************************** +* DockQ * +* Scoring function for protein-protein docking models * +* Statistics on CAPRI data: * +* 0.00 <= DockQ < 0.23 - Incorrect * +* 0.23 <= DockQ < 0.49 - Acceptable quality * +* 0.49 <= DockQ < 0.80 - Medium quality * +* DockQ >= 0.80 - High quality * +* Ref: S. Basu and B. Wallner, DockQ: A quality measure for * +* protein-protein docking models * +* doi:10.1371/journal.pone.0161879 * +* For comments, please email: bjorn.wallner@.liu.se * +**************************************************************** +Model : examples/1A2K_r_l_b.model.pdb +Native : examples/1A2K_r_l_b.pdb +Total DockQ over 3 native interfaces: 1.959 +Native chains: A, B + Model chains: B, A + DockQ_F1: 0.996 + DockQ: 0.994 + irms: 0.000 + Lrms: 0.000 + fnat: 0.983 +Native chains: A, C + Model chains: B, C + DockQ_F1: 0.567 + DockQ: 0.511 + irms: 1.237 + Lrms: 6.864 + fnat: 0.333 +Native chains: B, C + Model chains: A, C + DockQ_F1: 0.500 + DockQ: 0.453 + irms: 2.104 + Lrms: 8.131 + fnat: 0.500 diff --git a/testdata/1EXB_.ABC.dockq b/testdata/1EXB_.ABC.dockq new file mode 100644 index 0000000..f63b8b2 --- /dev/null +++ b/testdata/1EXB_.ABC.dockq @@ -0,0 +1,3 @@ +Total DockQ over 2 native interfaces: 0.998 with ABC:ABC model:native mapping +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AC:AC examples/1EXB_r_l_b.model.pdb A C -> examples/1EXB_r_l_b.pdb A C +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping BC:BC examples/1EXB_r_l_b.model.pdb B C -> examples/1EXB_r_l_b.pdb B C diff --git a/testdata/1EXB_AB.BA.dockq b/testdata/1EXB_AB.BA.dockq new file mode 100644 index 0000000..b864372 --- /dev/null +++ b/testdata/1EXB_AB.BA.dockq @@ -0,0 +1,17 @@ +Total DockQ over 16 native interfaces: 0.852 with ABCDFHEG:BADCEGFH model:native mapping +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AC:BD examples/1EXB_r_l_b.model.pdb A C -> examples/1EXB_r_l_b.pdb B D +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AD:BC examples/1EXB_r_l_b.model.pdb A D -> examples/1EXB_r_l_b.pdb B C +DockQ 0.742 DockQ_F1 0.772 Fnat 0.609 iRMS 0.850 LRMS 3.426 Fnonnat 0.176 clashes 0 mapping AE:BF examples/1EXB_r_l_b.model.pdb A E -> examples/1EXB_r_l_b.pdb B F +DockQ 0.824 DockQ_F1 0.853 Fnat 0.800 iRMS 0.625 LRMS 3.994 Fnonnat 0.000 clashes 0 mapping AG:BH examples/1EXB_r_l_b.model.pdb A G -> examples/1EXB_r_l_b.pdb B H +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping BC:AD examples/1EXB_r_l_b.model.pdb B C -> examples/1EXB_r_l_b.pdb A D +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping BD:AC examples/1EXB_r_l_b.model.pdb B D -> examples/1EXB_r_l_b.pdb A C +DockQ 0.552 DockQ_F1 0.606 Fnat 0.304 iRMS 1.458 LRMS 3.757 Fnonnat 0.000 clashes 0 mapping BF:AE examples/1EXB_r_l_b.model.pdb B F -> examples/1EXB_r_l_b.pdb A E +DockQ 0.694 DockQ_F1 0.751 Fnat 0.400 iRMS 0.793 LRMS 2.831 Fnonnat 0.000 clashes 0 mapping BH:AG examples/1EXB_r_l_b.model.pdb B H -> examples/1EXB_r_l_b.pdb A G +DockQ 0.687 DockQ_F1 0.737 Fnat 0.600 iRMS 1.161 LRMS 3.757 Fnonnat 0.000 clashes 0 mapping CF:DE examples/1EXB_r_l_b.model.pdb C F -> examples/1EXB_r_l_b.pdb D E +DockQ 0.477 DockQ_F1 0.502 Fnat 0.087 iRMS 1.425 LRMS 3.994 Fnonnat 0.000 clashes 0 mapping CG:DH examples/1EXB_r_l_b.model.pdb C G -> examples/1EXB_r_l_b.pdb D H +DockQ 0.775 DockQ_F1 0.812 Fnat 0.609 iRMS 0.711 LRMS 2.831 Fnonnat 0.125 clashes 0 mapping DH:CG examples/1EXB_r_l_b.model.pdb D H -> examples/1EXB_r_l_b.pdb C G +DockQ 0.914 DockQ_F1 0.914 Fnat 1.000 iRMS 0.547 LRMS 3.426 Fnonnat 0.000 clashes 0 mapping DE:CF examples/1EXB_r_l_b.model.pdb D E -> examples/1EXB_r_l_b.pdb C F +DockQ 0.992 DockQ_F1 0.996 Fnat 0.976 iRMS 0.001 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping FH:EG examples/1EXB_r_l_b.model.pdb F H -> examples/1EXB_r_l_b.pdb E G +DockQ 0.992 DockQ_F1 0.996 Fnat 0.976 iRMS 0.001 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping FG:EH examples/1EXB_r_l_b.model.pdb F G -> examples/1EXB_r_l_b.pdb E H +DockQ 0.992 DockQ_F1 0.996 Fnat 0.976 iRMS 0.001 LRMS 0.001 Fnonnat 0.000 clashes 0 mapping HE:GF examples/1EXB_r_l_b.model.pdb H E -> examples/1EXB_r_l_b.pdb G F +DockQ 1.000 DockQ_F1 0.996 Fnat 1.000 iRMS 0.001 LRMS 0.001 Fnonnat 0.024 clashes 0 mapping EG:FH examples/1EXB_r_l_b.model.pdb E G -> examples/1EXB_r_l_b.pdb F H diff --git a/testdata/1EXB_ABCDEFGH.BADCFEHG.dockq b/testdata/1EXB_ABCDEFGH.BADCFEHG.dockq new file mode 100644 index 0000000..1c263d6 --- /dev/null +++ b/testdata/1EXB_ABCDEFGH.BADCFEHG.dockq @@ -0,0 +1,17 @@ +Total DockQ over 16 native interfaces: 0.852 with ABCDEFGH:BADCFEHG model:native mapping +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AC:BD examples/1EXB_r_l_b.model.pdb A C -> examples/1EXB_r_l_b.pdb B D +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AD:BC examples/1EXB_r_l_b.model.pdb A D -> examples/1EXB_r_l_b.pdb B C +DockQ 0.742 DockQ_F1 0.772 Fnat 0.609 iRMS 0.850 LRMS 3.426 Fnonnat 0.176 clashes 0 mapping AE:BF examples/1EXB_r_l_b.model.pdb A E -> examples/1EXB_r_l_b.pdb B F +DockQ 0.824 DockQ_F1 0.853 Fnat 0.800 iRMS 0.625 LRMS 3.994 Fnonnat 0.000 clashes 0 mapping AG:BH examples/1EXB_r_l_b.model.pdb A G -> examples/1EXB_r_l_b.pdb B H +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping BC:AD examples/1EXB_r_l_b.model.pdb B C -> examples/1EXB_r_l_b.pdb A D +DockQ 0.995 DockQ_F1 0.998 Fnat 0.985 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping BD:AC examples/1EXB_r_l_b.model.pdb B D -> examples/1EXB_r_l_b.pdb A C +DockQ 0.552 DockQ_F1 0.606 Fnat 0.304 iRMS 1.458 LRMS 3.757 Fnonnat 0.000 clashes 0 mapping BF:AE examples/1EXB_r_l_b.model.pdb B F -> examples/1EXB_r_l_b.pdb A E +DockQ 0.694 DockQ_F1 0.751 Fnat 0.400 iRMS 0.793 LRMS 2.831 Fnonnat 0.000 clashes 0 mapping BH:AG examples/1EXB_r_l_b.model.pdb B H -> examples/1EXB_r_l_b.pdb A G +DockQ 0.687 DockQ_F1 0.737 Fnat 0.600 iRMS 1.161 LRMS 3.757 Fnonnat 0.000 clashes 0 mapping CF:DE examples/1EXB_r_l_b.model.pdb C F -> examples/1EXB_r_l_b.pdb D E +DockQ 0.477 DockQ_F1 0.502 Fnat 0.087 iRMS 1.425 LRMS 3.994 Fnonnat 0.000 clashes 0 mapping CG:DH examples/1EXB_r_l_b.model.pdb C G -> examples/1EXB_r_l_b.pdb D H +DockQ 0.914 DockQ_F1 0.914 Fnat 1.000 iRMS 0.547 LRMS 3.426 Fnonnat 0.000 clashes 0 mapping DE:CF examples/1EXB_r_l_b.model.pdb D E -> examples/1EXB_r_l_b.pdb C F +DockQ 0.775 DockQ_F1 0.812 Fnat 0.609 iRMS 0.711 LRMS 2.831 Fnonnat 0.125 clashes 0 mapping DH:CG examples/1EXB_r_l_b.model.pdb D H -> examples/1EXB_r_l_b.pdb C G +DockQ 1.000 DockQ_F1 0.996 Fnat 1.000 iRMS 0.001 LRMS 0.001 Fnonnat 0.024 clashes 0 mapping EG:FH examples/1EXB_r_l_b.model.pdb E G -> examples/1EXB_r_l_b.pdb F H +DockQ 0.992 DockQ_F1 0.996 Fnat 0.976 iRMS 0.001 LRMS 0.001 Fnonnat 0.000 clashes 0 mapping EH:FG examples/1EXB_r_l_b.model.pdb E H -> examples/1EXB_r_l_b.pdb F G +DockQ 0.992 DockQ_F1 0.996 Fnat 0.976 iRMS 0.001 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping FG:EH examples/1EXB_r_l_b.model.pdb F G -> examples/1EXB_r_l_b.pdb E H +DockQ 0.992 DockQ_F1 0.996 Fnat 0.976 iRMS 0.001 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping FH:EG examples/1EXB_r_l_b.model.pdb F H -> examples/1EXB_r_l_b.pdb E G diff --git a/testdata/1EXB_DH.AE.dockq b/testdata/1EXB_DH.AE.dockq new file mode 100644 index 0000000..3b5e296 --- /dev/null +++ b/testdata/1EXB_DH.AE.dockq @@ -0,0 +1,23 @@ +**************************************************************** +* DockQ * +* Scoring function for protein-protein docking models * +* Statistics on CAPRI data: * +* 0.00 <= DockQ < 0.23 - Incorrect * +* 0.23 <= DockQ < 0.49 - Acceptable quality * +* 0.49 <= DockQ < 0.80 - Medium quality * +* DockQ >= 0.80 - High quality * +* Ref: S. Basu and B. Wallner, DockQ: A quality measure for * +* protein-protein docking models * +* doi:10.1371/journal.pone.0161879 * +* For comments, please email: bjorn.wallner@.liu.se * +**************************************************************** +Model : examples/1EXB_r_l_b.model.pdb +Native : examples/1EXB_r_l_b.pdb +Total DockQ over 1 native interfaces: 0.775 +Native chains: A, E + Model chains: D, H + DockQ_F1: 0.812 + DockQ: 0.775 + irms: 0.711 + Lrms: 2.831 + fnat: 0.609 diff --git a/testdata/1EXB_DH.AE_cif.dockq b/testdata/1EXB_DH.AE_cif.dockq new file mode 100644 index 0000000..52d2056 --- /dev/null +++ b/testdata/1EXB_DH.AE_cif.dockq @@ -0,0 +1,23 @@ +**************************************************************** +* DockQ * +* Scoring function for protein-protein docking models * +* Statistics on CAPRI data: * +* 0.00 <= DockQ < 0.23 - Incorrect * +* 0.23 <= DockQ < 0.49 - Acceptable quality * +* 0.49 <= DockQ < 0.80 - Medium quality * +* DockQ >= 0.80 - High quality * +* Ref: S. Basu and B. Wallner, DockQ: A quality measure for * +* protein-protein docking models * +* doi:10.1371/journal.pone.0161879 * +* For comments, please email: bjorn.wallner@.liu.se * +**************************************************************** +Model : examples/1EXB_r_l_b.model.pdb +Native : examples/1EXB.cif.gz +Total DockQ over 1 native interfaces: 0.775 +Native chains: A, E + Model chains: D, H + DockQ_F1: 0.812 + DockQ: 0.775 + irms: 0.711 + Lrms: 2.831 + fnat: 0.609 diff --git a/testdata/dimer_dimer.dockq b/testdata/dimer_dimer.dockq new file mode 100644 index 0000000..1f4c077 --- /dev/null +++ b/testdata/dimer_dimer.dockq @@ -0,0 +1,5 @@ +Total DockQ over 4 native interfaces: 1.000 with ABLH:ABLH model:native mapping +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AB:AB examples/dimer_dimer.model.pdb A B -> examples/dimer_dimer.pdb A B +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AL:AL examples/dimer_dimer.model.pdb A L -> examples/dimer_dimer.pdb A L +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping AH:AH examples/dimer_dimer.model.pdb A H -> examples/dimer_dimer.pdb A H +DockQ 1.000 DockQ_F1 1.000 Fnat 1.000 iRMS 0.000 LRMS 0.000 Fnonnat 0.000 clashes 0 mapping LH:LH examples/dimer_dimer.model.pdb L H -> examples/dimer_dimer.pdb L H diff --git a/testdata/model.dockq b/testdata/model.dockq new file mode 100644 index 0000000..767269a --- /dev/null +++ b/testdata/model.dockq @@ -0,0 +1,23 @@ +**************************************************************** +* DockQ * +* Scoring function for protein-protein docking models * +* Statistics on CAPRI data: * +* 0.00 <= DockQ < 0.23 - Incorrect * +* 0.23 <= DockQ < 0.49 - Acceptable quality * +* 0.49 <= DockQ < 0.80 - Medium quality * +* DockQ >= 0.80 - High quality * +* Ref: S. Basu and B. Wallner, DockQ: A quality measure for * +* protein-protein docking models * +* doi:10.1371/journal.pone.0161879 * +* For comments, please email: bjorn.wallner@.liu.se * +**************************************************************** +Model : examples/model.pdb +Native : examples/native.pdb +Total DockQ over 1 native interfaces: 0.700 +Native chains: A, B + Model chains: A, B + DockQ_F1: 0.731 + DockQ: 0.700 + irms: 1.232 + Lrms: 1.516 + fnat: 0.533