I think you've persuaded me that .SetIsotope() is the way to go...

I don't understand how that avoids any problem. How do you specify the
> target atom for that case?
> In any case, won't the InChI normalization affect some of your structures
> (e.g., detaching metals) and make it even harder to specify isotopes?

but just to clarify, here is the admittedly hackish via-InChI conversion I
had in mind.  The specification of isotopes still happens in smiles, which
I find easier for humans to grok than InChI.  {{Side note: the end
application here is modeling the labeling patterns in structurally complex
natural products that are biosynthesized from simple labeled substrates
(such as ethanol).  So I ultimately want to feed my labeled molecules to a
series of SMARTS reactions that will eventually lead to a complex
structure.  Given the vagaries of SMARTS reaction matching, I want to be
sure that all my reactions apply equally well to labeled and unlabeled

def convert_to_smiles_via_inchi(smiles):
    """Make a molecule from SMILES but via Inchi"""
    temp_mol = Chem.MolFromSmiles(smiles)
    inchi = Chem.MolToInchi(temp_mol)
    final_mol = Chem.MolFromInchi(inchi)
    return final_mol

def same_implicit_valence(mol_1, mol_2, atom_idx=1):
    """Returns True if mol_1 and mol_2 have the same implicit valence for
the indexed atom"""
    mol_1_implicitH = mol_1.GetAtomWithIdx(atom_idx).GetImplicitValence()
    mol_2_implicitH = mol_2.GetAtomWithIdx(atom_idx).GetImplicitValence()
    return mol_1_implicitH == mol_2_implicitH

etoh_v1 = 'C[13C]O'
etoh_v2 = 'CCO'

etoh_versions = [etoh_v1, etoh_v2]

via_inchi = [convert_to_smiles_via_inchi(mol) for mol in etoh_versions]
smiles_only = [Chem.MolFromSmiles(mol) for mol in etoh_versions]

# this works
assert same_implicit_valence(*via_inchi)

# this doesn't
assert same_implicit_valence(*smiles_only)
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
Rdkit-discuss mailing list

Reply via email to