From Open Babel
Revision as of 12:39, 1 January 2009 by Baoilleach (Talk | contribs)

Jump to: navigation, search


The Perl bindings can be installed either globally or locally as described in the following sections.

Install the Perl bindings globally

(A1) If you want to use OpenBabel from Perl, you now need to compile the Perl extension.

Change directory to 'openbabel-2.0.2/scripts/perl' and run:

perl Makefile.PL
make test # (Optional - this runs a few standard tests)

On an MacOSX system, you may get the following error when you run 'make':

/usr/bin/ld: flag: -undefined dynamic_lookup can't be used with MACOSX_DEPLOYMENT_TARGET environment variable set to: 10.1

If this happens, you should set the value of the MACOSX_DEPLOYMENT_TARGET environment variable to match the MacOSX major version. For example, if you are using MacOSX 10.4.9, set MACOSX_DEPLOYMENT_TARGET to 10.4. Now run 'make' again.

(A2) To install the Perl bindings globally, as root type:

make install

(A3) You may need to add the location of (on my system, the location is /usr/local/lib) to the environment variable LD_LIBRARY_PATH if you get an error when you try to import the OpenBabel library in a Perl script.

Install the Perl bindings locally

(B1) To compile the Perl extension, instead of Step B1 above, use the 'PREFIX' option to Makefile.PL to specify an install location:

perl Makefile.PL PREFIX=/home/noel/tree
make test # (Optional - this runs a few standard tests)

(B2) To install the Perl extension, run the following:

make install

This installs the extension into something like /home/noel/tree/lib/perl/5.8.7, so you need to add "/home/noel/tree/lib/perl" to your PERL5LIB environment variable or specify this location in your Perl scripts as follows:

use lib "/home/noel/tree/lib/perl"; # Must come before "use Chemistry::OpenBabel;"

(B3) As described in Step B3 above, you will probably also have to edit the variable LD_LIBRARY_PATH as follows:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/noel/tree/lib

Using Chemistry::OpenBabel

The Chemistry::OpenBabel module is designed to allow Perl scripts to use the C++ Open Babel library. The bindings are generated using the SWIG package and provides access to almost all of the Open Babel interfaces via Perl, including the base classes OBMol, OBAtom, OBBond, and OBResidue, as well as the conversion framework OBConversion.

As such, essentially any call in the C++ API is available to Perl access with very little difference in syntax. This guide is designed to give examples of common Perl syntax for Chemistry::OpenBabel and pointers to the appropriate sections of the API documentation.

For more examples of using Open Babel inside Perl, see the developer Perl tutorial.

The example script below creates atoms and bonds one-by-one using the OBMol, OBAtom, and OBBond classes.


 use Chemistry::OpenBabel;

 my $obMol = new Chemistry::OpenBabel::OBMol;

 $numAtoms = $obMol->NumAtoms(); # now 1 atom

 my $atom1 = $obMol->GetAtom(1); # atoms indexed from 1
 $atom1->SetVector(0.0, 1.0, 2.0);
 $atom1->SetAtomicNum(6); # carbon atom

 $obMol->AddBond(1, 2, 1); # bond between atoms 1 and 2 with bond order 1
 $numBonds = $obMol->NumBonds(); # now 1 bond


More commonly, Open Babel can be used to read in molecules using the OBConversion framework. The following script reads in molecular information (a SMI file) from a string, adds hydrogens, and writes out an MDL file as a string.


 use Chemistry::OpenBabel;

 my $obMol = new Chemistry::OpenBabel::OBMol;
 my $obConversion = new Chemistry::OpenBabel::OBConversion;
 $obConversion->SetInAndOutFormats("smi", "mdl");
 $obConversion->ReadString($obMol, "C1=CC=CS1");

 $numAtoms = $obMol->NumAtoms(); # now 5 atoms

 $numAtoms = $obMol->NumAtoms(); # now 9 atoms

 my $outMDL = $obConversion->WriteString($obMol);

The following script writes out a file using a filename, rather than reading and writing to a Perl string.


 use Chemistry::OpenBabel;

 my $obMol = new Chemistry::OpenBabel::OBMol;
 my $obConversion = new Chemistry::OpenBabel::OBConversion;
 $obConversion->SetInAndOutFormats("pdb", "mol2");
 $obConversion->ReadFile($obMol, "1ABC.pdb");


 print "# of atoms: $obMol->NumAtoms()";
 print "# of bonds: $obMol->NumBonds()";
 print "# of residues: $obMol->NumResidues()";

 $obConversion->WriteFile($obMol, "1abc.mol2");

That's it! There's more information on particular calls in the library API and the developer Perl tutorial. Feel free to address questions to the openbabel-scripting mailing list.

For developing chemistry in Perl, you should also look at the PerlMol project.