示例#1
0
    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},
            )
示例#2
0
    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)
示例#3
0
    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},
            )
示例#4
0
 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,
         )
示例#5
0
    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},
            )
示例#6
0
 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},
         )
示例#7
0
    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},
        )
示例#8
0
    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': ''
                },
            )
示例#9
0
 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,
     )
示例#10
0
    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]
示例#11
0
    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}',
            },
        )
示例#12
0
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))
示例#13
0
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)