From 0fd7f322d33692ff13bc8aca60656c6349805647 Mon Sep 17 00:00:00 2001 From: Xavier Robin <xavier.robin@unibas.ch> Date: Fri, 5 Apr 2024 15:45:37 +0200 Subject: [PATCH] Add logging output to the scoring --- actions/ost-compare-structures | 11 +++++++++++ modules/mol/alg/pymod/scoring.py | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/actions/ost-compare-structures b/actions/ost-compare-structures index 02fa365c0..4cf9ef75f 100644 --- a/actions/ost-compare-structures +++ b/actions/ost-compare-structures @@ -526,6 +526,14 @@ def _ParseArgs(): "problematic as they may produce high sequence identity " "alignments by pure chance.") ) + + parser.add_argument( + '-v', + '--verbosity', + dest="verbosity", + type=int, + default=2, + help="Set verbosity level. Defaults to 3 (Script).") return parser.parse_args() @@ -862,6 +870,9 @@ def _Process(model, reference, args, model_format, reference_format): def _Main(): args = _ParseArgs() + ost.PushVerbosityLevel(args.verbosity) + if args.verbosity < 4: + sys.tracebacklimit = 0 _CheckCompoundLib() try: compute_cad = args.cad_score or args.local_cad_score diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py index d0d3cf84d..53a596f52 100644 --- a/modules/mol/alg/pymod/scoring.py +++ b/modules/mol/alg/pymod/scoring.py @@ -5,6 +5,7 @@ from ost import io from ost import conop from ost import settings from ost import geom +from ost import LogScript, LogInfo, LogDebug from ost.mol.alg import lddt from ost.mol.alg import qsscore from ost.mol.alg import chain_mapping @@ -191,6 +192,7 @@ class Scorer: colored=False, map_nonstd_res=True, assign_elem=True) + LogScript("Cleaning up input structures") Molck(self._model, conop.GetDefaultLib(), molck_settings) Molck(self._target, conop.GetDefaultLib(), molck_settings) self._model = self._model.Select("peptide=True or nucleotide=True") @@ -343,6 +345,7 @@ class Scorer: if custom_mapping is not None: self._set_custom_mapping(custom_mapping) + LogDebug("Scorer sucessfully initialized") @property def model(self): @@ -526,6 +529,7 @@ class Scorer: :type: :class:`ost.mol.alg.chain_mapping.MappingResult` """ if self._mapping is None: + LogScript("Computing chain mapping") self._mapping = \ self.chain_mapper.GetMapping(self.model, n_max_naive = self.n_max_naive) @@ -1220,6 +1224,7 @@ class Scorer: :type: :class:`float` """ if self._gdtts is None: + LogScript("Computing GDT-TS score") n = \ self.mapped_target_pos.GetGDTTS(self.transformed_mapped_model_pos, norm=False) @@ -1240,6 +1245,7 @@ class Scorer: :type: :class:`float` """ if self._gdtha is None: + LogScript("Computing GDT-HA score") n = \ self.mapped_target_pos.GetGDTHA(self.transformed_mapped_model_pos, norm=False) @@ -1260,6 +1266,7 @@ class Scorer: :type: :class:`float` """ if self._rmsd is None: + LogScript("Computing RMSD") self._rmsd = \ self.mapped_target_pos.GetRMSD(self.transformed_mapped_model_pos) return self._rmsd @@ -1413,6 +1420,7 @@ class Scorer: self.stereochecked_model) def _compute_lddt(self): + LogScript("Computing all-atom lDDT") # lDDT requires a flat mapping with mdl_ch as key and trg_ch as value flat_mapping = self.mapping.GetFlatMapping(mdl_as_key=True) @@ -1499,7 +1507,7 @@ class Scorer: self._local_lddt = local_lddt def _compute_bb_lddt(self): - + LogScript("Computing backbone lDDT") # make alignments accessible by mdl seq name alns = dict() for aln in self.aln: @@ -1535,11 +1543,13 @@ class Scorer: self._bb_local_lddt = local_lddt def _compute_qs(self): + LogScript("Computing global QS-score") qs_score_result = self.qs_scorer.Score(self.mapping.mapping) self._qs_global = qs_score_result.QS_global self._qs_best = qs_score_result.QS_best def _compute_per_interface_qs_scores(self): + LogScript("Computing per-interface QS-score") self._per_interface_qs_global = list() self._per_interface_qs_best = list() @@ -1554,6 +1564,7 @@ class Scorer: self._per_interface_qs_global.append(qs_res.QS_global) def _compute_ics_scores(self): + LogScript("Computing ICS scores") contact_scorer_res = self.contact_scorer.ScoreICS(self.mapping.mapping) self._ics_precision = contact_scorer_res.precision self._ics_recall = contact_scorer_res.recall @@ -1579,6 +1590,7 @@ class Scorer: self._per_interface_ics.append(None) def _compute_ips_scores(self): + LogScript("Computing IPS scores") contact_scorer_res = self.contact_scorer.ScoreIPS(self.mapping.mapping) self._ips_precision = contact_scorer_res.precision self._ips_recall = contact_scorer_res.recall @@ -1605,6 +1617,7 @@ class Scorer: self._per_interface_ips.append(None) def _compute_dockq_scores(self): + LogScript("Computing DockQ") # lists with values in contact_target_interfaces self._dockq_scores = list() self._fnat = list() @@ -1708,6 +1721,7 @@ class Scorer: "chains, i.e. only work if resnum_alignments " "is True at Scorer construction.") try: + LogScript("Computing CAD score") cad_score_exec = \ settings.Locate("voronota-cadscore", explicit_file_name=self.cad_score_exec) @@ -1774,6 +1788,7 @@ class Scorer: def _do_stereochecks(self): """ Perform stereochemistry checks on model and target """ + LogInfo("Performing stereochemistry checks on model and target") data = stereochemistry.GetDefaultStereoData() l_data = stereochemistry.GetDefaultStereoLinkData() @@ -1908,6 +1923,7 @@ class Scorer: trg_patch_one, trg_patch_two) def _compute_patchqs_scores(self): + LogScript("Computing patch QS-scores") self._patch_qs = dict() for cname, rnums in self.model_interface_residues.items(): scores = list() @@ -1925,6 +1941,7 @@ class Scorer: self._patch_qs[cname] = scores def _compute_patchdockq_scores(self): + LogScript("Computing patch DockQ scores") self._patch_dockq = dict() for cname, rnums in self.model_interface_residues.items(): scores = list() @@ -2034,6 +2051,7 @@ class Scorer: :param mapping: mapping with trg chains as key and mdl ch as values :type mapping: :class:`dict` """ + LogInfo("Setting custom chain mapping") chain_mapper = self.chain_mapper chem_mapping, chem_group_alns, mdl = \ @@ -2125,14 +2143,18 @@ class Scorer: def _compute_tmscore(self): res = None if self.usalign_exec is None: + LogScript("Computing patch TM-score with USalign exectuable") if self.oum: flat_mapping = self.mapping.GetFlatMapping() + LogInfo("Overriding TM-score chain mapping") res = res = bindings.WrappedMMAlign(self.model, self.target, mapping=flat_mapping) else: res = bindings.WrappedMMAlign(self.model, self.target) else: + LogScript("Computing patch TM-score with built-in USalign") if self.oum: + LogInfo("Overriding TM-score chain mapping") flat_mapping = self.mapping.GetFlatMapping() res = tmtools.USAlign(self.model, self.target, usalign = self.usalign_exec, -- GitLab