54 const TH2* h1 =
dynamic_cast<const TH2*
>(o1);
55 const TH2* h2 =
dynamic_cast<const TH2*
>(o2);
57 if (h1 == NULL || h2 == NULL) {
61 const int n1x = h1->GetNbinsX();
62 const int n2x = h2->GetNbinsX();
63 const int n1y = h1->GetNbinsY();
64 const int n2y = h2->GetNbinsY();
66 if(n1x != n2x || n1y != n2y)
67 THROW(
JValueOutOfRange,
"JTestKolmogorov_2D::test(): Histograms with different bining. The objects: " <<
68 h1->GetName() <<
" and " << h2->GetName() <<
" can not be compared." << endl);
70 if(h1->Integral() == 0 || h2->Integral() == 0) {
72 h1->GetName() <<
" and " << h2->GetName() <<
" can not be compared." << endl);
75 const double s1 = 1./h1->Integral();
76 const double s2 = 1./h2->Integral();
78 TH2* h3 = (TH2*) h1->Clone(h1->GetName() == h2->GetName() ?
82 double ew1, ew2, w1 = 0, w2 = 0;
84 for (
int i = 1; i <= n1x; ++i) {
85 for (
int j = 1; j <= n1y; ++j) {
86 ew1 = h1->GetBinError(i,j);
87 ew2 = h2->GetBinError(i,j);
96 double esum1 = 0, esum2 = 0;
110 if (afunc2 && afunc1) {
114 double c1 = 0, c2 = 0;
118 for (
int i=1 ; i<=n1x ; ++i){
119 for (
int j=1 ; j<=n1y ; ++j){
121 c1 += s1*h1->GetBinContent(i,j);
122 c2 += s2*h2->GetBinContent(i,j);
124 double d = TMath::Abs(
c1-c2)*TMath::Sqrt(esum1*esum2/(esum1+esum2));
126 dmax1 = TMath::Max(dmax1,TMath::Abs(
c1-c2));
136 for (
int j=1 ; j<=n1y ; ++j){
137 for (
int i=1 ; i<=n1x ; ++i){
139 c1 += s1*h1->GetBinContent(i,j);
140 c2 += s2*h2->GetBinContent(i,j);
142 double d = TMath::Abs(
c1-c2)*TMath::Sqrt(esum1*esum2/(esum1+esum2));
144 dmax2 = TMath::Max(dmax2,TMath::Abs(
c1-c2));
150 double dmax = 0.5*(dmax1+dmax2);
155 z = dmax*TMath::Sqrt(esum2);
157 z = dmax*TMath::Sqrt(esum1);
159 z = dmax*TMath::Sqrt(esum1*esum2/(esum1+esum2));
162 const double pValue = TMath::KolmogorovProb(z);
164 for (
int i=1 ; i<=n1x ; ++i) {
165 for (
int j=1 ; j<=n1y ; ++j) {
166 h3->SetBinContent(i,j,TMath::KolmogorovProb(0.5 * h3->GetBinContent(i,j)));
170 const bool passed = (pValue >
threshold);
174 h3->SetTitle(title.
getTitle().c_str());