I have a bunch of monomers in the form of SMILES string and I want to generate conformers from them.

At the moment, I am using RDKit to convert these SMILES strings to .sdf files, then using OpenBabel to generate conformers using OpenBabel's default genetic algorithm.

The problem with this method is that I am having to write these sdf files to disk using RDKit. Once that is done, I then separately run a OpenBabel command on my terminal to produce the low-energy conformers I want.

My question is, is there a way to write a python script that accepts SMILES strings, creates an sdf-like object, and then calls the genetic algorithm to go to work on the file and generate conformer file for me to use? I don't want to have the preliminary step of converting the SMILES string to sdf in my workflow.

The method I have right now works fine on my personal computer, but when I am accessing a remote cluster with memory constraints, I can't afford to use disk space by storing .sdf/.pdb/.mol files.

Any advice you have would be appreciated.

For reference, I am using this to create my conformers. Is there a python command in openbabel or pybel that I can use to generate conformers from that SMILES string?

The bash script I am using is:

#! /bin/bash

obabel -:"CC(=C)C(=O)OCCN(C)C" -O test_.pdb --gen3D -d
obabel test_.pdb -O test_op.pdb --conformer --nconf 30 --score rmsd --writeconformers
rm test_.pdb
  • 2
    $\begingroup$ I think that you can use OpenBabel to do all that steps from a bash script. $\endgroup$
    – Camps
    Jan 7, 2021 at 0:09
  • 1
    $\begingroup$ I know. I was wondering if there was a way to do it from a python script @Camps. Added my bash script for completeness $\endgroup$
    – megamence
    Jan 7, 2021 at 5:29

1 Answer 1


My colleague David Koes has a script for this purpose using RDKit rdconf.py

A related Open Babel / Pybel script would be globalopt.py, the main portion of which is reproduced below:


ff = pybel._forcefields["mmff94"]
success = ff.Setup(mol.OBMol)
if not success:
    ff = pybel._forcefields["uff"]
    success = ff.Setup(mol.OBMol)
    if not success:
        sys.exit("Cannot set up forcefield")

ff.ConjugateGradients(100, 1.0e-3) # optimize geometry
ff.WeightedRotorSearch(100, 25) # generate conformers

mol.write("sdf", "test.sdf", overwrite=True)

This isn't quite what you describe because it only saves the lowest energy conformer. I have to go finish some other work, but should give you the basic idea. Both RDKit and Open Babel can do what you describe.

  • $\begingroup$ thank you! this seems interesting. Looking at this script, I have a quick quesiton. What force field does the generic genetic algorithm conformer search utilize? ie when i run obabel test_.pdb -O test_op.pdb --conformer --nconf 30 --score rmsd --writeconformers rm test_.pdb, what force field is it using in its comuptation? uff, or gaff, or? $\endgroup$
    – megamence
    Jan 7, 2021 at 17:31
  • 1
    $\begingroup$ The default is to use MMFF94 if not specified. $\endgroup$ Jan 7, 2021 at 18:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.