Given a SMILES string for a molecule, I want to know the elements in the molecule, I then send this to basis_set_exchange to get a "custom" basis set for use in Gaussian.

This seems like something that RDKit can do, or PubChem.

I do know that given a molecular formula, like "H2O" molmass can return the elements. So, it would also suffice to have a program that simply takes a SMILES string and returns a molecular formula, then use molmass to get the elements.

However, this seems like such a trivial exercise, it must already be done. I don't want to make my own script for converting a SMILES to its elements just because I don't want to have to worry about corner cases or reinvent a wheel.

  • $\begingroup$ +1 because, Charlie Crown is back! By the way, did you ever visit the Gaussian chat room? $\endgroup$ Mar 27, 2021 at 5:09
  • $\begingroup$ Now I did, I liked the historical context in that question. Personally, I am going to try psi4 since it is python friendly $\endgroup$
    – B. Kelly
    Mar 27, 2021 at 5:13
  • $\begingroup$ is smiles ID supposed to mean smiles string? I've never heard of a smiles ID $\endgroup$
    – Cody Aldaz
    Mar 27, 2021 at 6:06
  • $\begingroup$ Probably, I may be misusing the term ID in this case. "CCCCCO" is the SMILES for pentanol, for instance $\endgroup$
    – B. Kelly
    Mar 27, 2021 at 6:09
  • 1
    $\begingroup$ haha, sorry didn't mean to make you feel bad ;) was just confused. $\endgroup$
    – Cody Aldaz
    Mar 27, 2021 at 6:13

2 Answers 2



This is pretty easy to do in RDKit. If you want the molecular formula, you can just use CalcMolFormula():

from rdkit import Chem
from rdkit.Chem.rdMolDescriptors import CalcMolFormula

# e.g. cysteine
mol = Chem.MolFromSmiles("C([C@@H](C(=O)O)N)S")
formula = CalcMolFormula(mol)

It is also very easy to get all of the unique heteroatoms:

from rdkit import Chem

# e.g. cysteine
mol = Chem.MolFromSmiles("C([C@@H](C(=O)O)N)S")
hetatms = {atom.GetSymbol() for atom in mol.GetAtoms()}


Pybel is good for this type of task https://open-babel.readthedocs.io/en/latest/UseTheLibrary/Python_PybelAPI.html

import pybel
global __ATOM_LIST__
 __ATOM_LIST__ = \ 
      ['h',  'he',                                                                                                                                                                                                                                                 
      'li', 'be', 'b',  'c',  'n',  'o',  'f',  'ne',
      'na', 'mg', 'al', 'si', 'p',  's',  'cl', 'ar',
      'k',  'ca', 'sc', 'ti', 'v ', 'cr', 'mn', 'fe', 'co', 'ni', 'cu',
      'zn', 'ga', 'ge', 'as', 'se', 'br', 'kr',
      'rb', 'sr', 'y',  'zr', 'nb', 'mo', 'tc', 'ru', 'rh', 'pd', 'ag',
      'cd', 'in', 'sn', 'sb', 'te', 'i',  'xe',
      'cs', 'ba', 'la', 'ce', 'pr', 'nd', 'pm', 'sm', 'eu', 'gd', 'tb', 'dy',
      'ho', 'er', 'tm', 'yb', 'lu', 'hf', 'ta', 'w',  're', 'os', 'ir', 'pt',
      'au', 'hg', 'tl', 'pb', 'bi', 'po', 'at', 'rn',
      'fr', 'ra', 'ac', 'th', 'pa', 'u',  'np', 'pu']

mol = pybel.readstring("smi", smi)
numbers = [atom.atomicnum for atom in mol]

def from_number_to_element(i):
    return __ATOM_LIST__[i-1].capitalize()

names= [ from_number_to_element(i) for i in numbers]
  • 2
    $\begingroup$ Oof, looks good but pybel doesn't have readstring... turns out I need to install pip install openbabel not pip install pybel...turns out openbabel doesn't want to install, turns out it may be python2? python... so much ductape :) will try in the morning, need sleep $\endgroup$
    – B. Kelly
    Mar 27, 2021 at 7:14
  • $\begingroup$ You want from openbabel import pybel for OB v3. $\endgroup$ Mar 28, 2021 at 17:32
  • 1
    $\begingroup$ As far as the "other pybel" - there's not much that can be done. I use conda, so conda install -c conda-forge openbabel $\endgroup$ Mar 28, 2021 at 17:34
  • $\begingroup$ @GeoffHutchison yeah it seems a bit tragic, I found myself at the github discussion of it. $\endgroup$
    – B. Kelly
    Mar 30, 2021 at 22:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .