diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py index 70f2dd5b2560df259ae3ba5d0fd02b678bc47dc0..d42390eba8ed06d86fd4d662ee5620da539f79c6 100644 --- a/modules/mol/alg/pymod/scoring.py +++ b/modules/mol/alg/pymod/scoring.py @@ -144,27 +144,39 @@ class Scorer: for ch in self._model.chains: if ch.GetName().strip() == "": raise RuntimeError("Model chains must have valid chain names") - - # catch models with residue numbers that are not strictly increasing - # (requirement of ChainMapper) - for ch in self._model.chains: - nums = [r.GetNumber().GetNum() for r in ch.residues] - if not all(i < j for i, j in zip(nums, nums[1:])): - raise RuntimeError("Residue numbers in each model chain must " - "be strictly increasing") - + # catch targets which have empty chain names for ch in self._target.chains: if ch.GetName().strip() == "": raise RuntimeError("Target chains must have valid chain names") - # catch targets with residue numbers that are not strictly increasing - # (requirement of ChainMapper) - for ch in self._target.chains: - nums = [r.GetNumber().GetNum() for r in ch.residues] - if not all(i < j for i, j in zip(nums, nums[1:])): - raise RuntimeError("Residue numbers in each target chain must " - "be strictly increasing") + if resnum_alignments: + # In case of resnum_alignments, we have some requirements on + # residue numbers in the chain mapping: 1) no ins codes 2) strictly + # increasing residue numbers. + for ch in self._model.chains: + ins_codes = [r.GetNumber().GetInsCode() for r in ch.residues] + if len(set(ins_codes)) != 1 or ins_codes[0] != '\0': + raise RuntimeError("Residue numbers in each model chain " + "must not contain insertion codes if " + "resnum_alignments are enabled") + nums = [r.GetNumber().GetNum() for r in ch.residues] + if not all(i < j for i, j in zip(nums, nums[1:])): + raise RuntimeError("Residue numbers in each model chain " + "must be strictly increasing if " + "resnum_alignments are enabled") + + for ch in self._target.chains: + ins_codes = [r.GetNumber().GetInsCode() for r in ch.residues] + if len(set(ins_codes)) != 1 or ins_codes[0] != '\0': + raise RuntimeError("Residue numbers in each target chain " + "must not contain insertion codes if " + "resnum_alignments are enabled") + nums = [r.GetNumber().GetNum() for r in ch.residues] + if not all(i < j for i, j in zip(nums, nums[1:])): + raise RuntimeError("Residue numbers in each target chain " + "must be strictly increasing if " + "resnum_alignments are enabled") if molck_settings is None: molck_settings = MolckSettings(rm_unk_atoms=True, diff --git a/modules/mol/alg/tests/test_chain_mapping.py b/modules/mol/alg/tests/test_chain_mapping.py index 106f849a3dba71843f166a8354d33e22380a3daf..d012f1e65fa872ac2a6ab1dd203026e3bd72f873 100644 --- a/modules/mol/alg/tests/test_chain_mapping.py +++ b/modules/mol/alg/tests/test_chain_mapping.py @@ -118,18 +118,20 @@ class TestChainMapper(unittest.TestCase): self.assertTrue(_CompareViews(mapper.chem_group_alignments[2].GetSequence(0).GetAttachedView(), nuc_view_two)) # ensure that error is triggered if there are insertion codes + # and resnum_alignments are enabled tmp_ent = ent.Copy() ed = tmp_ent.EditXCS() r = tmp_ent.residues[0] ed.SetResidueNumber(r, mol.ResNum(r.GetNumber().GetNum(), 'A')) - self.assertRaises(Exception, ChainMapper, tmp_ent) + self.assertRaises(Exception, ChainMapper, tmp_ent, resnum_alignments=True) # ensure that error is triggered if resnums are not strictly increasing + # and resnum_alignments are enabled tmp_ent = ent.Copy() ed = tmp_ent.EditXCS() r = tmp_ent.residues[0] ed.SetResidueNumber(r, mol.ResNum(r.GetNumber().GetNum() + 42)) - self.assertRaises(Exception, ChainMapper, tmp_ent) + self.assertRaises(Exception, ChainMapper, tmp_ent, resnum_alignments=True) # chain B has a missing Valine... set pep_gap_thr to 0.0 should give an # additional chem group