void test() { TH2D *h2 = new TH2D("h2", "", 30, 0, 600, 50, 0, 500); h2->Sumw2(); for (int _ = 0; _ < 10000; _++) { h2->Fill(gRandom->Gaus(200, 50), gRandom->Gaus(60, 30)); } h2->Scale(1. / 100000); TProfile *hp = h2->ProfileX(); cout << "bin2 error from tprofile: " << hp->GetBinError(2) << endl; TH1D *h1 = new TH1D("hh1", "hh1", 30, 0, 600); for (int i = 0; i < h2->GetNbinsX(); i++) { double sum = 0.; double averagey = 0.; double averagey2 = 0.; for (int j = 0; j < h2->GetNbinsY(); j++) { sum += h2->GetBinContent(i + 1, j + 1); double y = h2->GetYaxis()->GetBinCenter(j + 1); averagey += y * h2->GetBinContent(i + 1, j + 1); averagey2 += pow(y, 2.) * h2->GetBinContent(i + 1, j + 1); } if (sum > 0.0) { averagey /= sum; averagey2 /= sum; double error = (averagey2 - pow(averagey, 2.)) / sum; error = TMath::Sqrt(error); h1->SetBinContent(i + 1, averagey); h1->SetBinError(i + 1, error); cout << "bin " << i + 1 << "\t" << error << "\t" << error / TMath::Sqrt(100000) << endl; } } }