Chemistry-File-PDB
    
    
  
  
  
view release on metacpan or search on metacpan
# http://module-build.sourceforge.net/META-spec.html
#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
name:         Chemistry-File-PDB
version:      0.23
version_from: PDB.pm
installdirs:  site
requires:
    Chemistry::MacroMol:           0.05
    Chemistry::Mol:                0.30
distribution_type: module
generated_by: ExtUtils::MakeMaker version 6.30
    
  
  
  Makefile.PL view on Meta::CPAN
use 5.006;
use ExtUtils::MakeMaker;
WriteMakefile(
    'NAME'		=> 'Chemistry::File::PDB',
    'VERSION_FROM'	=> 'PDB.pm', 
    'PREREQ_PM'		=> {
        'Chemistry::MacroMol'   => 0.05,
        'Chemistry::Mol'        => '0.30',
    },
);
    
  
  
  package Chemistry::File::PDB;
our $VERSION = '0.23';
# $Id: PDB.pm,v 1.13 2009/05/10 21:57:32 itubert Exp $
use base qw(Chemistry::File);
use Chemistry::MacroMol;
use Chemistry::Domain;
use Scalar::Util qw(weaken);
use Carp;
use strict;
use warnings;
=head1 NAME
Chemistry::File::PDB - Protein Data Bank file format reader/writer
=head1 SYNOPSIS
    use Chemistry::File::PDB;
    # read a PDB file
    my $macro_mol = Chemistry::MacroMol->read("myfile.pdb");
    # write a PDB file
    $macro_mol->write("out.pdb");
    # read all models in a multi-model file
    my @mols = Chemistry::MacroMol->read("models.pdb");
    # read one model at a time
    my $file = Chemistry::MacroMol->file("models.pdb");
    $file->open;
    while (my $mol = $file->read_mol($file->fh)) {
        # do something with $mol
    }
=cut
=head1 DESCRIPTION
This module reads and writes PDB files. The PDB file format is commonly used to
    
  
  
      ATOM
    HETATM
    ENDMDL 
    END
This module automatically registers the 'pdb' format with Chemistry::Mol,
so that PDB files may be identified and read by Chemistry::Mol->read(). For 
autodetection purpuses, it assumes that files ending in .pdb or having 
a line matching /^(ATOM  |HETATM)/ are PDB files.
The PDB reader and writer is designed for dealing with Chemistry::MacroMol
objects, but it can also create and use Chemistry::Mol objects by throwing some
information away.
=head2 Properties
When reading and writing files, this module stores or gets some of the
information in the following places:
=over
    
  
  
  
=cut
Chemistry::Mol->register_format(pdb => __PACKAGE__);
sub read_mol {
    my ($self, $fh, %options) = @_;
    return if $fh->eof;
    my $domain;
    my $mol_class = $options{mol_class} || "Chemistry::MacroMol";
    my $mol = $mol_class->new;
    my $is_macro = $mol->isa('Chemistry::MacroMol');
    $domain = $mol unless $is_macro;
    local $_;
    my $curr_residue = 0;
    while (<$fh>) {
	if (/^TER/) {
            # TODO read separated molecules?
	} elsif (/^(?:HETATM|ATOM)/) {
	    my ($atom_n, $symbol, $suff, $res_name, $chain_id,
                $seq_n, $ins_code, $x, $y, $z
    
  
  
      }
    return 0;
}
sub write_string {
    my ($class, $mol, %opts) = @_;
    my $ret = '';
    $ret .= 'TITLE     ' . $mol->name . "\n" if defined $mol->name;
    $ret .= 'REMARK    Generated by ' . __PACKAGE__ . " version $VERSION\n";
    if ($mol->isa("Chemistry::MacroMol")) {
        my $i = 1;
        my $j = 1;
        for my $res ($mol->domains) {
            my $seq_n = $res->attr("pdb/sequence_number");
            $seq_n = $j++ unless defined $seq_n;
            my $res_name = substr($res->name, 0, 3) || "UNK";
            for my $atom ($res->atoms) {
                my $serial_n  = $res->attr("pdb/serial_number");
                my $ins_code  = $res->attr("pdb/insertion_code");
    
  
  
  }
1;
=head1 VERSION
0.23
=head1 SEE ALSO
L<Chemistry::MacroMol>, L<Chemistry::Mol>, L<Chemistry::File>,
L<http://www.perlmol.org/>.
The PDB format description at 
L<http://www.rcsb.org/pdb/docs/format/pdbguide2.2/guide2.2_frame.html>
There is another PDB reader in Perl, as part of the BioPerl project:
L<Bio::Structure::IO::pdb>.
=head1 AUTHOR
    
  
  
  This module reads and writes PDB files. The PDB file format is commonly used to
describe proteins, particularly those stored in the Protein Data Bank
(L<http://www.rcsb.org/pdb/>). The current version of this module only uses the
ATOM and HETATM records, ignoring everything else.
This module automatically registers the 'pdb' format with Chemistry::Mol,
so that PDB files may be identified and read by Chemistry::Mol->read(). For 
autodetection purpuses, it assumes that files ending in .pdb or having 
a line matching /^(ATOM  |HETATM)/ are PDB files.
The PDB reader and writer is designed for dealing with Chemistry::MacroMol
objects, but it can also create and use Chemistry::Mol objects by throwing some
information away.
CHANGES SINCE VERSION 0.21
        - Add unique ID to atom names when generating from a $mol object.
        - Also treat END as a molecule separator in multi-molecule files.
        - Fixed insertion code bug (thanks to kparkes).
        - Fixed memory leak.
        - Fixed a couple of atom symbol bugs.
        - Add a title on output.
    
  
  
  
   perl Makefile.PL
   make
   make test
   make install
DEPENDENCIES
This module requires these other modules and libraries:
  Chemistry::MacroMol   0.05
  Chemistry::Mol        0.24
COPYRIGHT AND LICENSE
Copyright (C) 2009 Ivan Tubert-Brohman
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself. 
    
  
  
  use Test::More;
use Chemistry::File::PDB;
my $mol = Chemistry::Mol->read("test.pdb");
my $macromol = Chemistry::MacroMol->read("test.pdb");
plan tests => 9;
is(scalar($mol->atoms),             139,        '$mol->atoms');
is(scalar($macromol->atoms),        139,        '$macromol->atoms');
is(scalar($macromol->domains),      10,         '$macromol->domains');
is($macromol->domains(4)->type,     'VAL',      '$macromol->domains(4)->name');
is($macromol->domains(4)->name,     'VAL4',     '$macromol->domains(4)->name');
is($mol->atoms(48)->name,           'CG1',      '$mol->atoms(44)->name');
is($mol->atoms(48)->symbol,         'C',        '$mol->atoms(44)->name');
    
  
  
  #!/home/ivan/bin/perl
use strict;
use warnings;
use Test::More tests => 1;
use Chemistry::File::PDB;
my $mol = Chemistry::MacroMol->read("test.pdb");
$mol->write("out.pdb");
my ($got, $expected);
{
    local $/;
    open F, "<test.pdb" or die "couldn't open test.pdb: $!\n";
    $expected = <F>;
    open F, "<out.pdb" or die "couldn't open test.pdb: $!\n";
    $got = <F>;
}
    
  
  
  
( run in 0.354 second using v1.01-cache-2.11-cpan-0a6323c29d9 )