Hi!
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");
}