NAME
SOOT::Examples::Math - SOOT Examples for Math
DESCRIPTION
This is a listing of all SOOT examples for Math.
EXAMPLES
FeldmanCousins.pl
use strict;
use warnings;
use SOOT ':all';
# FIXME: this SEGV's somehow...
sub _FeldmanCousins {
# Example macro of using the TFeldmanCousins class in root.
# Author : Adrian John Bevan <bevan@SLAC.Stanford.EDU>
# get a FeldmanCousins calculation object with the default limits
# of calculating a 90% CL with the minimum signal value scanned
# = 0.0 and the maximum signal value scanned of 50.0
my $f = TFeldmanCousins->new(0.9, "");
# calculate either the upper or lower limit for 10 observerd
# events with an estimated background of 3. The calculation of
# either upper or lower limit will return that limit and fill
# data members with both the upper and lower limit for you.
my $Nobserved = 10.0;
my $Nbackground = 3.0;
my $ul = $f->CalculateUpperLimit($Nobserved, $Nbackground);
my $ll = $f->GetLowerLimit();
print <<VERBATIM;
For $Nobserved data observed with and estimated background
of $Nbackground candidates, the Feldman-Cousins method of
calculating confidence limits gives:
Upper Limit = $ul
Limit = $ll
at the 90% CL
VERBATIM
}
_FeldmanCousins();
binomial.pl
use strict;
use warnings;
use SOOT ':all';
sub _binomialSimple {
#
# Simple test for the binomial distribution
#
printf("\nTMath:::Binomial simple test\n");
printf("Build the Tartaglia triangle\n");
printf("============================\n");
use constant max => 13;
foreach my $i (0..max-1) {
printf "n=%2d", $i;
print " " x (max-$i);
for my $j (0..$i) {
my $bin = TMath::Nint( TMath::Binomial($i,$j));
printf("%4d", $bin);
}
print "\n";
}
}
sub _binomialFancy {
my $serr = 0;
use constant nmax => 10000;
print <<'VERBATIM';
TMath:::Binomial fancy test
Verify Newton formula for (x+y)^n
x,y in [-2,2] and n from 0 to 9
=================================
VERBATIM
my $val = 0.;
my ($x, $y);
for (0..nmax-1) {
do {
$x = 2 * (1 - 2*rand());
$y = 2 * (1 - 2*rand());
$val = abs($x+$y)*1.;
} while ($val < 0.75); # Avoid large cancellations
foreach my $j (0..9) {
my $res1 = ($x+$y) ** $j;
my $res2 = 0;
foreach my $k (0..$j) {
$res2 += $x**$k
* $y**($j-$k)
* TMath::Binomial($j,$k);
}
my $err = abs($res1-$res2)/abs($res1);
print "res1=$res1 res2=$res2 x=$x y=$y err=$err j=$j\n" if $err > 1e-10;
$serr += $err;
}
}
print "Average Error = ". $serr/nmax . "\n";
}
_binomialSimple;
_binomialFancy;
limit.pl
use strict;
use warnings;
use SOOT ':all';
my $c1 = TCanvas->new("c1","Dynamic Filling Example",200,10,700,500);
$c1->SetFillColor(42);
# Create some histograms
my $background = TH1D->new("background","The expected background",30,-4,4);
my $signal = TH1D->new("signal","the expected signal",30,-4,4);
my $data = TH1D->new("data","some fake data points",30,-4,4);
$background->SetFillColor(48);
$signal->SetFillColor(41);
$data->SetMarkerStyle(21);
$data->SetMarkerColor(kBlue);
$background->Sumw2; # needed for stat uncertainty
$signal->Sumw2; # needed for stat uncertainty
# Fill histograms randomly
my $r = TRandom->new;
my ($bg, $sig, $dt);
for (0..24999) {
$bg = $r->Gaus(0.,1.)*1.0;
$sig = $r->Gaus(1.,.2)*1.0;
$background->Fill($bg,0.02);
$signal->Fill($sig,0.001);
}
for (0..499) {
$dt = $r->Gaus(0.,1.)*1.0;
$data->Fill($dt,1.0);
}
my $hs = THStack->new("hs","Signal and background compared to data...");
$hs->Add($background);
$hs->Add($signal);
$hs->Draw("hist");
$data->Draw("PE1,Same");
$c1->Modified;
$c1->Update;
my $frame = $c1->GetFrame;
$frame->SetFillColor(21);
$frame->SetBorderSize(6);
$frame->SetBorderMode(-1);
$c1->Modified;
$c1->Update;
$gSystem->ProcessEvents;
# Compute the limits
my $ds = TLimitDataSource->new($signal, $background, $data);
my $l = TLimit->new();
my $cl = $l->ComputeLimit($ds, 50000);
printCL($cl, "Computing limits...");
# Add stat uncertainty
my $scl = $l->ComputeLimit($ds,50000,1);
printCL($scl, "Computing limits with stat systematics...");
# Add some systematics
my $errorb = TH1D->new("errorb","errors on background",1,0,1);
my $errors = TH1D->new("errors","errors on signal",1,0,1);
my $names = TObjArray->new;
my $name1 = TObjString->new("bg uncertainty");
my $name2 = TObjString->new("sig uncertainty");
$names->AddLast($name1);
$names->AddLast($name2);
$errorb->SetBinContent(0,0.05); # error source 1: 5%
$errorb->SetBinContent(1,0); # error source 2: 0%
$errors->SetBinContent(0,0); # error source 1: 0%
$errors->SetBinContent(1,0.01); # error source 2: 1%
my $nds = TLimitDataSource->new;
$nds->AddChannel(
$signal, $background, $data,
TVectorD->new($errors->GetNbinsX(), $errors->GetArray()), # FIXME AddChannel expects a TVectorD argument, but that's really TVectorT<double>, which is templated and not really supported by SOOT...
TVectorD->new($errorb->GetNbinsX(), $errorb->GetArray()),
$names
);
my $ncl = $l->ComputeLimit($nds,50000,1);
printCL($ncl, "Computing limits with systematics...");
# show canonical -2lnQ plots in a new canvas
# - The histogram of -2lnQ for background hypothesis (full)
# - The histogram of -2lnQ for signal and background hypothesis (dashed)
my $c2 = TCanvas->new("c2");
$cl->Draw;
$gApplication->Run;
sub printCL {
my ($obj, $anot) = @_;
print "== ", $anot, " ==\n";
print "CLs : ", $obj->CLs, "\n";
print "CLsb : ", $obj->CLsb, "\n";
print "CLb : ", $obj->CLb, "\n";
print "<CLs> : ", $obj->GetExpectedCLs_b, "\n";
print "<CLsb> : ", $obj->GetExpectedCLsb_b, "\n";
print "<CLb> : ", $obj->GetExpectedCLb_b, "\n\n";
}
mathBeta.pl
use strict;
use warnings;
use SOOT ':all';
my $c1 = TCanvas->new("c1", "TMath::BetaDist",600,800);
$c1->Divide(1, 2);
my $pad1 = $c1->cd(1);
$pad1->SetGrid();
my $fbeta = TF1->new("fbeta", "TMath::BetaDist(x, [0], [1])", 0, 1);
$fbeta->SetParameters(0.5, 0.5);
my $f1 = $fbeta->DrawCopy();
$f1->SetLineColor(kRed);
$f1->SetLineWidth(1);
$fbeta->SetParameters(0.5, 2);
my $f2 = $fbeta->DrawCopy("same");
$f2->SetLineColor(kGreen);
$f2->SetLineWidth(1);
$fbeta->SetParameters(2, 0.5);
my $f3 = $fbeta->DrawCopy("same");
$f3->SetLineColor(kBlue);
$f3->SetLineWidth(1);
$fbeta->SetParameters(2, 2);
my $f4 = $fbeta->DrawCopy("same");
$f4->SetLineColor(kMagenta);
$f4->SetLineWidth(1);
my $legend1 = TLegend->new(.5,.7,.8,.9);
$legend1->AddEntry($f1,"p=0.5 q=0.5","l");
$legend1->AddEntry($f2,"p=0.5 q=2","l");
$legend1->AddEntry($f3,"p=2 q=0.5","l");
$legend1->AddEntry($f4,"p=2 q=2","l");
$legend1->Draw();
my $pad2 = $c1->cd(2);
$pad2->SetGrid();
my $fbetai = TF1->new("fbetai", "TMath::BetaDistI(x, [0], [1])", 0, 1);
$fbetai->SetParameters(0.5, 0.5);
my $g1=$fbetai->DrawCopy();
$g1->SetLineColor(kRed);
$g1->SetLineWidth(1);
$fbetai->SetParameters(0.5, 2);
my $g2 = $fbetai->DrawCopy("same");
$g2->SetLineColor(kGreen);
$g2->SetLineWidth(1);
$fbetai->SetParameters(2, 0.5);
my $g3 = $fbetai->DrawCopy("same");
$g3->SetLineColor(kBlue);
$g3->SetLineWidth(1);
$fbetai->SetParameters(2, 2);
my $g4 = $fbetai->DrawCopy("same");
$g4->SetLineColor(kMagenta);
$g4->SetLineWidth(1);
my $legend2 = TLegend->new(.7,.15,0.9,.35);
$legend2->AddEntry($f1,"p=0.5 q=0.5","l");
$legend2->AddEntry($f2,"p=0.5 q=2","l");
$legend2->AddEntry($f3,"p=2 q=0.5","l");
$legend2->AddEntry($f4,"p=2 q=2","l");
$legend2->Draw();
$c1->cd();
$c1->Update();
$gApplication->Run;
mathGammaNormal.pl
use strict;
use warnings;
use SOOT ':all';
my $myc = TCanvas->new("c1","gamma and lognormal",10,10,600,800);
$myc->Divide(1,2);
my $pad1 = $myc->cd(1);
$pad1->SetLogy();
$pad1->SetGrid();
# TMath::GammaDist
my $fgamma = TF1->new("fgamma", "TMath::GammaDist(x, [0], [1], [2])", 0, 10);
$fgamma->SetParameters(0.5, 0, 1);
my $f1 = $fgamma->DrawCopy();
$f1->SetMinimum(1e-5);
$f1->SetLineColor(kRed);
$fgamma->SetParameters(1, 0, 1);
my $f2 = $fgamma->DrawCopy("same");
$f2->SetLineColor(kGreen);
$fgamma->SetParameters(2, 0, 1);
my $f3 = $fgamma->DrawCopy("same");
$f3->SetLineColor(kBlue);
$fgamma->SetParameters(5, 0, 1);
my $f4 = $fgamma->DrawCopy("same");
$f4->SetLineColor(kMagenta);
my $legend1 = TLegend->new(.2,.15,.5,.4);
$legend1->AddEntry($f1,"gamma = 0.5 mu = 0 beta = 1","l");
$legend1->AddEntry($f2,"gamma = 1 mu = 0 beta = 1","l");
$legend1->AddEntry($f3,"gamma = 2 mu = 0 beta = 1","l");
$legend1->AddEntry($f4,"gamma = 5 mu = 0 beta = 1","l");
$legend1->Draw();
# TMath::LogNormal
my $pad2 = $myc->cd(2);
$pad2->SetLogy();
$pad2->SetGrid();
my $flog = TF1->new("flog", "TMath::LogNormal(x, [0], [1], [2])", 0, 5);
$flog->SetParameters(0.5, 0, 1);
my $g1 = $flog->DrawCopy();
$g1->SetLineColor(kRed);
$flog->SetParameters(1, 0, 1);
my $g2 = $flog->DrawCopy("same");
$g2->SetLineColor(kGreen);
$flog->SetParameters(2, 0, 1);
my $g3 = $flog->DrawCopy("same");
$g3->SetLineColor(kBlue);
$flog->SetParameters(5, 0, 1);
my $g4 = $flog->DrawCopy("same");
$g4->SetLineColor(kMagenta);
my $legend2 = TLegend->new(.2,.15,.5,.4);
$legend2->AddEntry($g1,"sigma = 0.5 theta = 0 m = 1","l");
$legend2->AddEntry($g2,"sigma = 1 theta = 0 m = 1","l");
$legend2->AddEntry($g3,"sigma = 2 theta = 0 m = 1","l");
$legend2->AddEntry($g4,"sigma = 5 theta = 0 m = 1","l");
$legend2->Draw();
$myc->Update();
$gApplication->Run;
mathLaplace.pl
use strict;
use warnings;
use SOOT ':all';
# Test the TMath::LaplaceDist and TMath::LaplaceDistI functions
# author: Anna Kreshuk
my $c1 = TCanvas->new("c1", "TMath::LaplaceDist",600,800);
$c1->Divide(1, 2);
my $pad1 = $c1->cd(1);
$pad1->SetGrid();
my $flaplace = TF1->new("flaplace", "TMath::LaplaceDist(x, [0], [1])", -10, 10);
$flaplace->SetParameters(0, 1);
my $f1 = $flaplace->DrawCopy();
$f1->SetLineColor(kRed);
$f1->SetLineWidth(1);
$flaplace->SetParameters(0, 2);
my $f2 = $flaplace->DrawCopy("same");
$f2->SetLineColor(kGreen);
$f2->SetLineWidth(1);
$flaplace->SetParameters(2, 1);
my $f3 = $flaplace->DrawCopy("same");
$f3->SetLineColor(kBlue);
$f3->SetLineWidth(1);
$flaplace->SetParameters(2, 2);
my $f4 = $flaplace->DrawCopy("same");
$f4->SetLineColor(kMagenta);
$f4->SetLineWidth(1);
my $legend1 = TLegend->new(.7,.7,.9,.9);
$legend1->AddEntry($f1,"alpha=0 beta=1","l");
$legend1->AddEntry($f2,"alpha=0 beta=2","l");
$legend1->AddEntry($f3,"alpha=2 beta=1","l");
$legend1->AddEntry($f4,"alpha=2 beta=2","l");
$legend1->Draw();
my $pad2 = $c1->cd(2);
$pad2->SetGrid();
my $flaplacei = TF1->new("flaplacei", "TMath::LaplaceDistI(x, [0], [1])", -10, 10);
$flaplacei->SetParameters(0, 1);
my $g1 = $flaplacei->DrawCopy();
$g1->SetLineColor(kRed);
$g1->SetLineWidth(1);
$flaplacei->SetParameters(0, 2);
my $g2 = $flaplacei->DrawCopy("same");
$g2->SetLineColor(kGreen);
$g2->SetLineWidth(1);
$flaplacei->SetParameters(2, 1);
my $g3 = $flaplacei->DrawCopy("same");
$g3->SetLineColor(kBlue);
$g3->SetLineWidth(1);
$flaplacei->SetParameters(2, 2);
my $g4 = $flaplacei->DrawCopy("same");
$g4->SetLineColor(kMagenta);
$g4->SetLineWidth(1);
my $legend2 = TLegend->new(.7,.15,0.9,.35);
$legend2->AddEntry($f1,"alpha=0 beta=1","l");
$legend2->AddEntry($f2,"alpha=0 beta=2","l");
$legend2->AddEntry($f3,"alpha=2 beta=1","l");
$legend2->AddEntry($f4,"alpha=2 beta=2","l");
$legend2->Draw();
$c1->cd();
$gApplication->Run;
mathStudent.pl
use strict;
use warnings;
use SOOT ':all';
my $DistCanvas = TCanvas->new("DistCanvas", "Distribution graphs", 10, 10, 1000, 800);
$DistCanvas->SetFillColor(17);
$DistCanvas->Divide(2, 2);
my $pad1 = $DistCanvas->cd(1);
$pad1->SetGrid();
$pad1->SetFrameFillColor(19);
my $leg = TLegend->new(0.6, 0.7, 0.89, 0.89);
my $fgaus = TF1->new("gaus", "TMath::Gaus(x, [0], [1], [2])", -5, 5);
$fgaus->SetTitle("Student density");
$fgaus->SetLineStyle(2);
$fgaus->SetLineWidth(1);
$fgaus->SetParameters(0, 1, 1);
$leg->AddEntry($fgaus->DrawCopy(), "Normal(0,1)", "l");
my $student = TF1->new("student", "TMath::Student(x,[0])", -5, 5);
$student->SetTitle("Student density");
$student->SetLineWidth(1);
$student->SetParameter(0, 10);
$student->SetLineColor(4);
$leg->AddEntry($student->DrawCopy("lsame"), "10 degrees of freedom", "l");
$student->SetParameter(0, 3);
$student->SetLineColor(2);
$leg->AddEntry($student->DrawCopy("lsame"), "3 degrees of freedom", "l");
$student->SetParameter(0, 1);
$student->SetLineColor(1);
$leg->AddEntry($student->DrawCopy("lsame"), "1 degree of freedom", "l");
$leg->Draw();
#drawing the set of student cumulative probability functions
my $pad2 = $DistCanvas->cd(2);
$pad2->SetFrameFillColor(19);
$pad2->SetGrid();
my $studentI = TF1->new("studentI", "TMath::StudentI(x, [0])", -5, 5);
$studentI->SetTitle("Student cumulative dist.");
$studentI->SetLineWidth(1);
my $leg2 = TLegend->new(0.6, 0.4, 0.89, 0.6);
$studentI->SetParameter(0, 10);
$studentI->SetLineColor(4);
$leg2->AddEntry($studentI->DrawCopy(), "10 degrees of freedom", "l");
$studentI->SetParameter(0, 3);
$studentI->SetLineColor(2);
$leg2->AddEntry($studentI->DrawCopy("lsame"), "3 degrees of freedom", "l");
$studentI->SetParameter(0, 1);
$studentI->SetLineColor(1);
$leg2->AddEntry($studentI->DrawCopy("lsame"), "1 degree of freedom", "l");
$leg2->Draw();
#drawing the set of F-dist. densities
my $fDist = TF1->new("fDist", "TMath::FDist(x, [0], [1])", 0, 2);
$fDist->SetTitle("F-Dist. density");
$fDist->SetLineWidth(1);
my $legF1 = TLegend->new(0.7, 0.7, 0.89, 0.89);
my $pad3 = $DistCanvas->cd(3);
$pad3->SetFrameFillColor(19);
$pad3->SetGrid();
$fDist->SetParameters(1, 1);
$fDist->SetLineColor(1);
$legF1->AddEntry($fDist->DrawCopy(), "N=1 M=1", "l");
$fDist->SetParameter(1, 10);
$fDist->SetLineColor(2);
$legF1->AddEntry($fDist->DrawCopy("lsame"), "N=1 M=10", "l");
$fDist->SetParameters(10, 1);
$fDist->SetLineColor(8);
$legF1->AddEntry($fDist->DrawCopy("lsame"), "N=10 M=1", "l");
$fDist->SetParameters(10, 10);
$fDist->SetLineColor(4);
$legF1->AddEntry($fDist->DrawCopy("lsame"), "N=10 M=10", "l");
$legF1->Draw();
# drawing the set of F cumulative dist.functions
my $fDistI = TF1->new("fDist", "TMath::FDistI(x, [0], [1])", 0, 2);
$fDistI->SetTitle("Cumulative dist. function for F");
$fDistI->SetLineWidth(1);
my $legF2 = TLegend->new(0.7, 0.3, 0.89, 0.5);
my $pad4 = $DistCanvas->cd(4);
$pad4->SetFrameFillColor(19);
$pad4->SetGrid();
$fDistI->SetParameters(1, 1);
$fDistI->SetLineColor(1);
$legF2->AddEntry($fDistI->DrawCopy(), "N=1 M=1", "l");
$fDistI->SetParameters(1, 10);
$fDistI->SetLineColor(2);
$legF2->AddEntry($fDistI->DrawCopy("lsame"), "N=1 M=10", "l");
$fDistI->SetParameters(10, 1);
$fDistI->SetLineColor(8);
$legF2->AddEntry($fDistI->DrawCopy("lsame"), "N=10 M=1", "l");
$fDistI->SetParameters(10, 10);
$fDistI->SetLineColor(4);
$legF2->AddEntry($fDistI->DrawCopy("lsame"), "N=10 M=10", "l");
$legF2->Draw();
$DistCanvas->Update();
$gApplication->Run;
mathcoreCDF.pl
use strict;
use SOOT ':all';
# Example macro describing how to use the different cumulative
# distribution functions in ROOT. The macro shows four of them with
# respect to their two variables. In order to run the macro type:
# FIXME doesn't work... didn't work in CINT either. Need to figure out MathCore better
$gSystem->Load("root/libMathCore");
my $f1a = TF2->new("f1a", "ROOT::Math::breitwigner_prob(x, y)", -10, 10, 0, 10);
my $f2a = TF2->new("f2a", "ROOT::Math::cauchy_quant(x,y)", 0, 20, 0,20);
my $f3a = TF2->new("f3a", "ROOT::Math::normal_quant(x,y)", -10, 10, 0, 5);
my $f4a = TF2->new("f4a", "ROOT::Math::exponential_prob(x,y)", 0, 10, 0, 5);
my $c1 = TCanvas->new("c1","c1",1000,750);
$c1->Divide(2,2);
$c1->cd(1);
$f1a->Draw("surf1");
$c1->cd(2);
$f2a->Draw("surf1");
$c1->cd(3);
$f3a->Draw("surf1");
$c1->cd(4);
$f4a->Draw("surf1");
$c1->Update;
$gApplication->Run;
mathcoreSpecFunc.pl
use strict;
use warnings;
use SOOT ':all';
# Example macro describing how to use the special mathematical functions
# taking full advantage of the precision and speed of the C99 compliant
# environments. To execute the macro type in:
#
# root[0]: .x mathcoreSpecFunc.C
#
# It will create two canvases:
#
# a) one with the representation of the tgamma, lgamma, erf and erfc functions
# b) one with the relative difference between the old ROOT versions and the
# C99 implementation (on obsolete platform+compiler combinations which are
# not C99 compliant it will call the original ROOT implementations, hence
# the difference will be 0)
#
# The naming and numbering of the functions is taken from
# <A HREF="http:#www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1687.pdf">
# Matt Austern,
# (Draft) Technical Report on Standard Library Extensions,
# N1687=04-0127, September 10, 2004</A>
#
# Author: Andras Zsenei
$gSystem->Load("libMathCore");
my $f1a = TF1->new("f1a","ROOT::Math::tgamma(x)",0,100);
my $f1b = TF1->new("f1b","TMath::Abs((ROOT::Math::tgamma(x)-TMath::Gamma(x))/ROOT::Math::tgamma(x))",0,100);
my $f2a = TF1->new("f2a","ROOT::Math::lgamma(x)",0,100);
my $f2b = TF1->new("f2b","TMath::Abs((ROOT::Math::lgamma(x)-TMath::LnGamma(x))/ROOT::Math::lgamma(x))",0,100);
my $f3a = TF1->new("f3a","ROOT::Math::erf(x)",0,5);
my $f3b = TF1->new("f3b","TMath::Abs((ROOT::Math::erf(x)-TMath::Erf(x))/ROOT::Math::erf(x))",0,5);
my $f4a = TF1->new("f4a","ROOT::Math::erfc(x)",0,5);
my $f4b = TF1->new("f4b","TMath::Abs((ROOT::Math::erfc(x)-TMath::Erfc(x))/ROOT::Math::erfc(x))",0,5);
my $c1 = TCanvas->new("c1","c1",1000,750);
$c1->Divide(2,2);
$c1->cd(1);
$f1a->Draw();
$c1->cd(2);
$f2a->Draw();
$c1->cd(3);
$f3a->Draw();
$c1->cd(4);
$f4a->Draw();
my $c2 = TCanvas->new("c2","c2",1000,750);
$c2->Divide(2,2);
$c2->cd(1);
$f1b->Draw();
$c2->cd(2);
$f2b->Draw();
$c2->cd(3);
$f3b->Draw();
$c2->cd(4);
$f4b->Draw();
$gApplication->Run;
mathcoreStatFunc.pl
use strict;
use warnings;
use SOOT ':all';
# Example macro describing how to use the different probability
# density functions in ROOT. The macro shows four of them with
# respect to their two variables. In order to run the macro type:
#
# Author: Andras Zsenei
$gSystem->Load("libMathCore");
my $f1a = TF2->new("f1a","ROOT::Math::cauchy_pdf(x, y)",0,10,0,10);
my $f2a = TF2->new("f2a","ROOT::Math::chisquared_pdf(x,y)",0,20, 0,20);
my $f3a = TF2->new("f3a","ROOT::Math::gaussian_pdf(x,y)",0,10,0,5);
my $f4a = TF2->new("f4a","ROOT::Math::tdistribution_pdf(x,y)",0,10,0,5);
my $c1 = TCanvas->new("c1","c1",1000,750);
$c1->Divide(2,2);
$c1->cd(1);
$f1a->Draw("surf1");
$c1->cd(2);
$f2a->Draw("surf1");
$c1->cd(3);
$f3a->Draw("surf1");
$c1->cd(4);
$f4a->Draw("surf1");
$gApplication->Run;
principal.pl
use strict;
use warnings;
use SOOT ':all';
# Principal Components Analysis (PCA) example
#
# Example of using TPrincipal as a stand alone class.
#
# We create n-dimensional data points, where c = trunc(n / 5) + 1
# are correlated with the rest n - c randomly distributed variables.
#
my $n = shift || 10;
my $m = shift || 10000;
my $c = $n / 5 + 1;
printf "*************************************************\n";
printf "* Principal Component Analysis *\n";
printf "* *\n";
printf "* Number of variables: %8d *\n", $n;
printf "* Number of data points: %8d *\n", $m;
printf "* Number of dependent variables: %4d *\n", $c;
printf "* *\n";
printf "*************************************************\n";
# Initilase the TPrincipal object. Use the empty string for the
# final argument, if you don't wan't the covariance
# matrix. Normalising the covariance matrix is a good idea if your
# variables have different orders of magnitude.
my $principal = TPrincipal->new($n,"N");
# Use a pseudo-random number generator
my $random = TRandom->new;
# Make the m data-points
# Make a variable to hold our data
# Allocate memory for the data point
my $data = [];
for my $i (0..$m-1) {
# First we create the un-correlated, random variables, according
# to one of three distributions
for my $j (0..($n-$c-1)) {
if ($j % 3 == 0) {
$data->[$j] = $random->Gaus(5,1);
}
elsif ($j % 3 == 1) {
$data->[$j] = $random->Poisson(8);
}
else {
$data->[$j] = $random->Exp(2);
}
}
# Then we create the correlated variables
for my $j (0..$c-1) {
$data->[$n - $c + $j] = 0;
for my $k (0..($n-$c-$j-1)) {
$data->[$n - $c + $j] += $data->[$k];
}
}
# Finally we're ready to add this datapoint to the PCA
$principal->AddRow($data);
}
# Do the actual analysis
$principal->MakePrincipals();
# Print out the result on
$principal->Print();
# Test the PCA
$principal->Test();
# Make some histograms of the orginal, principal, residue, etc data
$principal->MakeHistograms();
# Make two functions to map between feature and pattern space
$principal->MakeCode();
# Start a browser, so that we may browse the histograms generated
# above
my $b = TBrowser->new("principalBrowser", $principal);
$gApplication->Run;
rolke.pl
use strict;
use warnings;
use SOOT ':all';
my $bm = 0.0;
my $tau = 2.5;
my $mid = 1;
my $m = 100;
my $z = 50;
my $y = 10;
my $x = 5;
# Initialize parameters not used.
my $e = 0.0;
my $em = 0.0;
my $sde=0.0;
my $sdb=0.0;
my $b = 0.0;
my $g = TRolke->new();
$g->SetCL(0.90);
my $ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
my $ll = $g->GetLowerLimit();
print "Assuming MODEL 1\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
$tau = 2.5;
$mid = 2;
$y = 3;
$x = 10;
$em=0.9;
$sde=0.05;
$g->SetCL(0.95);
$ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
$ll = $g->GetLowerLimit();
print "Assuming MODEL 2\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
$mid = 3;
$bm = 5.0;
$x = 10;
$em = 0.9;
$sde=0.05;
$sdb=0.5;
$g->SetCL(0.99);
$ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
$ll = $g->GetLowerLimit();
print "Assuming MODEL 3\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
$tau = 5;
$mid = 4;
$y = 7;
$x = 1;
$e = 0.25;
$g->SetCL(0.68);
$ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
$ll = $g->GetLowerLimit();
print "Assuming MODEL 4\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
$mid = 5;
$bm = 0.0;
$x = 1;
$e = 0.65;
$sdb=1.0;
$g->SetCL(0.80);
$ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
$ll = $g->GetLowerLimit();
print "Assuming MODEL 5\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
$y = 1;
$mid = 6;
$m = 750;
$z = 500;
$x = 25;
$b = 10.0;
$g->SetCL(0.90);
$ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
$ll = $g->GetLowerLimit();
print "Assuming MODEL 6\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
$mid = 7;
$x = 15;
$em = 0.77;
$sde=0.15;
$b = 10.0;
$g->SetCL(0.95);
$ul = $g->CalculateInterval($x,$y,$z,$bm,$em,$e,$mid,$sde,$sdb,$tau,$b,$m);
$ll = $g->GetLowerLimit();
print "Assuming MODEL 7\n";
print "the Profile Likelihood interval is :\n";
print "[", $ll, ",", $ul, "]\n";
vavilov.pl
use strict;
use warnings;
use SOOT ':all';
#test of the TMath::Vavilov distribution
use constant n => 1000;
my $x = [];
my $y1 = [];
my $y2 = [];
my $y3 = [];
my $y4 = [];
my $r = TRandom->new();
for my $i (0..n-1) {
my $rv = $r->Uniform(-2, 10);
push @$x, $rv;
push @$y1, TMath::Vavilov($x->[$i], 0.30, 0.5);
push @$y2, TMath::Vavilov($x->[$i], 0.15, 0.5);
push @$y3, TMath::Vavilov($x->[$i], 0.25, 0.5);
push @$y4, TMath::Vavilov($x->[$i], 0.05, 0.5);
}
my $c1 = TCanvas->new("c1", "Vavilov density");
$c1->SetGrid();
$c1->SetHighLightColor(19);
my $gr1 = TGraph->new(n, $x, $y1);
my $gr2 = TGraph->new(n, $x, $y2);
my $gr3 = TGraph->new(n, $x, $y3);
my $gr4 = TGraph->new(n, $x, $y4);
$gr1->SetTitle("TMath::Vavilov density");
$gr1->Draw("ap");
$gr2->Draw("psame");
$gr2->SetMarkerColor(kRed);
$gr3->Draw("psame");
$gr3->SetMarkerColor(kBlue);
$gr4->Draw("psame");
$gr4->SetMarkerColor(kGreen);
$gApplication->Run;
SEE ALSO
AUTHOR
Steffen Mueller, <smueller@cpan.org>
COPYRIGHT AND LICENSE
Copyright (C) 2010 by Steffen Mueller
SOOT, the Perl-ROOT wrapper, is free software; you can redistribute it and/or modify it under the same terms as ROOT itself, that is, the GNU Lesser General Public License. A copy of the full license text is available from the distribution as the LICENSE file.