123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- package QualityAssessModel;
- ## assesses a 3d model built from the templates in 'tList' based on hhsearch posterior probabilities
- ## for each query residue take the max. posterior probability over all templates as a quality measure
- use strict;
- use TemplateList;
- use Template;
- use utilities;
- use vars qw($AUTOLOAD);
- use Carp;
- {
- my %_attr_data = # DEFAULT ACCESS
- (
- _tList => ['###', 'read/write'],
- _outbase => ['###', 'read/write'],
- _pdbFile => ['###', 'read/write'],
- );
-
- sub _accessible {
- my ($self, $attr, $mode) = @_;
- $_attr_data{$attr}[1] =~ /$mode/;
- }
- sub _default_for {
- my ($self, $attr) = @_;
- $_attr_data{$attr}[0];
- }
- sub _standard_keys {
- keys %_attr_data;
- }
- }
- ## constructor
- sub new {
- my ($caller, %arg) = @_;
- my $caller_is_obj = ref($caller);
- my $class = $caller_is_obj || $caller;
- my $self = bless {}, $class;
- foreach my $attrname ($self->_standard_keys() ) {
- my ($argname) = ($attrname =~ /^_(.*)/);
- if (exists $arg{$argname}) {
- $self->{$attrname} = $arg{$argname};
- } elsif ($caller_is_obj) {
- $self->{$attrname} = $caller->{$attrname};
- } else {
- $self->{$attrname} = $self->_default_for($attrname);
- }
- }
- return $self;
- }
- ## automatically generated getters and setters:
- ## $AUTOLOAD contains full name of a routine and is checked for name/accessiblity
- ## then an anonymous routine (names e.g. get_name) is created and stored
- ## in table for future use
- sub AUTOLOAD {
- no strict "refs";
- my ($self, $newval) = @_;
- if ($AUTOLOAD =~ /.*::get(_\w+)/ && $self->_accessible($1, 'read')) {
- my $attr_name = $1;
- *{$AUTOLOAD} = sub { return $_[0]->{$attr_name} };
- return $self->{$attr_name}
- }
- if ($AUTOLOAD =~ /.*::set(_\w+)/ && $self->_accessible($1, 'write')) {
- my $attr_name = $1;
- *{$AUTOLOAD} = sub { $_[0]->{$attr_name} = $_[1]; return };
- $self->{$1} = $newval;
- return
- }
- ## mistaken?
- croak("No such method: $AUTOLOAD");
- }
- sub DESTROY {
- }
- sub run {
- my $self = shift;
- my $pos = shift;
- my @templatePPs;
- ## generate all posteriors for all templates
- for (my $i=0; $i<$self->get_tList()->size(); $i++) {
- my $tabFile = $self->get_outbase() . "." . $self->get_tList()->get($i)->get_Filt() . ".tab";
- my %PP = &PosteriorsFromTabFile( $tabFile, $self->get_tList()->get($i)->get_No() );
- push (@templatePPs, \%PP);
- }
- ## find maximum pp for each query residue
- my @maxPP = (0) x $self->get_tList()->get_queryLength();
- for (my $i=0; $i<@maxPP; $i++) {
- for (my $j=0; $j<@templatePPs; $j++) {
- if (exists($templatePPs[$j]->{$i})) {
- $maxPP[$i] = &max($maxPP[$i], $templatePPs[$j]->{$i});
- }
- }
- }
- ## write result in pdb file
- my $pdbFile = $self->get_pdbFile();
- open(PDB, "< $pdbFile");
- my @pdb = <PDB>;
- close(PDB);
-
- my $maxDisplacement = 100;
- my $minDisplacement = 5;
- # ATOM 1 N SER A 2 31.507 77.672 34.913 1.00 39.58 N
- for (my $i=0; $i<@pdb; $i++) {
- if ($pdb[$i] =~ /^ATOM\s+\S+\s+\S+\s+\S+\s+(\d+)/) {
- my $residue = $1;
- my $temperatureFactor = $maxDisplacement - $maxPP[$residue-1]*$maxPP[$residue-1] * ($maxDisplacement - $minDisplacement);
- $temperatureFactor = sprintf("%6.2f", $temperatureFactor);
- $pdb[$i] =~ s/(.{60})(.{6})(.*)/$1$temperatureFactor$3/;
- }
- }
-
- open(PDB, "> $pdbFile");
- print (PDB @pdb);
- close(PDB);
- }
|