def inchi_with_sort_from_coordinates(gra, atm_xyz_dct=None): """ connectivity graph => inchi conversion (if coordinates are passed in, they are used to determine stereo) """ gra = automol.graph.without_dummy_atoms(gra) gra = automol.graph.dominant_resonance(gra) atm_keys = list(automol.graph.atom_keys(gra)) bnd_keys = list(automol.graph.bond_keys(gra)) atm_syms = dict_.values_by_key(automol.graph.atom_symbols(gra), atm_keys) atm_bnd_vlcs = dict_.values_by_key( automol.graph.atom_bond_valences(gra), atm_keys) atm_rad_vlcs = dict_.values_by_key( automol.graph.atom_unsaturated_valences(gra), atm_keys) bnd_ords = dict_.values_by_key(automol.graph.bond_orders(gra), bnd_keys) atm_xyzs = (None if atm_xyz_dct is None else dict_.values_by_key(atm_xyz_dct, atm_keys)) mlf, key_map_inv = _molfile.from_data( atm_keys, bnd_keys, atm_syms, atm_bnd_vlcs, atm_rad_vlcs, bnd_ords, atm_xyzs=atm_xyzs) rdm = _rdkit.from_molfile(mlf) ich, aux_info = _rdkit.to_inchi(rdm, with_aux_info=True) nums = _parse_sort_order_from_aux_info(aux_info) nums = tuple(map(key_map_inv.__getitem__, nums)) return ich, nums
def recalculate(ich, stereo=False): """ Recalculate an InChI string. :param ich: InChI string :type ich: str :param stereo: force the same stereochem in recalculated InChI :type stereo: bool :rtype: str """ # for now, just assert that we have no multi-component strings with # hardcoded parts -- these are guaranteed to fail ichs = split(ich) if len(ichs) > 1: if any(object_from_hardcoded_inchi_by_key('inchi', ich) for ich in ichs): ref_ichs = [] for ich_i in ichs: ref_ichs.append(recalculate(ich_i)) ref_ichs.sort() ret = join(ref_ichs) return ret # raise error.FailedInchiGenerationError ret = object_from_hardcoded_inchi_by_key('inchi', ich) if ret is None: _options = '-SUU' if stereo else '' rdm = _rdkit.from_inchi(ich) ret = _rdkit.to_inchi(rdm, options=_options, with_aux_info=False) return ret
def inchi(smi): """ SMILES => InChI """ ich = automol.convert.inchi.object_to_hardcoded_inchi_by_key( 'smiles', smi, comp=_compare) if ich is None: rdm = _rdkit.from_smiles(smi) ich = _rdkit.to_inchi(rdm) return ich
def inchi(smi): """ Convert a SMILES string into an InChI string. :param smi: SMILES string :type smi: str :rtype: str """ ich = object_to_hardcoded_inchi_by_key('smiles', smi, comp=_compare) if ich is None: rdm = _rdkit.from_smiles(smi) ich = _rdkit.to_inchi(rdm) return ich
def inchi_with_sort_from_geometry(gra, geo=None, geo_idx_dct=None): """ Generate an InChI string from a molecular graph. If coordinates are passed in, they are used to determine stereo. :param gra: molecular graph :type gra: automol graph data structure :param geo: molecular geometry :type geo: automol geometry data structure :param geo_idx_dct: :type geo_idx_dct: dict[:] :rtype: (str, tuple(int)) """ gra = without_dummy_atoms(gra) gra = dominant_resonance(gra) atm_keys = sorted(atom_keys(gra)) bnd_keys = list(bond_keys(gra)) atm_syms = dict_.values_by_key(atom_symbols(gra), atm_keys) atm_bnd_vlcs = dict_.values_by_key(atom_bond_valences(gra), atm_keys) atm_rad_vlcs = dict_.values_by_key(atom_unsaturated_valences(gra), atm_keys) bnd_ords = dict_.values_by_key(bond_orders(gra), bnd_keys) if geo is not None: assert geo_idx_dct is not None atm_xyzs = coordinates(geo) atm_xyzs = [ atm_xyzs[geo_idx_dct[atm_key]] if atm_key in geo_idx_dct else (0., 0., 0.) for atm_key in atm_keys ] else: atm_xyzs = None mlf, key_map_inv = _molfile.from_data(atm_keys, bnd_keys, atm_syms, atm_bnd_vlcs, atm_rad_vlcs, bnd_ords, atm_xyzs=atm_xyzs) rdm = _rdkit.from_molfile(mlf) ich, aux_info = _rdkit.to_inchi(rdm, with_aux_info=True) nums = _parse_sort_order_from_aux_info(aux_info) nums = tuple(map(key_map_inv.__getitem__, nums)) return ich, nums
def recalculate(ich, force_stereo=False): """ recalculate InChI string """ # for now, just assert that we have no multi-component strings with # hardcoded parts -- these are guaranteed to fail ichs = automol.inchi.split(ich) if len(ichs) > 1: if any(object_from_hardcoded_inchi_by_key('inchi', ich) for ich in ichs): ref_ichs = [] for ich_i in ichs: ref_ichs.append(recalculate(ich_i)) ref_ichs.sort() ret = automol.inchi.join(ref_ichs) return ret # raise error.FailedInchiGenerationError ret = object_from_hardcoded_inchi_by_key('inchi', ich) if ret is None: _options = '-SUU' if force_stereo else '' rdm = _rdkit.from_inchi(ich) ret = _rdkit.to_inchi(rdm, options=_options, with_aux_info=False) return ret
def inchi_with_sort_from_geometry(gra, geo=None, geo_idx_dct=None): """ connectivity graph => inchi conversion (if coordinates are passed in, they are used to determine stereo) """ gra = automol.graph.without_dummy_atoms(gra) gra = automol.graph.dominant_resonance(gra) atm_keys = sorted(automol.graph.atom_keys(gra)) bnd_keys = list(automol.graph.bond_keys(gra)) atm_syms = dict_.values_by_key(automol.graph.atom_symbols(gra), atm_keys) atm_bnd_vlcs = dict_.values_by_key(automol.graph.atom_bond_valences(gra), atm_keys) atm_rad_vlcs = dict_.values_by_key( automol.graph.atom_unsaturated_valences(gra), atm_keys) bnd_ords = dict_.values_by_key(automol.graph.bond_orders(gra), bnd_keys) #print('geo test print:', automol.geom.string(automol.graph.geometry(gra))) if geo is not None: assert geo_idx_dct is not None atm_xyzs = automol.geom.coordinates(geo) atm_xyzs = [atm_xyzs[geo_idx_dct[atm_key]] for atm_key in atm_keys] else: atm_xyzs = None mlf, key_map_inv = _molfile.from_data(atm_keys, bnd_keys, atm_syms, atm_bnd_vlcs, atm_rad_vlcs, bnd_ords, atm_xyzs=atm_xyzs) rdm = _rdkit.from_molfile(mlf) ich, aux_info = _rdkit.to_inchi(rdm, with_aux_info=True) nums = _parse_sort_order_from_aux_info(aux_info) nums = tuple(map(key_map_inv.__getitem__, nums)) return ich, nums