Biopython - Big Discrepancy Calculating RNA melting Temperature over Literature
Comparing Biopython MetlingTemp to other calculators.

I have written the recent version of MeltingTemp in Biopython's SeqUtils.  I have extensively tested the Tm calculations against other programs like MELTING and Primer3Plus and other online Tm calculators with consistent results, thus I'm pretty confident that there is no gross error in the module. The simple answer in this case is: the calculation of siDirect is wrong.

Sources of discrepancy.

One minor thing: Many programs calculate k as k = total Oligo/4. MeltingTemp uses k = Oligo1 - (Oligo2/2). Thus to mimic this behaviour, you have to use

dnac1=50, dnac2=50


instead of

dnac1=100


And now the major thing: Oligo concentration is usually given in nanomolar. However, if you look at the calculation in the Perl script, siDirect seems to use micromolar!

my \$tm = ( 1000 * $dH / ( -10.8 + $dS + 1.987 * log(0.0001/4) ) - 273.15 + 16.6 * log(0.1)/log(10) )


The critical part here is:

log(0.0001/4)


which should be:

log(0.0000001/4)


Thus, you have to pass 1000-fold higher oligo concentrations to Biopython's MeltingTemp to get the same result as siDirect:

&gt;&gt;&gt; from Bio.SeqUtils import MeltingTemp as mt
&gt;&gt;&gt; print mt.Tm_NN('GGAUUUG', dnac1=50000, dnac2=50000, Na=100,
                  nn_table=mt.RNA_NN1, saltcorr=1)
20.1472140567
&gt;&gt;&gt; print mt.Tm_NN('CUCAUUG', dnac1=50000, dnac2=50000, Na=100,
                   nn_table=mt.RNA_NN1, saltcorr=1)
18.1074422939


This is of course wrong if your primer concentration is 100 nM, but that's the result you get from siDirect.