def do_maplig(self): lignames = self.ligname.text() selection = selected_atoms(self.session) if len(selection) < 1: raise RuntimeWarning("nothing selected") models = {} for atom in selection: if atom.structure not in models: models[atom.structure] = [AtomSpec(atom.atomspec)] else: models[atom.structure].append(AtomSpec(atom.atomspec)) first_pass = True new_structures = [] for ligname in lignames.split(','): ligname = ligname.strip() lig = Component(ligname) for model in models: if self.close_previous_bool and first_pass: rescol = ResidueCollection(model) elif self.close_previous_bool and not first_pass: raise RuntimeError("only the first model can be replaced") else: model_copy = model.copy() rescol = ResidueCollection(model_copy) for i, atom in enumerate(model.atoms): rescol.atoms[i].atomspec = atom.atomspec rescol.atoms[i].add_tag(atom.atomspec) rescol.atoms[i].chix_atom = atom target = rescol.find(models[model]) if len(target) % len(lig.key_atoms) == 0: k = 0 ligands = [] while k != len(target): res_lig = ResidueCollection(lig.copy(), comment=lig.comment) res_lig.parse_comment() res_lig = Component(res_lig, key_atoms = ",".join([str(k + 1) for k in res_lig.other["key_atoms"]])) ligands.append(res_lig) k += len(lig.key_atoms) else: raise RuntimeError("number of key atoms no not match: %i now, new ligand has %i" % (len(target), len(lig.key_atoms))) rescol.map_ligand(ligands, target) for center_atom in rescol.center: center_atom.connected = set([]) for atom in rescol.atoms: if atom not in rescol.center: if center_atom.is_connected(atom): atom.connected.add(center_atom) center_atom.connected.add(atom) if self.close_previous_bool: rescol.update_chix(model) else: struc = rescol.get_chimera(self.session) new_structures.append(struc) first_pass = False if not self.close_previous_bool: self.session.models.add(new_structures)
def test_map_ligand(self): monodentate = Component(TestGeometry.monodentate) tridentate = Component(TestGeometry.tridentate) debug = False # import cProfile # # profile = cProfile.Profile() # profile.enable() """ #TODO: get a reference file for this # two monodentate -> bidentate ptco4 = TestGeometry.ptco4.copy() ptco4.map_ligand('EDA', ["3", "5"]) """ # bidentate -> monodentate, none ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_1.xyz")) tm_simple = Geometry(TestGeometry.tm_simple) tm_simple.map_ligand(monodentate.copy(), ["35"]) self.assertTrue( validate(tm_simple, ref, heavy_only=True, thresh="loose", debug=debug)) # bidentate -> two monodentate ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_2.xyz")) tm_simple = Geometry(TestGeometry.tm_simple) tm_simple.map_ligand([monodentate.copy(), "ACN"], ["35", "36"]) self.assertTrue( validate(tm_simple, ref, thresh="loose", heavy_only=True, debug=debug)) # bidentate -> bidentate ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_3.xyz")) tm_simple = Geometry(TestGeometry.tm_simple) tm_simple.map_ligand("S-tBu-BOX", ["35", "36"]) self.assertTrue( validate(tm_simple, ref, thresh="loose", heavy_only=True, debug=debug)) # tridentate -> tridentate ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_4.xyz")) org_tri = Geometry(TestGeometry.org_tri) org_tri.map_ligand(tridentate, ["30", "28", "58"]) self.assertTrue( validate(org_tri, ref, thresh="loose", heavy_only=True, debug=debug)) # tridentate -> monodentate + bidentate -> tridentate ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_6.xyz")) org_tri = Geometry(TestGeometry.org_tri) org_tri.map_ligand(["EDA", "ACN"], ["30", "28", "58"]) self.assertTrue( validate(org_tri, ref, thresh="loose", heavy_only=True, debug=debug)) ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_7.xyz")) org_tri = Geometry(os.path.join(prefix, "ref_files", "lig_map_6.xyz")) org_tri.map_ligand(tridentate, ["10", "11", "2"]) self.assertTrue( validate(org_tri, ref, thresh="loose", heavy_only=True, debug=debug)) # bidentate -> two bulky monodentate ref = Geometry(os.path.join(prefix, "ref_files", "lig_map_5.xyz")) tm_simple = Geometry(TestGeometry.tm_simple) tm_simple.map_ligand(["iPr-NC3C"] * 2, ["35", "36"]) self.assertTrue( validate(tm_simple, ref, thresh="loose", heavy_only=True, debug=debug))