diff --git a/actions/ost-compare-structures b/actions/ost-compare-structures index 3560bf4a05c514228b1d4e888f4d70fdd0cd6504..2e685cd685bc894dca4d4858885acc1d9b1a4d42 100644 --- a/actions/ost-compare-structures +++ b/actions/ost-compare-structures @@ -12,11 +12,10 @@ import argparse import ost from ost.io import (LoadPDB, LoadMMCIF, MMCifInfoBioUnit, MMCifInfo, - MMCifInfoTransOp, StereoChemicalParamsReader) + MMCifInfoTransOp, ReadStereoChemicalPropsFile) from ost import PushVerbosityLevel -from ost.mol.alg import (qsscoring, Molck, MolckSettings, CleanlDDTReferences, - PreparelDDTGlobalRDMap, lDDTSettings, CheckStructure, - LocalDistDiffTest) +from ost.mol.alg import (qsscoring, Molck, MolckSettings, lDDTSettings, + lDDTScorer) from ost.conop import CompoundLib from ost.seq.alg.renumber import Renumber @@ -220,7 +219,9 @@ def _ParseArgs(): dest="sequence_separation", type=int, default=0, - help=("Sequence separation.")) + help=("Sequence separation. Only distances between residues whose " + "separation is higher than the provided parameter are " + "considered when computing the score")) parser.add_argument( "-cc", "--consistency-checks", @@ -363,22 +364,6 @@ def _ReadStructureFile(path): return entities -def _ComputelDDT(model, references, settings): - CleanlDDTReferences(references) - rdmap = PreparelDDTGlobalRDMap(references, settings) - stereochemical_parameters = StereoChemicalParamsReader( - settings.parameter_file_path) - stereochemical_parameters.Read() - CheckStructure(ent=model, - bond_table=stereochemical_parameters.bond_table, - angle_table=stereochemical_parameters.angle_table, - nonbonded_table=stereochemical_parameters.nonbonded_table, - bond_tolerance=settings.bond_tolerance, - angle_tolerance=settings.angle_tolerance) - global_score = LocalDistDiffTest(model, references, rdmap, settings) - return global_score - - def _MolckEntity(entity, options): """Molck the entity.""" lib = CompoundLib.Load(options.compound_library) @@ -417,14 +402,21 @@ def _Main(): ost.LogInfo( "Multiple complexes detected. All combinations will be tried.") - result = {"result": []} + result = { + "result": {}, + "options": vars(opts)} + result["options"]["cwd"] = os.path.abspath(os.getcwd()) # # Perform scoring for model in models: + model_name = model.GetName() + model_results = dict() for reference in references: + reference_name = reference.GetName() + reference_results = dict() ost.LogInfo("#\nComparing %s to %s" % ( - model.GetName(), - reference.GetName())) + model_name, + reference_name)) qs_scorer = qsscoring.QSscorer(reference, model) if opts.qs_score: ost.LogInfo("Computing QS-score") @@ -434,42 +426,46 @@ def _Main(): "Using custom chain mapping: %s" % str( opts.chain_mapping)) qs_scorer.chain_mapping = opts.chain_mapping - result["result"].append({ + reference_results["qs_score"] = { "status": "SUCCESS", "error": "", - "model_name": model.GetName(), - "reference_name": reference.GetName(), + "model_name": model_name, + "reference_name": reference_name, "global_score": qs_scorer.global_score, - "lddt_score": qs_scorer.lddt_score, + "oligo_lddt_score": qs_scorer.lddt_score, "best_score": qs_scorer.best_score, "chain_mapping": qs_scorer.chain_mapping - }) + } except qsscoring.QSscoreError as ex: # default handling: report failure and set score to 0 ost.LogError('QSscore failed:', str(ex)) - result["result"].append({ + reference_results["qs-score"] = { "status": "FAILURE", "error": str(ex), - "model_name": model.GetName(), + "model_name": model_name, "reference_name": reference.GetName(), "global_score": 0.0, - "lddt_score": 0.0, + "oligo_lddt_score": 0.0, "best_score": 0.0, "chain_mapping": None - }) + } # Calculate lDDT if opts.lddt: ost.LogInfo("Computing lDDT") + lddt_results = { + "single_chain_lddt": list() + } lddt_settings = lDDTSettings( bond_tolerance=opts.bond_tolerance, angle_tolerance=opts.angle_tolerance, radius=opts.inclusion_radius, sequence_separation=opts.sequence_separation, sel=opts.selection, - parameter_file_path=opts.parameter_file, structural_checks=opts.structural_checks, consistency_checks=opts.consistency_checks, label="lddt") + stereochemical_parameters = ReadStereoChemicalPropsFile( + opts.parameter_file) if opts.verbosity > 3: lddt_settings.PrintParameters() # Perform scoring @@ -477,13 +473,23 @@ def _Main(): for aln in qs_scorer.alignments: # Get chains and renumber according to alignment (for lDDT) ch_ref = aln.GetSequence(0).GetName() - reference_view = Renumber( - aln.GetSequence(0)).CreateFullView() + reference = Renumber(aln.GetSequence(0)) ch_mdl = aln.GetSequence(1).GetName() - model_view = Renumber(aln.GetSequence(1)).CreateFullView() + model = Renumber(aln.GetSequence(1)) ost.LogInfo(("Computing lDDT between model chain %s and " "reference chain %s") % (ch_mdl, ch_ref)) - _ComputelDDT(model_view, [reference_view], lddt_settings) + lddt_scorer = lDDTScorer( + references=[reference], + model=model, + settings=lddt_settings, + stereochemical_params=stereochemical_parameters) + lddt_results["single_chain_lddt"].append({ + "model_chain": ch_mdl, + "reference_chain": ch_ref, + "global_score": lddt_scorer.global_score}) + reference_results["lddt"] = lddt_results + model_results[reference_name] = reference_results + result["result"][model_name] = model_results if opts.output is not None: with open(opts.output, "w") as outfile: diff --git a/actions/ost-qs-score b/actions/ost-qs-score index ffdc76b03d6b7a27e3e55ec9f468fae18bf674a3..0a92262a70688ba535ee902a6599a14ff0f10c29 100644 --- a/actions/ost-qs-score +++ b/actions/ost-qs-score @@ -159,7 +159,7 @@ def _Main(): "model_name": model.GetName(), "reference_name": reference.GetName(), "global_score": qs_scorer.global_score, - "lddt_score": qs_scorer.lddt_score, + "oligo_lddt_score": qs_scorer.lddt_score, "best_score": qs_scorer.best_score, "chain_mapping": qs_scorer.chain_mapping }) @@ -172,7 +172,7 @@ def _Main(): "model_name": model.GetName(), "reference_name": reference.GetName(), "global_score": 0.0, - "lddt_score": 0.0, + "oligo_lddt_score": 0.0, "best_score": 0.0, "chain_mapping": None })