HackaMol
view release on metacpan or search on metacpan
examples/Cofactor/feheme.pl view on Meta::CPAN
#!/usr/bin/env perl
#
# DMR 4-15-2014
# simple script to help get started analyzing cofactors/metals in proteins
#
# wget http://pdb.org/pdb/files/1C7D.pdb
#
# run:
# perl feheme.pl 1C7D.pdb
#
use Modern::Perl;
use HackaMol;
use Statistics::Descriptive;
my $hack = HackaMol->new ;
# load all atoms into an array
my @atoms = $hack->read_file_atoms(shift);
#pull out iron atoms
my @Fes = grep {$_->symbol eq "Fe"} @atoms;
#pull out hemes, no iron
my @hemes = grep {
$_->resname eq "HEM" and
$_->symbol ne "Fe"
} @atoms;
# find the bonds to fe foreach wrt hemes, print out lengths
foreach my $fe (@Fes){
my @fe_bonds = $hack ->find_bonds_brute(
bond_atoms => [$fe],
candidates => [@hemes],
#
# candidates => [grep {$_->symbol eq "N"} @hemes],
#
fudge => 0.45,
max_bonds => 6,
);
foreach my $bond (@fe_bonds){
my @sym = map{ $_->symbol } $bond->all_atoms;
printf ("%4s %4s %10.3f\n", @sym, $bond->bond_length);
}
my $stat = Statistics::Descriptive::Full->new();
$stat->add_data(map {$_->bond_length} @fe_bonds);
printf ("Avg: %.3f Stdev: %.4f \n", $stat->mean, $stat->standard_deviation);
}
# give all protein atoms within 5 angstroms of the cofactors
# not the most efficient... exercise: make faster
say "slowly carving 5.0 angstroms around the hemes for printing";
my %atom_bin;
foreach my $hemat (@hemes){
my @iaround = grep{$hemat->distance($atoms[$_]) <= 5.0 } 0 .. $#atoms;
$atom_bin{$_}++ foreach @iaround;
}
my @iats = sort{$a <=> $b} keys %atom_bin;
my $mol = HackaMol::Molecule->new(atoms=>[@atoms[@iats]]);
$mol->print_pdb;
( run in 1.155 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )