AlignDB-DeltaG

 view release on metacpan or  search on metacpan

lib/AlignDB/DeltaG.pm  view on Meta::CPAN

package AlignDB::DeltaG;
use Moose;
use YAML::Syck;

our $VERSION = '1.1.0';

has 'temperature' => ( is => 'rw', isa => 'Num', default => sub {37.0}, );
has 'salt_conc'   => ( is => 'rw', isa => 'Num', default => sub {1.0}, );
has 'deltaH'      => ( is => 'ro', isa => 'HashRef', );
has 'deltaS'      => ( is => 'ro', isa => 'HashRef', );
has 'deltaG'      => ( is => 'ro', isa => 'HashRef', );

sub BUILD {
    my $self = shift;

    # Load thermodynamic data
    my ( $deltaH, $deltaS ) = $self->_load_thermodynamic_data;
    $self->{deltaH} = $deltaH;
    $self->{deltaS} = $deltaS;

    # Recalculate the deltaG hash on current temperature and salt conditions
    my $deltaG = $self->_init_deltaG;
    $self->{deltaG} = $deltaG;

    return;
}

sub polymer_deltaG {
    my $self    = shift;
    my $polymer = shift;

    $polymer = uc $polymer;
    return if $polymer =~ /[^AGCT]/;

    my $deltaG = $self->deltaG;

    my $polymer_len = length $polymer;
    my $dG          = 0;

    # calculate deltaG
    foreach ( 0 .. $polymer_len - 2 ) {
        my $nn = substr( $polymer, $_, 2 );
        $dG += $deltaG->{$nn};
    }

    # terminal correction
    my $init_terminal = "init" . substr( $polymer, 0, 1 );
    $dG += $deltaG->{$init_terminal};

    my $end_terminal = "init" . substr( $polymer, -1, 1 );
    $dG += $deltaG->{$end_terminal};

    # Symmetry correction
    my $rc_polymer = $self->_rev_com($polymer);
    if ( $polymer eq $rc_polymer ) {
        $dG += $deltaG->{sym};
    }

    return $dG;
}

# Load thermodynamic data comes from references
sub _load_thermodynamic_data {
    my $self = shift;

    #-------------------#
    # deltaH (kcal/mol)
    #-------------------#
    my %deltaH = qw{
        AA -7.6 TT -7.6
        AT -7.2

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 5.056 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-72ae3ad1e6da )