diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py index c229aff4fed62dbe783ae69ca5f20a74a7f54c6d..0626bff67ad383dccbcbefcdd5f849abd652e69a 100644 --- a/modules/mol/alg/pymod/scoring.py +++ b/modules/mol/alg/pymod/scoring.py @@ -2148,16 +2148,53 @@ class Scorer: score = round(r.GetFloatProp("lddt"), 3) local_lddt[cname][rnum] = score + trg_r = None + mdl_r = None + for a in r.atoms: if a.HasProp("lddt"): score = round(a.GetFloatProp("lddt"), 3) aa_local_lddt[cname][rnum][a.GetName()] = score else: - # must have been removed by stereochecks - aa_local_lddt[cname][rnum][a.GetName()] = 0.0 + # the target residue is there since we have a score + # for the residue. + # opt 1: The atom was never there in the + # stereochecked target => None + # opt 2: The atom has been removed in the model + # stereochecks but is there in stereochecked + # target => 0.0 + if trg_r is None: + if cname in flat_mapping: + for col in alns[cname]: + if col[0] != '-' and col[1] != '-': + if col.GetResidue(1).number == r.number: + trg_r = col.GetResidue(0) + break + if trg_r is not None: + trg_cname = trg_r.GetChain().GetName() + trg_rnum = trg_r.GetNumber() + tmp = self.stereochecked_target.FindResidue(trg_cname, + trg_rnum) + if tmp.IsValid(): + trg_r = tmp + + if mdl_r is None: + tmp = self.stereochecked_model.FindResidue(cname, rnum) + if tmp.IsValid(): + mdl_r = tmp + + if trg_r is not None and not trg_r.FindAtom(a.GetName()).IsValid(): + # opt 1 + aa_local_lddt[cname][rnum][a.GetName()] = None + elif trg_r is not None and trg_r.FindAtom(a.GetName()).IsValid() and \ + mdl_r is not None and not mdl_r.FindAtom(a.GetName()).IsValid(): + # opt 2 + aa_local_lddt[cname][rnum][a.GetName()] = 0.0 + else: + # unknown issue + aa_local_lddt[cname][rnum][a.GetName()] = None else: - # rsc => residue stereo checked... mdl_res = self.stereochecked_model.FindResidue(cname, rnum) if mdl_res.IsValid(): # not covered by trg or skipped in chain mapping procedure @@ -2177,15 +2214,25 @@ class Scorer: if col.GetResidue(1).number == r.number: trg_r = col.GetResidue(0) break + if trg_r is not None: + trg_cname = trg_r.GetChain().GetName() + trg_rnum = trg_r.GetNumber() + tmp = self.stereochecked_target.FindResidue(trg_cname, + trg_rnum) + if tmp.IsValid(): + trg_r = tmp + if trg_r is None: local_lddt[cname][rnum] = None for a in r.atoms: aa_local_lddt[cname][rnum][a.GetName()] = None - else: local_lddt[cname][rnum] = 0.0 for a in r.atoms: - aa_local_lddt[cname][rnum][a.GetName()] = 0.0 + if trg_r.FindAtom(a.GetName()).IsValid(): + aa_local_lddt[cname][rnum][a.GetName()] = 0.0 + else: + aa_local_lddt[cname][rnum][a.GetName()] = None self._lddt = lddt_score self._local_lddt = local_lddt