def test_porphyrin(self, use_ILP: bool = True) -> None: with open('pdbs/tetraphenylporphyrin.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='porphyrin', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(1200, 1200), graph_kwargs={'include_atom_index': False}, ) tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=30, enforce_octet_rule=True, allow_radicals=False, ) assert len(tautomers) == 21, len(tautomers) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(1200, 1200), graph_kwargs={'include_atom_index': False}, )
def test_violuric_acid(self, use_ILP: bool = True) -> None: with open('pdbs/violuric_acid.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='violuric_acid', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(1200, 1200), graph_kwargs={'include_atom_index': False}, ) tautomers = input_molecule.get_all_tautomers( #net_charge=0, total_number_hydrogens=3, enforce_octet_rule=True, allow_radicals=False, ) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(1200, 1200), graph_kwargs={ 'include_atom_index': False, 'vertex_color_scheme': 'elements', 'vertex_label_template': '' }, ) assert len(tautomers) == 15, len(tautomers)
def test_ammonium(self): with open('pdbs/ammonium.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='ammonium', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(600, 600), graph_kwargs={'include_atom_index': False}, ) tautomers = input_molecule.get_all_tautomers( net_charge=1, total_number_hydrogens=4, enforce_octet_rule=True, allow_radicals=False, ) assert len(tautomers) == 1, len(tautomers) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(600, 600), graph_kwargs={'include_atom_index': True}, )
def test_ammonium_fail(self): with open('pdbs/ammonium.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='ammonium', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(600, 600), graph_kwargs={'include_atom_index': False}, ) with self.assertRaises(Exception): tautomers = input_molecule.get_all_tautomers( net_charge=1, total_number_hydrogens=4, maximum_number_hydrogens_per_atom=2, enforce_octet_rule=True, allow_radicals=False, ) with self.assertRaises(Exception): tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=4, maximum_number_hydrogens_per_atom=3, enforce_octet_rule=True, allow_radicals=False, )
def test_benzene_fail(self): with open('pdbs/benzene.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='benzene_fail', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(600, 600), graph_kwargs={'include_atom_index': True}, ) tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=6, enforce_octet_rule=True, allow_radicals=False, disallow_triple_bond_in_small_rings=False, disallow_allenes_in_small_rings=False, disallow_allenes_completely=False, lock_phenyl_rings=False, ) assert len(tautomers) == 5, len(tautomers) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(600, 600), graph_kwargs={'include_atom_index': False}, )
def test_methylimidazole(self, use_ILP: bool = True) -> None: with open('pdbs/methylimidazole.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='methylimidazole', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(600, 600), graph_kwargs={'include_atom_index': False}, ) tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=6, enforce_octet_rule=True, allow_radicals=False, ) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(600, 600), graph_kwargs={'include_atom_index': False}, )
def test_carbon_dioxide(self) -> None: with open('pdbs/carbon_dioxide.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='carbon_dioxide', ) input_molecule.assign_bond_orders_and_charges_with_ILP( enforce_octet_rule=True, ) input_molecule.write_graph( '', output_size=(400, 400), graph_kwargs={'include_atom_index': True}, )
def test_skeletal_rearrangement(self): with open('pdbs/warfarin.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='warfarin_extended', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(1200, 1200), graph_kwargs={'include_atom_index': False}, ) with self.assertRaises(TypeError): tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=16, enforce_octet_rule=True, allow_radicals=False, skeletal_rearrangements=[(1, 2, 3)], ) tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=16, enforce_octet_rule=True, allow_radicals=False, skeletal_rearrangements=[ (2, 10), (2, 8) ], # Bonds ('C13', 'O1') and ('C13', 'O3') ) assert len(tautomers) == 53, len(tautomers) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(1200, 1200), graph_kwargs={ 'include_atom_index': False, 'vertex_color_scheme': 'elements', 'vertex_label_template': '' }, )
def test_example_porphyrin(self, use_ILP: bool = True) -> None: with open('pdbs/tetraphenylporphyrin.pdb') as fh: uncapped_molecule = molecule_from_pdb_str( fh.read(), name='porphyrin', ) _, _, pos = uncapped_molecule.write_graph( 'input', output_size=(1200, 1200), graph_kwargs={'include_atom_index': False}, ) capped_molecule = getattr(uncapped_molecule, CAPPING_FUNCTION_NAME)(debug=None) capped_molecule.write_graph( 'output', output_size=(1200, 1200), graph_kwargs={'include_atom_index': False}, pos=None, )
def test_radicals(self): with open('pdbs/nitric_oxide.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='nitric_oxide', ) input_molecule.remove_all_hydrogens(mark_all_uncapped=True) input_molecule.write_graph( 'input', output_size=(600, 600), graph_kwargs={'include_atom_index': False}, ) with self.assertRaises(Exception): tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=0, enforce_octet_rule=True, allow_radicals=False, ) tautomers = input_molecule.get_all_tautomers( net_charge=0, total_number_hydrogens=0, enforce_octet_rule=False, allow_radicals=True, ) assert len(tautomers) == 1, len(tautomers) for (n, molecule) in enumerate(tautomers, start=1): molecule.name = input_molecule.name molecule.write_graph( '_tautomer_{0}'.format(n), output_size=(600, 600), graph_kwargs={'include_atom_index': True}, ) tautomer = tautomers[0] assert list(tautomer.bond_orders.items()) == [2]
def test_guanidinium(self) -> None: with open('pdbs/guanidinium.pdb') as fh: input_molecule = molecule_from_pdb_str( fh.read(), name='guanidinium_fail', ) input_molecule.assign_bond_orders_and_charges_with_ILP( enforce_octet_rule=True, debug=stderr, ) input_molecule.write_graph( '', output_size=(400, 400), graph_kwargs={ 'include_atom_index': False, 'vertex_color_scheme': 'elements', 'vertex_label_template': '{charge_str}', }, )
def test_capping_peptide( peptide_pdb_filepath: str, peptide_net_charge: int, peptide_number_hydrogens: Optional[int] = None) -> None: peptide_name, _ = basename(peptide_pdb_filepath).split('.') with open(peptide_pdb_filepath) as fh: input_molecule = molecule_from_pdb_str( fh.read(), name=peptide_name, net_charge=peptide_net_charge, ) molecule_copy = deepcopy(input_molecule) molecule_copy.assign_bond_orders_and_charges_with_ILP() old_formula, old_charge = molecule_copy.formula( charge=True), molecule_copy.netcharge() molecule_copy.write_graph('input', graph_kwargs={ 'include_atom_index': False, 'vertex_color_scheme': 'elements', 'vertex_label_template': '{charge_str}', }) input_molecule.remove_atoms_with_predicate( lambda atom: atom.element == 'H', reset_valences=False, renumber_atoms=False, ) kept_atom_ids = [atom.index for atom in input_molecule.atoms.values()] def enforce_valence_aromatic_rings() -> None: molecule_copy.assign_aromatic_bonds() aromatic_atom_ids = { atom_id for atom_id in reduce( lambda acc, e: acc | set(e), molecule_copy.aromatic_rings, set(), ) } input_molecule.atoms = { atom_id: atom if (not atom.capped and atom_id in aromatic_atom_ids) else atom._replace(valence=None) for (atom_id, atom) in input_molecule.atoms.items() } enforce_valence_aromatic_rings() now = datetime.now() new_molecule = input_molecule.get_best_capped_molecule_with_ILP( enforce_octet_rule=True, net_charge=old_charge, number_hydrogens=peptide_number_hydrogens, ) print((datetime.now() - now).total_seconds()) new_formula = new_molecule.formula(charge=True) print( new_molecule.write_graph( 'capped', graph_kwargs={ 'include_atom_index': False, 'vertex_color_scheme': 'elements', 'vertex_label_template': '{charge_str}', }, )) with open(peptide_pdb_filepath.replace('.pdb', '_capped.pdb'), 'wt') as fh: fh.write(new_molecule.dummy_pdb()) print(compare_capped_molecules(molecule_copy, new_molecule, kept_atom_ids)) assert old_formula == new_formula, (old_formula, new_formula, compare_capped_molecules( molecule_copy, new_molecule, kept_atom_ids))
CONECT 5 4 CONECT 6 4 CONECT 7 4 END''', } OPTIONS = { 'warfarin': { 'total_number_hydrogens': 16, 'net_charge': 0 }, } if __name__ == '__main__': for (molecule_name, pdb_str) in PDBS.items(): molecule = molecule_from_pdb_str(pdb_str, name=molecule_name) if molecule.name in {'warfarin'}: print( molecule.get_all_tautomers( **OPTIONS[molecule_name] if molecule_name in OPTIONS else {})) else: print( molecule.assign_bond_orders_and_charges_with_ILP( enforce_octet_rule=True)) print( molecule.write_graph(molecule_name, output_size=(int(2100 / 1.5), int(2970 / 1.5)))) if molecule_name == 'warfarin': print(molecule)