Skip to content
Snippets Groups Projects
Commit ab48d7f8 authored by Rafal Gumienny's avatar Rafal Gumienny
Browse files

fix: SCHWED-3121 Ignore consistency checks by default

parent 3808f0e2
Branches
Tags
No related merge requests found
...@@ -304,19 +304,17 @@ def _ParseArgs(): ...@@ -304,19 +304,17 @@ def _ParseArgs():
"separation is higher than the provided parameter are\n" "separation is higher than the provided parameter are\n"
"considered when computing the score")) "considered when computing the score"))
parser.add_argument( parser.add_argument(
"-ic", "-cc",
"--ignore-consistency-checks", "--consistency-checks",
dest="ignore_consistency_checks", dest="consistency_checks",
default=False, default=False,
action="store_true", action="store_true",
help=("Ignore consistency checks. By default residue name\n" help=("Take consistency checks into account. By default residue name\n"
"consistency between a model-reference pair would be checked\n" "consistency between a model-reference pair would be checked\n"
"and an error will be rised if no valid pair is found (For\n" "but only a warning message will be displayed and the script\n"
"mmCIF there could be more than one biounit in one file).\n" "will continue to calculate scores. If this flag is ON, checks\n"
"The pair that does not conform to the check will be skipped.\n" "will not be ignored and if the pair does not pass the test\n"
"If the option is selected consistency checks will also be\n" "all the scores for that pair will be marked as a FAILURE."))
"performed but only a warning will be shown and the pair will\b"
"evaluated."))
parser.add_argument( parser.add_argument(
"-spr", "-spr",
"--save-per-residue-scores", "--save-per-residue-scores",
...@@ -595,7 +593,8 @@ def _Main(): ...@@ -595,7 +593,8 @@ def _Main():
model_results = dict() model_results = dict()
for reference in references: for reference in references:
reference_name = reference.GetName() reference_name = reference.GetName()
reference_results = dict() reference_results = {
"info": dict()}
ost.LogInfo("#" * 80) ost.LogInfo("#" * 80)
ost.LogInfo("Comparing %s to %s" % ( ost.LogInfo("Comparing %s to %s" % (
model_name, model_name,
...@@ -617,16 +616,18 @@ def _Main(): ...@@ -617,16 +616,18 @@ def _Main():
reference, reference,
model, model,
qs_scorer.chain_mapping, qs_scorer.chain_mapping,
not opts.ignore_consistency_checks) opts.consistency_checks)
if not opts.ignore_consistency_checks: reference_results["info"]["residue_names_consistent"] = is_cons
skip_score = False
if opts.consistency_checks:
if not is_cons: if not is_cons:
msg = (("Residue names in model %s and in reference " msg = (("Residue names in model %s and in reference "
"%s are inconsistent. Skipping.") % ( "%s are inconsistent.") % (
model_name, model_name,
reference_name)) reference_name))
ost.LogError(msg) ost.LogError(msg)
skipped.append(True) skip_score = True
continue skipped.append(skip_score)
else: else:
ost.LogInfo("Consistency check: OK") ost.LogInfo("Consistency check: OK")
skipped.append(False) skipped.append(False)
...@@ -643,29 +644,39 @@ def _Main(): ...@@ -643,29 +644,39 @@ def _Main():
ost.LogInfo("Consistency check: OK") ost.LogInfo("Consistency check: OK")
if opts.qs_score: if opts.qs_score:
ost.LogInfo("-" * 80) ost.LogInfo("-" * 80)
ost.LogInfo("Computing QS-score") if skip_score:
try: ost.LogInfo(
reference_results["qs_score"] = { "Skipping QS-score because consistency check failed")
"status": "SUCCESS",
"error": "",
"model_name": model_name,
"reference_name": reference_name,
"global_score": qs_scorer.global_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))
reference_results["qs_score"] = { reference_results["qs_score"] = {
"status": "FAILURE", "status": "FAILURE",
"error": str(ex), "error": "Consistency check failed.",
"model_name": model_name, "model_name": model_name,
"reference_name": reference.GetName(), "reference_name": reference_name,
"global_score": 0.0, "global_score": 0.0,
"best_score": 0.0, "best_score": 0.0,
"chain_mapping": qs_scorer.chain_mapping "chain_mapping": qs_scorer.chain_mapping}
} else:
ost.LogInfo("Computing QS-score")
try:
reference_results["qs_score"] = {
"status": "SUCCESS",
"error": "",
"model_name": model_name,
"reference_name": reference_name,
"global_score": qs_scorer.global_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))
reference_results["qs_score"] = {
"status": "FAILURE",
"error": str(ex),
"model_name": model_name,
"reference_name": reference_name,
"global_score": 0.0,
"best_score": 0.0,
"chain_mapping": qs_scorer.chain_mapping}
# Calculate lDDT # Calculate lDDT
if opts.lddt: if opts.lddt:
ost.LogInfo("-" * 80) ost.LogInfo("-" * 80)
...@@ -694,91 +705,119 @@ def _Main(): ...@@ -694,91 +705,119 @@ def _Main():
for scorer_index, lddt_scorer in enumerate( for scorer_index, lddt_scorer in enumerate(
oligo_lddt_scorer.sc_lddt_scorers): oligo_lddt_scorer.sc_lddt_scorers):
# Get chains and renumber according to alignment (for lDDT) # Get chains and renumber according to alignment (for lDDT)
try: model_chain = lddt_scorer.model.chains[0].GetName()
model_chain = lddt_scorer.model.chains[0].GetName() reference_chain = \
reference_chain = \ lddt_scorer.references[0].chains[0].GetName()
lddt_scorer.references[0].chains[0].GetName() if skip_score:
ost.LogInfo((" --> Computing lDDT between model "
"chain %s and reference chain %s") % (
model_chain,
reference_chain))
ost.LogInfo("Global LDDT score: %.4f" %
lddt_scorer.global_score)
ost.LogInfo( ost.LogInfo(
"(%i conserved distances out of %i checked, over " " --> Skipping signle chain lDDT because consistency check failed")
"%i thresholds)" % (lddt_scorer.conserved_contacts,
lddt_scorer.total_contacts,
len(lddt_settings.cutoffs)))
sc_lddt_scores = {
"status": "SUCCESS",
"error": "",
"model_chain": model_chain,
"reference_chain": reference_chain,
"global_score": lddt_scorer.global_score,
"conserved_contacts":
lddt_scorer.conserved_contacts,
"total_contacts": lddt_scorer.total_contacts}
if opts.save_per_residue_scores:
per_residue_sc = \
oligo_lddt_scorer.GetPerResidueScores(
scorer_index)
ost.LogInfo("Per residue local lDDT (reference):")
ost.LogInfo("Chain\tResidue Number\tResidue Name"
"\tlDDT\tConserved Contacts\tTotal "
"Contacts")
for prs_scores in per_residue_sc:
ost.LogInfo("%s\t%i\t%s\t%.4f\t%i\t%i" % (
reference_chain,
prs_scores["residue_number"],
prs_scores["residue_name"],
prs_scores["lddt"],
prs_scores["conserved_contacts"],
prs_scores["total_contacts"]))
sc_lddt_scores["per_residue_scores"] = \
per_residue_sc
lddt_results["single_chain_lddt"].append(
sc_lddt_scores)
except Exception as ex:
ost.LogError('Single chain lDDT failed:', str(ex))
lddt_results["single_chain_lddt"].append({ lddt_results["single_chain_lddt"].append({
"status": "FAILURE", "status": "FAILURE",
"error": str(ex), "error": "Consistency check failed.",
"model_chain": model_chain, "model_chain": model_chain,
"reference_chain": reference_chain, "reference_chain": reference_chain,
"global_score": 0.0, "global_score": 0.0,
"conserved_contacts": 0.0, "conserved_contacts": 0.0,
"total_contacts": 0.0}) "total_contacts": 0.0})
else:
try:
ost.LogInfo((" --> Computing lDDT between model "
"chain %s and reference chain %s") % (
model_chain,
reference_chain))
ost.LogInfo("Global LDDT score: %.4f" %
lddt_scorer.global_score)
ost.LogInfo(
"(%i conserved distances out of %i checked, over "
"%i thresholds)" % (lddt_scorer.conserved_contacts,
lddt_scorer.total_contacts,
len(lddt_settings.cutoffs)))
sc_lddt_scores = {
"status": "SUCCESS",
"error": "",
"model_chain": model_chain,
"reference_chain": reference_chain,
"global_score": lddt_scorer.global_score,
"conserved_contacts":
lddt_scorer.conserved_contacts,
"total_contacts": lddt_scorer.total_contacts}
if opts.save_per_residue_scores:
per_residue_sc = \
oligo_lddt_scorer.GetPerResidueScores(
scorer_index)
ost.LogInfo("Per residue local lDDT (reference):")
ost.LogInfo("Chain\tResidue Number\tResidue Name"
"\tlDDT\tConserved Contacts\tTotal "
"Contacts")
for prs_scores in per_residue_sc:
ost.LogInfo("%s\t%i\t%s\t%.4f\t%i\t%i" % (
reference_chain,
prs_scores["residue_number"],
prs_scores["residue_name"],
prs_scores["lddt"],
prs_scores["conserved_contacts"],
prs_scores["total_contacts"]))
sc_lddt_scores["per_residue_scores"] = \
per_residue_sc
lddt_results["single_chain_lddt"].append(
sc_lddt_scores)
except Exception as ex:
ost.LogError('Single chain lDDT failed:', str(ex))
lddt_results["single_chain_lddt"].append({
"status": "FAILURE",
"error": str(ex),
"model_chain": model_chain,
"reference_chain": reference_chain,
"global_score": 0.0,
"conserved_contacts": 0.0,
"total_contacts": 0.0})
# perform oligo lddt scoring # perform oligo lddt scoring
try: if skip_score:
ost.LogInfo(' --> Computing oligomeric lDDT score')
lddt_results["oligo_lddt"] = {
"status": "SUCCESS",
"error": "",
"global_score": oligo_lddt_scorer.oligo_lddt}
ost.LogInfo( ost.LogInfo(
"Oligo lDDT score: %.4f" % " --> Skipping oligomeric lDDT because consistency check failed")
oligo_lddt_scorer.oligo_lddt)
except Exception as ex:
ost.LogError('Oligo lDDT failed:', str(ex))
lddt_results["oligo_lddt"] = { lddt_results["oligo_lddt"] = {
"status": "FAILURE", "status": "FAILURE",
"error": str(ex), "error": "Consistency check failed.",
"global_score": 0.0} "global_score": 0.0}
try: else:
ost.LogInfo(' --> Computing weighted lDDT score') try:
lddt_results["weighted_lddt"] = { ost.LogInfo(' --> Computing oligomeric lDDT score')
"status": "SUCCESS", lddt_results["oligo_lddt"] = {
"error": "", "status": "SUCCESS",
"global_score": oligo_lddt_scorer.weighted_lddt} "error": "",
"global_score": oligo_lddt_scorer.oligo_lddt}
ost.LogInfo(
"Oligo lDDT score: %.4f" %
oligo_lddt_scorer.oligo_lddt)
except Exception as ex:
ost.LogError('Oligo lDDT failed:', str(ex))
lddt_results["oligo_lddt"] = {
"status": "FAILURE",
"error": str(ex),
"global_score": 0.0}
if skip_score:
ost.LogInfo( ost.LogInfo(
"Weighted lDDT score: %.4f" % " --> Skipping weighted lDDT because consistency check failed")
oligo_lddt_scorer.weighted_lddt)
except Exception as ex:
ost.LogError('Weighted lDDT failed:', str(ex))
lddt_results["weighted_lddt"] = { lddt_results["weighted_lddt"] = {
"status": "FAILURE", "status": "FAILURE",
"error": str(ex), "error": "Consistency check failed.",
"global_score": 0.0} "global_score": 0.0}
else:
try:
ost.LogInfo(' --> Computing weighted lDDT score')
lddt_results["weighted_lddt"] = {
"status": "SUCCESS",
"error": "",
"global_score": oligo_lddt_scorer.weighted_lddt}
ost.LogInfo(
"Weighted lDDT score: %.4f" %
oligo_lddt_scorer.weighted_lddt)
except Exception as ex:
ost.LogError('Weighted lDDT failed:', str(ex))
lddt_results["weighted_lddt"] = {
"status": "FAILURE",
"error": str(ex),
"global_score": 0.0}
reference_results["lddt"] = lddt_results reference_results["lddt"] = lddt_results
model_results[reference_name] = reference_results model_results[reference_name] = reference_results
if opts.dump_structures: if opts.dump_structures:
...@@ -806,8 +845,7 @@ def _Main(): ...@@ -806,8 +845,7 @@ def _Main():
result["result"][model_name] = model_results result["result"][model_name] = model_results
if all(skipped) and len(skipped) > 0: if all(skipped) and len(skipped) > 0:
raise RuntimeError("Consistency check failed for all model-reference " ost.LogError("Consistency check failed for all model-reference pairs.")
"pairs.")
if opts.output is not None: if opts.output is not None:
ost.LogInfo("#" * 80) ost.LogInfo("#" * 80)
ost.LogInfo("Saving output into %s" % opts.output) ost.LogInfo("Saving output into %s" % opts.output)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment