def test__relabel(): """ test graph.relabel """ assert graph.relabel(C3H3_CGR, {0: 10, 1: 11, 2: 12}) == ( {10: ('C', 1, None), 11: ('C', 1, None), 12: ('C', 1, None)}, {frozenset({10, 11}): (1, None), frozenset({11, 12}): (1, None), frozenset({12, 10}): (1, None)})
def test__backbone_isomorphism(): """ test graph.backbone_isomorphism """ cgr = C8H13O_CGR natms = len(graph.atoms(cgr)) for _ in range(10): pmt_dct = dict(enumerate(numpy.random.permutation(natms))) cgr_pmt = graph.relabel(cgr, pmt_dct) assert graph.backbone_isomorphism(cgr, cgr_pmt) == pmt_dct
def test__atom_inchi_numbers(): """ test graph.atom_inchi_numbers """ cgr = C8H13O_CGR natms = len(graph.atoms(cgr)) for _ in range(10): pmt_dct = dict(enumerate(numpy.random.permutation(natms))) cgr_pmt = graph.relabel(cgr, pmt_dct) inv_pmt_dct = dict(map(reversed, pmt_dct.items())) assert graph.atom_inchi_numbers(cgr_pmt) == inv_pmt_dct
def test__from_dictionaries(): """ test graph.from_dictionaries """ assert graph.from_dictionaries( graph.atom_symbols(CH2FH2H_CGR_EXP), graph.bond_keys(CH2FH2H_CGR_EXP) ) == CH2FH2H_CGR_EXP assert graph.from_dictionaries( graph.atom_symbols(C8H13O_RGRS[0]), graph.bond_keys(C8H13O_RGRS[0]), atm_imp_hyd_vlc_dct=graph.atom_implicit_hydrogen_valences( C8H13O_RGRS[0]), bnd_ord_dct=graph.bond_orders(C8H13O_RGRS[0]) ) == C8H13O_RGRS[0] assert graph.from_dictionaries( graph.atom_symbols(C8H13O_SGRS[0]), graph.bond_keys(C8H13O_SGRS[0]), atm_imp_hyd_vlc_dct=graph.atom_implicit_hydrogen_valences( C8H13O_SGRS[0]), atm_ste_par_dct=graph.atom_stereo_parities(C8H13O_SGRS[0]), bnd_ste_par_dct=graph.bond_stereo_parities(C8H13O_SGRS[0]) ) == C8H13O_SGRS[0] # a litte ridiculous, but make sure we get the keys right sgr_ref = C8H13O_SGRS[0] natms = len(graph.atoms(sgr_ref)) for _ in range(10): pmt_dct = dict(enumerate(numpy.random.permutation(natms))) sgr = graph.relabel(sgr_ref, pmt_dct) assert graph.from_dictionaries( graph.atom_symbols(sgr), graph.bond_keys(sgr), atm_imp_hyd_vlc_dct=graph.atom_implicit_hydrogen_valences(sgr), atm_ste_par_dct=graph.atom_stereo_parities(sgr), bnd_ste_par_dct=graph.bond_stereo_parities(sgr) ) == sgr
def hydrogen_migrations(rct_gras, viable_only=True): """ find all possible hydrogen migration reactions for these reactants :param rct_gras: graphs for the reactants, without stereo and without overlapping keys :param viable_only: Filter out reactions with non-viable products? :type viable_only: bool :returns: a list of Reaction objects :rtype: tuple[Reaction] Hydrogen migrations are enumerated looping over unsaturated sites, adding hydrogens to them, and looping over non-equivalent heavy atoms and removing hydrgens from them. """ assert_is_valid_reagent_graph_list(rct_gras) rxns = [] if len(rct_gras) == 1: rct_gra, = rct_gras # Identify unsaturated sites rct_add_key = max(atom_keys(rct_gra)) + 1 rct_rad_keys = unsaturated_atom_keys(rct_gra) rct_hyd_keys = atom_keys(rct_gra, sym='H') for rct_rad_key in rct_rad_keys: # Add a hydrogen to the radical/unsaturated site rct_h_gra = add_bonded_atom(rct_gra, 'H', rct_rad_key, bnd_atm_key=rct_add_key) # Identify donor sites rct_don_keys = backbone_keys(rct_h_gra) - {rct_rad_key} for rct_don_key in rct_don_keys: rct_hyd_key = atom_neighbor_atom_key(rct_gra, rct_don_key, symbs_first=['H'], symbs_last=[]) if rct_hyd_key in rct_hyd_keys: prd_gra = remove_atoms(rct_h_gra, {rct_hyd_key}) prd_gra = relabel(prd_gra, {rct_add_key: rct_hyd_key}) forw_tsg = ts.graph(rct_gra, frm_bnd_keys=[(rct_rad_key, rct_hyd_key)], brk_bnd_keys=[(rct_don_key, rct_hyd_key)]) back_tsg = ts.graph(prd_gra, frm_bnd_keys=[(rct_don_key, rct_hyd_key)], brk_bnd_keys=[(rct_rad_key, rct_hyd_key)]) rxns.append( Reaction( rxn_cls=par.ReactionClass.Typ.HYDROGEN_MIGRATION, forw_tsg=forw_tsg, back_tsg=back_tsg, rcts_keys=[atom_keys(rct_gra)], prds_keys=[atom_keys(prd_gra)], )) if viable_only: rxns = filter_viable_reactions(rxns) return ts_unique(rxns)