PerlMolにはseparateメソッドがあるので、SMARTSで適当にマッチさせて結合を壊してからseparateすると化合物の構造を分割できる。
芳香環の炭素原子とヘテロ原子の間を切って、分割した構造をsmilesで出力するスクリプトはこう書ける。
use warnings;
use strict;
use Chemistry::File::SMARTS;
use Chemistry::File::SMILES;
use Chemistry::Ring 'aromatize_mol';
my $SMILES = shift;
my $react = Chemistry::Mol->parse($SMILES, format => 'smiles');
my $SMARTS = 'c-A';
my $pattern = Chemistry::Pattern->parse($SMARTS, format => 'smarts');
aromatize_mol($react);
molsplit($react);
sub molsplit {
my $mol = shift;
if($pattern->match($mol)){
my @nbd = $pattern->bond_map;
my @nfg = $pattern->atom_map;
$nbd[0]->delete;
for my $fg (@nfg){
my $hcnt = $fg->implicit_hydrogens();
$fg->implicit_hydrogens(++$hcnt);
}
for my $frag ($mol->separate){
molsplit($frag);
}
}else{
print $mol->print(format => 'smiles', unique => 1, name => 1),"\n";
}
}
試しにpioglitazoneを分割してみると
$ perl molsplit.pl "CCC1=CN=C(C=C1)CCOC2=CC=C(C=C2)CC3C(=O)NC(=O)S3"
CC
c1ccncc1
CCO
c1ccccc1
CC1SC(=O)NC1=O