#!/home/ivan/bin/perl # This sample program is called 'pbabel' because it is inspired by the Babel # program and it is written in Perl using PerlMol. # USAGE # ./pbabel.pl [options] use strict; use warnings; # load all File I/O modules use Chemistry::File ':auto'; # load helper modules for finding bonds, aromatizing, and generating coords use Chemistry::3DBuilder 'build_3d'; use Chemistry::Ring 'aromatize_mol'; use Chemistry::Bond::Find 'find_bonds'; # parse options use Getopt::Long; Getopt::Long::Configure ("bundling"); my ($input_format, $output_format, $build_3d, $find_bonds, $aromatize, $no_kekulize, $unique, $name); my $result = GetOptions( "i=s" => \$input_format, "o=s" => \$output_format, "3" => \$build_3d, "b" => \$find_bonds, "a" => \$aromatize, "K" => \$no_kekulize, "u" => \$unique, "n" => \$name, ); # check if everything is OK, or else print usage info if (@ARGV != 2 or !$result) { my @formats = Chemistry::Mol->formats; print < Options: -i -o -3 build 3d coordinates -b find bonds -a aromatize -K don't kekulize (only for reading SMILES) -u unique (only for writing SMILES) -n include name (only for writing SMILES) Available file formats (if omitted they will be guessed): OPTIONS print " $_\n" for @formats; exit; } my ($input_file, $output_file) = @ARGV; # read the input file my @mols = Chemistry::Mol->read($input_file, format => $input_format, kekulize => ! $no_kekulize, # only used by SMILES ); # do optional processing on the molecules for my $mol (@mols) { build_3d($mol) if $build_3d; find_bonds($mol, orders => 1) if $find_bonds; aromatize_mol($mol) if $aromatize; } # write the output file $mols[0]->write($output_file, format => $output_format, mols => \@mols, # only used by multi-molecule files # such as SMILES and SDF name => $name, # only used by SMILES unique => $unique, # only used by SMILES );