PerlMol - Example: Combinatorial enumeration
Combinatorial library enumeration example.
Sent by Konrad Koehler, Karo Bio AB
Read in two SMILES files, one containing amines and the second acyl chlorides and print out SMILES strings of the product amides.
Files
- combinatorial_enumeration.pl - the program
- amines.smi - reactant amines
- acid_chlorides.smi - reactant acid chlorides
- output.smi - expected output
Code
#!/usr/bin/perl # Combinatorial library enumeration example. # Sent by Konrad Koehler, Karo Bio AB # Read in two SMILES files, one containing amines and the second acyl chlorides # and print out SMILES strings of the product amides. # Input files: <amines.smi> and <acid_chlorides.smi> # Output: STDOUT use strict; use warnings; use Chemistry::File::SMILES; use Chemistry::File::SMARTS; use Chemistry::Ring 'aromatize_mol'; # read in two files of reagents my @react1 = Chemistry::Mol->read('amines.smi'); my @react2 = Chemistry::Mol->read('acid_chlorides.smi'); # define SMARTS patterns for reactive functional groups # 1. amine (but not tertiary) or aromatic nitrogen with attached hydrogen atom my $fg1 = '[N&!D3,n&h1,n&H1]'; my $fg1_pat = Chemistry::Pattern->parse("$fg1", format => 'smarts'); # 2. acid chloride my $fg2 = 'C(Cl)=O'; my $fg2_pat = Chemistry::Pattern->parse("$fg2", format => 'smarts'); # loop over both sets of reactants my @prod; for (my $i = 0 ; $i <= $#react1 ; $i++) { for (my $j = 0 ; $j <= $#react2 ; $j++) { # the next two lines are needed whenever SMARTS patterns depend on # aromatic/nonaromatic properties aromatize_mol($react1[$i]); aromatize_mol($react2[$j]); # combine two reagents to form a new disconected molecule my $name = $react1[$i]->name . "+" . $react2[$j]->name; $prod[$i][$j] = Chemistry::Mol->new(name => $name); $prod[$i][$j]->combine($react1[$i], $react2[$j]); # find reactive functional groups $fg1_pat->match($prod[$i][$j]); my @nfg1 = $fg1_pat->atom_map; $fg2_pat->match($prod[$i][$j]); my @nfg2 = $fg2_pat->atom_map; # test to make sure both reactants have required functional groups # if not, skip if ($nfg1[0] && $nfg2[0] && $nfg2[1]) { # delete displaced atoms (i.e., H and Cl) to create two radicals my $h_count = $nfg1[0]->implicit_hydrogens(); $h_count = $h_count - 1; $nfg1[0]->implicit_hydrogens($h_count); $prod[$i][$j]->delete_atom($nfg2[1]); # add a bond between the two radicals to form the product $prod[$i][$j] ->new_bond(atoms => [$nfg1[0], $nfg2[0]], order => '1'); my $smi = $prod[$i][$j]->print(format => 'smiles', unique => 1, name => 1); # print out the product! print "$smi\n"; } } }