Chemistry-File-SLN
view release on metacpan or search on metacpan
lib/Chemistry/File/SLN.pm view on Meta::CPAN
=head1 OPTIONS
The following options are available when reading:
=over
=item kekulize
Assign bond orders for unsatisfied valences or for aromatic bonds. For example,
benzene read as C[1]H:CH:CH:CH:CH:CH@1 will be converted internally to
something like C[1]H=CHCH=CHCH=CH@1. This is needed if another format or
module expects a Kekule representation without an aromatic bond type.
=back
The following options are available when writing:
=over
=item mols
If this option points to an array of molecules, these molecules will be
written, one per line, as in the example in the SYNOPSYS.
=item aromatic
Detect aromaticity before writing. This will ensure that aromatic bond types
are used instead of alternate single and double bonds.
=item unique
Canonicalize before writing, and produce a unique strucure. NOTE: this option
does not guarantee a unique representation for molecules with bracketed
attributes.
=item name
Include the name of the molecule ($mol->name) in the output string.
=item coord3d, coords
Include the 3D coordinates of every atom in the molecule in the output string.
C<coord3d> and C<coords> may be used interchangeably.
=item attr
Output the atom, bond, and molecule attributes found in $mol->attr("sln/attr"),
etc.
=back
=head1 CAVEATS
This version does not implement the full SLN specification. It supports
simple structures and some attributes, but it does not support any of the
following:
=over
=item Macro atoms
=item Pattern matching options
=item Markush structures
=item 2D Coordinates
=back
The SLN specification is vague on several points, and I don't have a reference
implementation available, so I had to make several arbitrary decisions. Also,
this version of this module has not been tested exhaustively, so please report
any bugs that you find.
If the parser doesn't understand a string, it only says "syntax error", which
may not be very helpful.
=cut
# INITIALIZATION
Chemistry::Mol->register_format('sln');
my $Parser = Chemistry::File::SLN::Parser->new;
sub name_is {
my ($self, $name) = @_;
$name =~ /\.sln$/i;
}
sub file_is {
$_[0]->name_is($_[1]);
}
sub parse_string {
my ($self, $string, %opts) = @_;
my (@lines) = split /(?:\n|\r\n?)/, $string;
my @mols;
for my $line (@lines) {
my $mol = $self->parse_single_line($line, %opts);
return $mol unless wantarray;
push @mols, $mol;
}
@mols;
}
sub parse_single_line {
my ($self, $string, %opts) = @_;
my $mol_class = $opts{mol_class} || "Chemistry::Mol";
# call the actual yapp-generated parser
my $tree = $Parser->run($string) or return;
#use Data::Dumper; print Dumper $tree;
my $mol = $mol_class->new;
my @nodes = @{$tree->{chain}};
my %closures;
my $last_atom;
my @stack;
( run in 0.622 second using v1.01-cache-2.11-cpan-f56aa216473 )