環構造を抽出する
PerlMolにはRing::Findというモジュールがあって、環のサーチをしてくれるのですが、返ってくるものが、アトムとボンドのIDの詰め合わせなのでちょっとあれです。本来ならば、見つかったリングの部分構造の分子オブジェクトのリストが返ってくると嬉しい場合も結構あります。
use warnings; use strict; use Chemistry::File::SMILES; use Chemistry::Ring 'aromatize_mol'; use Chemistry::Ring::Find ':all'; use Perl6::Say; sub get_rings { my $origin = shift; my @mols = (); my @rings = find_rings($origin, all => 1); for my $fg (@rings){ my $mol = Chemistry::Mol->new(id => $fg->{id}, name => $fg->{id}); for my $a (@{$fg->{atoms}}) { $mol->new_atom(name => $a->name, id => $a->id, symbol => $a->symbol) } for my $b (@{$fg->{bonds}}) { $mol->new_bond(name => $b->name, type => $b->type, atoms => [$mol->by_id($b->{atoms}->[0]->{id}), $mol->by_id($b->{atoms}->[1]->{id})], order => $b->order) } $mol->add_implicit_hydrogens; aromatize_mol($mol); push @mols, $mol; } return @mols; } my $smi = "c1c(CC=O(O))cccc1CC2CC2CCC3CCCCCCC3O"; my $origin = Chemistry::Mol->parse($smi, format => 'smiles'); aromatize_mol($origin); for my $mol (get_rings($origin)) {say $mol->print(format => 'smiles', unique => 1, name => 1);}