This Perl module uses Inline::C to bind the ntthal alignment from the primer3 code and make it available as a Perl subroutine call. It uses an object-oriented Mouse interface.
The main motivation to do this was speed of execution, especially to reduce overhead generated by process creation (fork) and passing of sequences, retrieval of results via shell process communication. See BENCHMARK for results.
To install this module, clone the code and run the following commands:
perl Makefile.PL
make
make test
make install
Alternatively, you can download the latest release and run:
cpanm Ntthal-XS-#.#.#.tar.gz
Here, the # signs are placeholders for the version number.
The package will also install a demo/driver script named ntthal_xs.pl, which should be executable after installation. The purpose is to test the functionality and serve as a template for own code.
use Ntthal::XS;
my $NT = Ntthal::XS->new();
# tm will accept only one sequence
print $NT->tm('TAATACGACTCACTATAGGG'); # 44.5215658215416
# change parameters
$NT->type('END1');
$NT->dv(0.8);
# ntthal will use two sequences (different strands!)
my $hybrid = $NT->ntthal( 'CCCGAAAAGTGCCACCTG', 'CAGGTGGCATTTTTTCGGG' );
# $hybrid = {
# dG => -13335.3624649896, # { 0}
# dH => -132500, # { 1}
# dna_conc => 50, # { 2}
# dntp => 0.8, # { 3}
# dS => -384.216145526392, # { 4}
# duplex0 => " G- ", # { 5}
# duplex1 => "CCCGAAAA TGCCACCTG", # { 6}
# duplex2 => "GGGCTTTT ACGGTGGAC", # { 7}
# duplex3 => " TT ", # { 8}
# dv => 0.8, # { 9}
# maxLoop => 8, # {10}
# mv => 50, # {11}
# s1 => "CCCGAAAAGTGCCACCTG", # {12}
# s2 => "CAGGTGGCATTTTTTCGGG", # {13}
# t => 42.0422986972263, # {14}
# temp => 37, # {15}
# type => "END1", # {16}
# }
# compare to the ntthal command line output
#
# ntthal -a END1 -dv 0.8 -s1 CCCGAAAAGTGCCACCTG -s2 CAGGTGGCATTTTTTCGGG
# Calculated thermodynamical parameters for dimer: dS = -384.216 dH = -132500 dG = -13335.4 t = 42.0423
# SEQ G-
# SEQ CCCGAAAA TGCCACCTG
# STR GGGCTTTT ACGGTGGAC
# STR TT
Here, a comparison is shown for the traditional ntthal command line call, a newer version that does not read all parameter files at every call (it uses pre-populated lists) named ntthal_new and the xs version implemented here. Note: The underlying algorithm was not changed, only the overhead calling it from Perl was reduced.
Benchmark: timing 5000 iterations of ntthal, ntthal_new, xs...
ntthal: 16 wallclock secs ( 0.18 usr 1.82 sys + 7.84 cusr 7.28 csys = 17.12 CPU) @ 292.06/s (n=5000)
ntthal_new: 10 wallclock secs ( 0.16 usr 1.22 sys + 5.09 cusr 3.38 csys = 9.85 CPU) @ 507.61/s (n=5000)
xs: 2 wallclock secs ( 2.37 usr + 0.00 sys = 2.37 CPU) @ 2109.70/s (n=5000)
Rate ntthal ntthal_new xs
ntthal 292/s -- -42% -86%
ntthal_new 508/s 74% -- -76%
xs 2110/s 622% 316% --
That is about a 4-fold improvement on my system.
Copyright (C) 2019 Frank Reinecke ([email protected])
This program is released under the following license: AGPL3, see LICENSE.