From e86b424179d0e34a4411b96d64a73fd7592d2672 Mon Sep 17 00:00:00 2001
From: Lorenzo Moneta <Lorenzo.Moneta@cern.ch>
Date: Fri, 20 Jun 2008 15:40:26 +0000
Subject: [PATCH] - implement in the Profile the existing option G to get the
 bin error in the case of combination of measurements y     with gaussian
 error dy. In this case the profile must be filled   with a weight = 1./dy**2
 and the correct error from the combination (1./sqrt(Sum(1./dy**2) ) ) will be
 obtained.    This option was requested by Yuri Fisyak.

git-svn-id: http://root.cern.ch/svn/root/trunk@24431 27541ba8-7e3a-0410-8455-c3a389f83636
---
 hist/hist/src/TProfile.cxx | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/hist/hist/src/TProfile.cxx b/hist/hist/src/TProfile.cxx
index 8b6cab9c89e..19e8e6290dd 100644
--- a/hist/hist/src/TProfile.cxx
+++ b/hist/hist/src/TProfile.cxx
@@ -210,15 +210,17 @@ void TProfile::BuildOptions(Double_t ymin, Double_t ymax, Option_t *option)
 //    uncertainty is +-0.5, with the assumption that the probability that Y
 //    takes any value between Y-0.5 and Y+0.5 is uniform (the same argument
 //    goes for Y uniformly distributed between Y and Y+1); this would be
-//    useful if Y is an ADC measurement, for example. Other, fancier options
+//    useful if Y is an ADC measurement, for example. 
+//     Other, fancier options
 //    would be possible, at the cost of adding one more parameter to the PROFILE
 //    command. For example, if all Y variables are distributed according to some
-//    known Gaussian of standard deviation Sigma, then:
-//     'G'            Errors are Spread/SQRT(N) for Spread.ne.0. ,
-//                      "     "  Sigma/SQRT(N) for Spread.eq.0,N.gt.0 ,
-//                      "     "  0.  for N.eq.0
+//    known Gaussian of standard deviation Sigma (which can be different for each measurement), 
+//    and the profile has been filled  with a weight equal to 1/Sigma**2, 
+//    then one cam use the following option: 
+// 
+//     'G'            Errors are 1./SQRT(Sum(1/sigma**2)) 
 //    For example, this would be useful when all Y's are experimental quantities
-//    measured with the same instrument with precision Sigma.
+//    measured with different precision Sigma_Y.
 //
 //
 
@@ -925,7 +927,8 @@ Double_t TProfile::GetBinError(Int_t bin) const
       return 1/TMath::Sqrt(12*sum);
    }
    else if (fErrorMode == kERRORSPREADG) {
-      return eprim/TMath::Sqrt(sum);
+      // it is supposed the values y are gaussian distributed y +/- dy
+      return 1./TMath::Sqrt(sum);
    }
    else return eprim;
 }
@@ -1438,10 +1441,8 @@ TH1D *TProfile::ProjectionX(const char *name, Option_t *option) const
 //       product of the bin content of the profile and the entries. 
 //       With this option the returned histogram will be equivalent to the one obtained by 
 //       filling directly a TH1D using the 2-nd value as a weight. 
-//       This option makes sense only for profile filled with all weights =1. 
-//       When the profile is weighted (filled with weights different than 1) the  
-//       bin error of the projected histogram (obtained using this option "W") cannot be 
-//       correctly computed from the information stored in the profile. 
+//       This makes sense only for profile filled with weights =1. If not, the error of the 
+//        projected histogram obtained with this option will not be correct.
 
 
    TString opt = option;
@@ -1487,7 +1488,7 @@ TH1D *TProfile::ProjectionX(const char *name, Option_t *option) const
       // if option E projected histogram errors are same as profile
       if (computeErrors ) h1->SetBinError(bin , GetBinError(bin) );
       // in case of option W bin error is deduced from bin sum of z**2 values of profile
-      // this is correct only if the profile is unweighted 
+      // this is correct only if the profile was filled with weights = 1. 
       if (binWeight)      h1->SetBinError(bin , TMath::Sqrt(fSumw2.fArray[bin] ) );
 
    }
@@ -1850,6 +1851,12 @@ void TProfile::SetErrorOption(Option_t *option)
 //     'i'            Errors are Spread/SQRT(N) for Spread.ne.0. ,
 //                      "     "  1./SQRT(12.*N) for Spread.eq.0,N.gt.0 ,
 //                      "     "  0.  for N.eq.0
+//     'g'            Errors are 1./SQRT(W) for Spread.ne.0. , 
+//                      "     "  0.  for N.eq.0
+//                    W is the sum of wights of the profile. 
+//                    This option is for measurements y +/ dy and  the profile is filled with 
+//                    weights w = 1/dy**2
+//
 //   See TProfile::BuildOptions for explanation of all options
 
    TString opt = option;
-- 
GitLab