rootpy solution to: Scaling trouble with TProfile adding weighted MC samples

22 views
Skip to first unread message

Sebastian Schmitt

unread,
Jun 28, 2013, 8:42:07 AM6/28/13
to rootpy...@googlegroups.com
Hi!

Do you have an idea how to tackle the issue presented in

http://root.cern.ch/phpBB3/viewtopic.php?f=3&t=16628

(and pasted below) with rootpy?

Best,

Sebastian

----

I have some trouble when adding TProfiles from MC samples that need
weights. Please find below a mock-up that demonstrates my problems. The
full application is adding MC samples normalized to luminosity.

Let's say I have two samples with the same physics "normalization".
Sample 1 has only 1/10th of the statistics of sample 2 -> I have to
scale sample 2 down by a factor 10 before I can add histograms. But for
TProfiles I can't call Scale because it doesn't represent counts but the
mean value of some distribution. To get the correct result I need to
call Add with a weight of 1/10.

The problem I have with this is that I need two pretty different
approaches to do the same task, i.e. I can't just first scale all
histograms and profiles of the samples separately and then hadd them.

Do you have any idea how to unify my workflow?

Best,

Sebastian

{

TRandom* gRandom = new TRandom3(0);

TH1D* h1 = new TH1D("h1","h1",100,-5,5); h1.Sumw2();
TH1D* h2 = new TH1D("h2","h2",100,-5,5); h2.Sumw2();

TProfile* p1 = new TProfile("p1","p1", 10, 0, 1); p1.Sumw2();
TProfile* p2 = new TProfile("p2","p2", 10, 0, 1); p2.Sumw2();

for(UInt_t n=0; n != 10000; ++n) {

const Double_t ran = gRandom->Gaus(0,2);
const Double_t ran2 = gRandom->Uniform();

if(ran >= 0) {

// sample 1 has only 1/10th of the statistics of sample 2
if(n % 10 == 0) {
h1->Fill(ran);
p1->Fill(ran2, 1);
}

} else {

h2->Fill(ran);
p2->Fill(ran2, 2);

}

}

TCanvas* c = new TCanvas("c","c",800,400);
c->Divide(2);

// histogram

c.cd(1);

h2->Scale(1/10.);

h2->Draw("");
h1->Draw("same");

hcomb = (TH1D*)h1->Clone();
hcomb->Add(h2);
hcomb->Draw("histsame");

// profile

c.cd(2);

//p2->Scale(1/10.); // wrong

p1->Draw();
p2->Draw("same");

pcomb = (TProfile*)p1->Clone();

//pcomb->Add(p2); // wrong
pcomb->Add(p2, 1/10.); // correct

pcomb->Draw("histsame");

}
Reply all
Reply to author
Forward
0 new messages