1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| sub Tm
{
my $Amorce = $_[0];
my $Ct = $_[1];
my $Na = $_[2];
$Amorce = uc($Amorce);
# si l'amorce dont on veut le tm est dégénérée
if ($Amorce !~ /^[ATCG]+$/){
# recherche la liste des amorces correspondantes
my @liste_amorces;
core( sub { push (@liste_amorces, $_);}, $Amorce);
# calcul du tm moyen
my @a_tm;
foreach my $amorce (@liste_amorces){
my $tm = Tm($amorce,$Ct,$Na);
push (@a_tm, $tm);
}
my $moyenne_tm = mean @a_tm;
return($moyenne_tm);
}
my %dH =
(
AA => -9.1,
TT => -9.1,
AT => -8.6,
TA => -6.0,
CA => -5.8,
TG => -5.8,
GT => -6.5,
AC => -6.5,
CT => -7.8,
AG => -7.8,
GA => -5.6,
TC => -5.6,
CG => -11.9,
GC => -11.1,
GG => -11.0,
CC => -11.0,
);
my %dS =
(
AA => -24.0,
TT => -24.0,
AT => -23.9,
TA => -16.9,
CA => -12.9,
TG => -12.9,
GT => -17.3,
AC => -17.3,
CT => -20.8,
AG => -20.8,
GA => -13.5,
TC => -13.5,
CG => -27.8,
GC => -26.7,
GG => -26.6,
CC => -26.6,
);
my $H = 0;
my $S = 0;
my $NbScan = length($Amorce)-2+1;
for(my$i=0; $i<$NbScan; $i++){
my $N2 = substr($Amorce, $i, 2);
if((!exists $dH{$N2}) | (!exists $dS{$N2})){
die "ERREUR N2 ($N2) $Amorce, $i\n";
}
else{
$H += $dH{$N2};
$S += $dS{$N2};
}
}
my $Tm = 1000 * $H / ((-10.8 + $S)+1.987*log($Ct/4)) - 273.15 + 16.6*(log($Na)/log(10));
$Tm = sprintf("%.3f", $Tm);
return $Tm;
} |
Partager