def elimination_ts_geometry(rxn, rct_geos, max_dist_err=2e-1, log=False): """ geometry for an elimination transition state :param rxn: a Reaction object :param rct_geos: the reactant geometries """ assert rxn.class_ == ReactionClass.Typ.ELIMINATION assert rxn.has_standard_keys() frm_bnd_key, = ts.forming_bond_keys(rxn.forward_ts_graph) frm_bnd_dist = 1.6 frm_rng_keys, = ts.forming_rings_atom_keys(rxn.forward_ts_graph) dist_dct = automol.geom.ts.distances(rct_geos, angstrom=True) dist_dct[frm_bnd_key] = frm_bnd_dist gra = ts.reactants_graph(rxn.forward_ts_graph) dist_range_dct = automol.graph.embed.distance_ranges_from_coordinates( gra, dist_dct, rings_keys=[frm_rng_keys], degree=True, angstrom=True) geo_init, = rct_geos relax_ang = True relax_tors = True geo = _geometry_from_info( gra, rct_geos, geo_init, dist_range_dct, relax_ang=relax_ang, relax_tors=relax_tors, max_dist_err=max_dist_err, log=log) return geo
def insertion_ts_geometry(rxn, rct_geos, max_dist_err=2e-1, log=False): """ geometry for an insertion transition state :param rxn: a Reaction object :param rct_geos: the reactant geometries """ assert rxn.class_ == ReactionClass.Typ.INSERTION assert rxn.has_standard_keys() # set the formed bond distance based on the number of hydrogens frm_bnd_dist_dct = { 0: 1.9, 1: 1.6, 2: 1.2, } tsg = rxn.forward_ts_graph frm_bnd_key1, frm_bnd_key2 = ts.forming_bond_keys(tsg) hcnt1 = automol.graph.atom_count_by_type(tsg, 'H', keys=frm_bnd_key1) hcnt2 = automol.graph.atom_count_by_type(tsg, 'H', keys=frm_bnd_key2) frm_bnd_dist1 = frm_bnd_dist_dct[hcnt1] frm_bnd_dist2 = frm_bnd_dist_dct[hcnt2] a123 = 170. frm_rng_keys, = ts.forming_rings_atom_keys(tsg) dist_dct = automol.geom.ts.distances(rct_geos, angstrom=True) dist_dct[frm_bnd_key1] = frm_bnd_dist1 dist_dct[frm_bnd_key2] = frm_bnd_dist2 gra = ts.reactants_graph(tsg) dist_range_dct = automol.graph.embed.distance_ranges_from_coordinates( gra, dist_dct, rings_keys=[frm_rng_keys], angstrom=True) # Join on the end without hydrogen, if there is one if hcnt1 <= hcnt2: key2, key3 = sorted(frm_bnd_key1) else: key2, key3 = sorted(frm_bnd_key2) geo1, geo2 = rct_geos geo_init = automol.geom.ts.join(geo1, geo2, key2=key2, key3=key3, r23=frm_bnd_dist1, a123=a123) relax_ang = True relax_tors = True geo = _geometry_from_info( gra, rct_geos, geo_init, dist_range_dct, relax_ang=relax_ang, relax_tors=relax_tors, max_dist_err=max_dist_err, log=log) return geo
def forming_rings_atom_keys(rxn, rev=False): """ Obtain atom keys for rings containing at least one forming bond. Atom keys are sorted by connectivity. :param rxn: the reaction object :type rxn: Reaction :param rev: parameter to toggle reaction direction :type rev: bool :rtype: tuple[tuple[int]] """ if rev: tsg = rxn.backward_ts_graph else: tsg = rxn.forward_ts_graph return ts.forming_rings_atom_keys(tsg)