123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #!/usr/bin/perl -w
- package TMscoreNN;
- require Exporter;
- use strict;
- use config;
- use PDBResolution;
- use utilities;
- {
- my $nhidden = 3;
- ## these are the original parameters
- my @bias = (-0.1635528802871704, -0.3720591366291046, 5.6198554039001465);
- my @weights = (-0.007, 11.739, 3.298, -0.008,
- -4.479, -1.674, 1.605, -0.041,
- -0.364, -17.33, -4.629, 0.161,
- 0.867, -0.405, -0.265);
- ## test parameters
- # my @bias = (-5.77800,-0.11515,-0.88430);
- # my @weights = ( 0.06798,6.66194,8.12909,-0.34054,
- # 0.17152,-8.21288,-3.86566,0.34767,
- # 0.28003,0.88483,13.91985,0.12512,
- # 0.30894,-0.25261,0.63520);
- sub _get_nhidden() {
- $nhidden;
- }
- sub _get_bias {
- my ($self, $i) = @_;
- $bias[$i];
- }
- sub _get_weight {
- my ($self, $i) = @_;
- $weights[$i];
- }
- }
- sub new {
- my ($caller, %arg) = @_;
- my $caller_is_obj = ref($caller);
- my $class = $caller_is_obj || $caller;
- no strict "refs";
- my $self = bless {}, $class;
-
- return $self;
- }
- sub read_from_file {
- my ($self, $paramFile) = @_;
- ## TODO
- }
- ## first predict TM score of each template in templateList with a NN
- ## which has as inputs score, sumProb/L, SS and template resolution (in A).
- ## Then sort templates wrt predicted TM score
- sub rank_templates {
- my ($self, $templateList, $queryLength, $config) = @_;
- # print "reading resolutions of templates...\n";
- my %resolutions = &extractAllPDBResolutions();
-
- for (my $i=0; $i<$templateList->size(); $i++) {
- my $template = $templateList->get($i);
- # print "single NN features of " . $template->get_Hit() . ":\n";
- # print "single NN features:\n";
- # print "score=" . $template->get_Score() . "\n";
- # print "ss=" . $template->get_SS() . "\n";
- # print "qLen=" . $templateList->get_queryLength() . "\n";
- # print "sumProbL=" . $template->get_SumProbL . "\n";
- my $TMscore = 0;
- my $templateName = $template->get_Hit();
- # print "resolution of " . $template->get_Hit() . "=" . $resolutions{$templateName} . "\n";
- for (my $unit = 0; $unit<$self->_get_nhidden(); $unit++) {
- #calculate input of hidden unit (sum of all inputs * weights)
- my $input = ($template->get_Score()/50) * $self->_get_weight(0 + $unit * 4) +
- $template->get_SS()/$queryLength * $self->_get_weight(1 + $unit * 4) +
- $template->get_SumProbL() * $self->_get_weight(2 + $unit * 4) +
- $resolutions{$templateName}/10 * $self->_get_weight(3 + $unit*4);
- #calculate output of hidden unit
- my $output = 1.0 / (1.0 + exp(-($input + $self->_get_bias($unit))));
- $TMscore += $output * $self->_get_weight( $self->_get_nhidden()*4 + $unit);
- }
- $TMscore = sprintf("%.6f", $TMscore);
- $template->set_predTM($TMscore);
- }
- $templateList->sort_by_predTM();
- }
- sub predict {
- my $self = shift;
- my $template = shift;
- my $queryLength = shift;
- my $config = shift;
- my $TMscore = 0;
- my %resolutions = &extractAllPDBResolutions();
- my $templateName = $template->get_Hit();
- print "templateName=$templateName\n";
- print "score=" . $template->get_Score() . "\n";
- for (my $unit = 0; $unit<$self->_get_nhidden(); $unit++) {
- #calculate input of hidden unit (sum of all inputs * weights)
- my $input = ($template->get_Score()/50) * $self->_get_weight(0 + $unit * 4) +
- $template->get_SS()/$queryLength * $self->_get_weight(1 + $unit * 4) +
- $template->get_SumProbL() * $self->_get_weight(2 + $unit * 4) +
- $resolutions{$templateName}/10 * $self->_get_weight(3 + $unit*4);
- #calculate output of hidden unit
- my $output = 1.0 / (1.0 + exp(-($input + $self->_get_bias($unit))));
- $TMscore += $output * $self->_get_weight( $self->_get_nhidden()*4 + $unit);
- }
- $TMscore = sprintf("%.6f", $TMscore);
- #$template->set_predTM($TMscore);
- print "predict->$TMscore\n";
- return $TMscore;
- }
- 1;
|